@rio-cloud/cdk-v2-constructs 8.0.7 → 8.1.0-alpha.1

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
@@ -628,6 +628,19 @@
628
628
  }
629
629
  }
630
630
  },
631
+ "aws-cdk-lib.aws_awsexternalanthropic": {
632
+ "targets": {
633
+ "dotnet": {
634
+ "namespace": "Amazon.CDK.AWS.AWSExternalAnthropic"
635
+ },
636
+ "java": {
637
+ "package": "software.amazon.awscdk.services.awsexternalanthropic"
638
+ },
639
+ "python": {
640
+ "module": "aws_cdk.aws_awsexternalanthropic"
641
+ }
642
+ }
643
+ },
631
644
  "aws-cdk-lib.aws_b2bi": {
632
645
  "targets": {
633
646
  "dotnet": {
@@ -4805,6 +4818,22 @@
4805
4818
  }
4806
4819
  }
4807
4820
  },
4821
+ "aws-cdk-lib.interfaces.aws_awsexternalanthropic": {
4822
+ "targets": {
4823
+ "dotnet": {
4824
+ "namespace": "Amazon.CDK.Interfaces.AWSExternalAnthropic"
4825
+ },
4826
+ "go": {
4827
+ "packageName": "interfacesawsawsexternalanthropic"
4828
+ },
4829
+ "java": {
4830
+ "package": "software.amazon.awscdk.interfaces.awsexternalanthropic"
4831
+ },
4832
+ "python": {
4833
+ "module": "aws_cdk.interfaces.aws_awsexternalanthropic"
4834
+ }
4835
+ }
4836
+ },
4808
4837
  "aws-cdk-lib.interfaces.aws_b2bi": {
4809
4838
  "targets": {
4810
4839
  "dotnet": {
@@ -9948,7 +9977,7 @@
9948
9977
  "kind": "interface",
9949
9978
  "locationInModule": {
9950
9979
  "filename": "src/ses/ses-observability.ts",
9951
- "line": 27
9980
+ "line": 61
9952
9981
  },
9953
9982
  "name": "BounceThresholdsProps",
9954
9983
  "properties": [
@@ -9960,7 +9989,7 @@
9960
9989
  "immutable": true,
9961
9990
  "locationInModule": {
9962
9991
  "filename": "src/ses/ses-observability.ts",
9963
- "line": 29
9992
+ "line": 63
9964
9993
  },
9965
9994
  "name": "critical",
9966
9995
  "optional": true,
@@ -9976,7 +10005,7 @@
9976
10005
  "immutable": true,
9977
10006
  "locationInModule": {
9978
10007
  "filename": "src/ses/ses-observability.ts",
9979
- "line": 28
10008
+ "line": 62
9980
10009
  },
9981
10010
  "name": "warning",
9982
10011
  "optional": true,
@@ -10365,7 +10394,7 @@
10365
10394
  "kind": "interface",
10366
10395
  "locationInModule": {
10367
10396
  "filename": "src/ses/ses-observability.ts",
10368
- "line": 32
10397
+ "line": 66
10369
10398
  },
10370
10399
  "name": "ComplaintThresholdsProps",
10371
10400
  "properties": [
@@ -10377,7 +10406,7 @@
10377
10406
  "immutable": true,
10378
10407
  "locationInModule": {
10379
10408
  "filename": "src/ses/ses-observability.ts",
10380
- "line": 34
10409
+ "line": 68
10381
10410
  },
10382
10411
  "name": "critical",
10383
10412
  "optional": true,
@@ -10393,7 +10422,7 @@
10393
10422
  "immutable": true,
10394
10423
  "locationInModule": {
10395
10424
  "filename": "src/ses/ses-observability.ts",
10396
- "line": 33
10425
+ "line": 67
10397
10426
  },
10398
10427
  "name": "warning",
10399
10428
  "optional": true,
@@ -17692,7 +17721,7 @@
17692
17721
  },
17693
17722
  "locationInModule": {
17694
17723
  "filename": "src/ses/ses-observability.ts",
17695
- "line": 129
17724
+ "line": 170
17696
17725
  },
17697
17726
  "parameters": [
17698
17727
  {
@@ -17718,7 +17747,7 @@
17718
17747
  "kind": "class",
17719
17748
  "locationInModule": {
17720
17749
  "filename": "src/ses/ses-observability.ts",
17721
- "line": 122
17750
+ "line": 163
17722
17751
  },
17723
17752
  "name": "SesObservability",
17724
17753
  "properties": [
@@ -17730,7 +17759,7 @@
17730
17759
  "immutable": true,
17731
17760
  "locationInModule": {
17732
17761
  "filename": "src/ses/ses-observability.ts",
17733
- "line": 124
17762
+ "line": 165
17734
17763
  },
17735
17764
  "name": "CONFIGURATION_SET_NAME_SSM_PARAMETER",
17736
17765
  "static": true,
@@ -17746,7 +17775,7 @@
17746
17775
  "immutable": true,
17747
17776
  "locationInModule": {
17748
17777
  "filename": "src/ses/ses-observability.ts",
17749
- "line": 125
17778
+ "line": 166
17750
17779
  },
17751
17780
  "name": "SNS_TOPIC_ARN_EXPORT_NAME",
17752
17781
  "static": true,
@@ -17761,7 +17790,7 @@
17761
17790
  "immutable": true,
17762
17791
  "locationInModule": {
17763
17792
  "filename": "src/ses/ses-observability.ts",
17764
- "line": 127
17793
+ "line": 168
17765
17794
  },
17766
17795
  "name": "configurationSet",
17767
17796
  "type": {
@@ -17775,7 +17804,7 @@
17775
17804
  "immutable": true,
17776
17805
  "locationInModule": {
17777
17806
  "filename": "src/ses/ses-observability.ts",
17778
- "line": 126
17807
+ "line": 167
17779
17808
  },
17780
17809
  "name": "snsTopic",
17781
17810
  "type": {
@@ -17795,7 +17824,7 @@
17795
17824
  "kind": "interface",
17796
17825
  "locationInModule": {
17797
17826
  "filename": "src/ses/ses-observability.ts",
17798
- "line": 37
17827
+ "line": 71
17799
17828
  },
17800
17829
  "name": "SesObservabilityProps",
17801
17830
  "properties": [
@@ -17810,7 +17839,7 @@
17810
17839
  "immutable": true,
17811
17840
  "locationInModule": {
17812
17841
  "filename": "src/ses/ses-observability.ts",
17813
- "line": 53
17842
+ "line": 87
17814
17843
  },
17815
17844
  "name": "bounceThresholds",
17816
17845
  "optional": true,
@@ -17829,7 +17858,7 @@
17829
17858
  "immutable": true,
17830
17859
  "locationInModule": {
17831
17860
  "filename": "src/ses/ses-observability.ts",
17832
- "line": 63
17861
+ "line": 97
17833
17862
  },
17834
17863
  "name": "complaintThresholds",
17835
17864
  "optional": true,
@@ -17837,6 +17866,24 @@
17837
17866
  "fqn": "@rio-cloud/cdk-v2-constructs.ses.ComplaintThresholdsProps"
17838
17867
  }
17839
17868
  },
17869
+ {
17870
+ "abstract": true,
17871
+ "docs": {
17872
+ "default": "false",
17873
+ "stability": "stable",
17874
+ "summary": "Enable this if you want the Datadog monitors to create cases in Datadog when an alert is triggered."
17875
+ },
17876
+ "immutable": true,
17877
+ "locationInModule": {
17878
+ "filename": "src/ses/ses-observability.ts",
17879
+ "line": 104
17880
+ },
17881
+ "name": "createCasesFromMonitors",
17882
+ "optional": true,
17883
+ "type": {
17884
+ "primitive": "boolean"
17885
+ }
17886
+ },
17840
17887
  {
17841
17888
  "abstract": true,
17842
17889
  "docs": {
@@ -17847,7 +17894,7 @@
17847
17894
  "immutable": true,
17848
17895
  "locationInModule": {
17849
17896
  "filename": "src/ses/ses-observability.ts",
17850
- "line": 43
17897
+ "line": 77
17851
17898
  },
17852
17899
  "name": "loggedSesEvents",
17853
17900
  "optional": true,
@@ -27528,7 +27575,7 @@
27528
27575
  "kind": "interface",
27529
27576
  "locationInModule": {
27530
27577
  "filename": "src/ses/ses-observability.ts",
27531
- "line": 27
27578
+ "line": 61
27532
27579
  },
27533
27580
  "name": "BounceThresholdsProps",
27534
27581
  "namespace": "ses",
@@ -27541,7 +27588,7 @@
27541
27588
  "immutable": true,
27542
27589
  "locationInModule": {
27543
27590
  "filename": "src/ses/ses-observability.ts",
27544
- "line": 29
27591
+ "line": 63
27545
27592
  },
27546
27593
  "name": "critical",
27547
27594
  "optional": true,
@@ -27557,7 +27604,7 @@
27557
27604
  "immutable": true,
27558
27605
  "locationInModule": {
27559
27606
  "filename": "src/ses/ses-observability.ts",
27560
- "line": 28
27607
+ "line": 62
27561
27608
  },
27562
27609
  "name": "warning",
27563
27610
  "optional": true,
@@ -27578,7 +27625,7 @@
27578
27625
  "kind": "interface",
27579
27626
  "locationInModule": {
27580
27627
  "filename": "src/ses/ses-observability.ts",
27581
- "line": 32
27628
+ "line": 66
27582
27629
  },
27583
27630
  "name": "ComplaintThresholdsProps",
27584
27631
  "namespace": "ses",
@@ -27591,7 +27638,7 @@
27591
27638
  "immutable": true,
27592
27639
  "locationInModule": {
27593
27640
  "filename": "src/ses/ses-observability.ts",
27594
- "line": 34
27641
+ "line": 68
27595
27642
  },
27596
27643
  "name": "critical",
27597
27644
  "optional": true,
@@ -27607,7 +27654,7 @@
27607
27654
  "immutable": true,
27608
27655
  "locationInModule": {
27609
27656
  "filename": "src/ses/ses-observability.ts",
27610
- "line": 33
27657
+ "line": 67
27611
27658
  },
27612
27659
  "name": "warning",
27613
27660
  "optional": true,
@@ -27633,7 +27680,7 @@
27633
27680
  },
27634
27681
  "locationInModule": {
27635
27682
  "filename": "src/ses/ses-observability.ts",
27636
- "line": 129
27683
+ "line": 170
27637
27684
  },
27638
27685
  "parameters": [
27639
27686
  {
@@ -27659,7 +27706,7 @@
27659
27706
  "kind": "class",
27660
27707
  "locationInModule": {
27661
27708
  "filename": "src/ses/ses-observability.ts",
27662
- "line": 122
27709
+ "line": 163
27663
27710
  },
27664
27711
  "name": "SesObservability",
27665
27712
  "namespace": "ses",
@@ -27672,7 +27719,7 @@
27672
27719
  "immutable": true,
27673
27720
  "locationInModule": {
27674
27721
  "filename": "src/ses/ses-observability.ts",
27675
- "line": 124
27722
+ "line": 165
27676
27723
  },
27677
27724
  "name": "CONFIGURATION_SET_NAME_SSM_PARAMETER",
27678
27725
  "static": true,
@@ -27688,7 +27735,7 @@
27688
27735
  "immutable": true,
27689
27736
  "locationInModule": {
27690
27737
  "filename": "src/ses/ses-observability.ts",
27691
- "line": 125
27738
+ "line": 166
27692
27739
  },
27693
27740
  "name": "SNS_TOPIC_ARN_EXPORT_NAME",
27694
27741
  "static": true,
@@ -27703,7 +27750,7 @@
27703
27750
  "immutable": true,
27704
27751
  "locationInModule": {
27705
27752
  "filename": "src/ses/ses-observability.ts",
27706
- "line": 127
27753
+ "line": 168
27707
27754
  },
27708
27755
  "name": "configurationSet",
27709
27756
  "type": {
@@ -27717,7 +27764,7 @@
27717
27764
  "immutable": true,
27718
27765
  "locationInModule": {
27719
27766
  "filename": "src/ses/ses-observability.ts",
27720
- "line": 126
27767
+ "line": 167
27721
27768
  },
27722
27769
  "name": "snsTopic",
27723
27770
  "type": {
@@ -27737,7 +27784,7 @@
27737
27784
  "kind": "interface",
27738
27785
  "locationInModule": {
27739
27786
  "filename": "src/ses/ses-observability.ts",
27740
- "line": 37
27787
+ "line": 71
27741
27788
  },
27742
27789
  "name": "SesObservabilityProps",
27743
27790
  "namespace": "ses",
@@ -27753,7 +27800,7 @@
27753
27800
  "immutable": true,
27754
27801
  "locationInModule": {
27755
27802
  "filename": "src/ses/ses-observability.ts",
27756
- "line": 53
27803
+ "line": 87
27757
27804
  },
27758
27805
  "name": "bounceThresholds",
27759
27806
  "optional": true,
@@ -27772,7 +27819,7 @@
27772
27819
  "immutable": true,
27773
27820
  "locationInModule": {
27774
27821
  "filename": "src/ses/ses-observability.ts",
27775
- "line": 63
27822
+ "line": 97
27776
27823
  },
27777
27824
  "name": "complaintThresholds",
27778
27825
  "optional": true,
@@ -27780,6 +27827,24 @@
27780
27827
  "fqn": "@rio-cloud/cdk-v2-constructs.ses.ComplaintThresholdsProps"
27781
27828
  }
27782
27829
  },
27830
+ {
27831
+ "abstract": true,
27832
+ "docs": {
27833
+ "default": "false",
27834
+ "stability": "stable",
27835
+ "summary": "Enable this if you want the Datadog monitors to create cases in Datadog when an alert is triggered."
27836
+ },
27837
+ "immutable": true,
27838
+ "locationInModule": {
27839
+ "filename": "src/ses/ses-observability.ts",
27840
+ "line": 104
27841
+ },
27842
+ "name": "createCasesFromMonitors",
27843
+ "optional": true,
27844
+ "type": {
27845
+ "primitive": "boolean"
27846
+ }
27847
+ },
27783
27848
  {
27784
27849
  "abstract": true,
27785
27850
  "docs": {
@@ -27790,7 +27855,7 @@
27790
27855
  "immutable": true,
27791
27856
  "locationInModule": {
27792
27857
  "filename": "src/ses/ses-observability.ts",
27793
- "line": 43
27858
+ "line": 77
27794
27859
  },
27795
27860
  "name": "loggedSesEvents",
27796
27861
  "optional": true,
@@ -28197,5 +28262,5 @@
28197
28262
  }
28198
28263
  },
28199
28264
  "version": "0.0.0",
28200
- "fingerprint": "hbDZOai9HjnGNK9Ip80FgBBIobvC+ENC1lZjreHa6u0="
28265
+ "fingerprint": "WyxyZiIWba3mGohT5V4oPKpWIaG6r9i2kO+lPtn6jWs="
28201
28266
  }
@@ -34,6 +34,12 @@ export interface SesObservabilityProps {
34
34
  * @default { critical: 0.001, warning: 0.0008 }
35
35
  */
36
36
  readonly complaintThresholds?: ComplaintThresholdsProps;
37
+ /**
38
+ * Enable this if you want the Datadog monitors to create cases in Datadog when an alert is triggered.
39
+ *
40
+ * @defaultValue false
41
+ */
42
+ readonly createCasesFromMonitors?: boolean;
37
43
  }
38
44
  /**
39
45
  * RioSesObservability
@@ -25,6 +25,31 @@ const COMPLAINT_THRESHOLDS_DEFAULT = {
25
25
  critical: 0.001,
26
26
  warning: 0.0008,
27
27
  };
28
+ /**
29
+ * Sends a Slack notification for monitor alerts and recovery (no notification for monitor warnings).
30
+ * Also creates a Datadog case when createCase is set to true.
31
+ */
32
+ class SesMonitorNotification {
33
+ constructor(createDatadogCase) {
34
+ this.createDatadogCase = createDatadogCase;
35
+ this.slackNotification = new datadogv2_1.DefaultSlackNotification();
36
+ this.caseNotification = new datadogv2_1.DatadogCaseNotification();
37
+ }
38
+ generateMessageAnnotation(monitor) {
39
+ const slackHandle = this.slackNotification.generateMessageAnnotation(monitor);
40
+ const caseHandle = this.caseNotification.generateMessageAnnotation(monitor);
41
+ const alertHandles = [
42
+ slackHandle,
43
+ ...(this.createDatadogCase ? [caseHandle] : []),
44
+ ];
45
+ return [
46
+ '{{#is_alert}}',
47
+ ...alertHandles,
48
+ '{{/is_alert}}',
49
+ `{{#is_alert_recovery}}${slackHandle}{{/is_alert_recovery}}`,
50
+ ].join('\n');
51
+ }
52
+ }
28
53
  /**
29
54
  * RioSesObservability
30
55
  *
@@ -124,7 +149,7 @@ class SesObservability extends constructs_1.Construct {
124
149
  value: this.snsTopic.topicArn,
125
150
  exportName: SesObservability.SNS_TOPIC_ARN_EXPORT_NAME,
126
151
  });
127
- const notificationHandle = rio_landing_zone_1.RioLandingZone.getTeamAlertSlackChannelParameter(this).stringValue;
152
+ const monitorNotification = new SesMonitorNotification(props.createCasesFromMonitors ?? false);
128
153
  new datadogv2_1.DatadogMonitor(this, 'QuotaMonitor', {
129
154
  name: `${accountName} SES quota almost reached`,
130
155
  serviceName: 'aws-ses',
@@ -134,9 +159,6 @@ class SesObservability extends constructs_1.Construct {
134
159
  You are almost using up you're maximum email sending quota per 24h.
135
160
  Either [request an increase](https://docs.aws.amazon.com/ses/latest/dg/manage-sending-quotas-request-increase.html) for your quota by AWS or reduce the amount of emails sent.
136
161
  You can find logs about all mails sent at \`${logFunction.logGroup.logGroupName}\`.
137
-
138
- {{#is_alert}}@slack-${notificationHandle}{{/is_alert}}
139
- {{#is_alert_recovery}}@slack-${notificationHandle}{{/is_alert_recovery}}
140
162
  `,
141
163
  priority: 4,
142
164
  optionOverrides: {
@@ -146,7 +168,7 @@ class SesObservability extends constructs_1.Construct {
146
168
  },
147
169
  evaluationDelay: 900,
148
170
  },
149
- notification: new datadogv2_1.NoNotification(),
171
+ notification: monitorNotification,
150
172
  });
151
173
  new datadogv2_1.DatadogMonitor(this, 'EmailRejectedMonitor', {
152
174
  name: `${accountName} SES Email Rejected`,
@@ -157,8 +179,6 @@ class SesObservability extends constructs_1.Construct {
157
179
  SES [rejected](https://docs.aws.amazon.com/ses/latest/dg/monitor-sending-activity.html) sending at least one email.
158
180
  Please investigate the root case, as this is not expected to happen in production ever.
159
181
  You can find logs about all mails sent at \`${logFunction.logGroup.logGroupName}\`.
160
-
161
- {{#is_alert}}@slack-${notificationHandle}{{/is_alert}}
162
182
  `,
163
183
  priority: 3,
164
184
  optionOverrides: {
@@ -167,7 +187,7 @@ class SesObservability extends constructs_1.Construct {
167
187
  },
168
188
  evaluationDelay: 900,
169
189
  },
170
- notification: new datadogv2_1.NoNotification(),
190
+ notification: monitorNotification,
171
191
  });
172
192
  const complaintThresholds = {
173
193
  warning: props.complaintThresholds?.warning ?? COMPLAINT_THRESHOLDS_DEFAULT.warning,
@@ -185,17 +205,13 @@ class SesObservability extends constructs_1.Construct {
185
205
  If this metric reaches \`0.5%\` the email sending capability of your account will be disabled by AWS.
186
206
  You can find logs about all mails sent at \`${logFunction.logGroup.logGroupName}\`.
187
207
  See [ADR - SES domain reputation observability](https://confluence.collaboration-man.com/display/MAN/ADR+-+SES+domain+reputation+observability).
188
-
189
-
190
- {{#is_alert}}@slack-${notificationHandle}{{/is_alert}}
191
- {{#is_alert_recovery}}@slack-${notificationHandle}{{/is_alert_recovery}}
192
208
  `,
193
209
  priority: 2,
194
210
  optionOverrides: {
195
211
  thresholds: complaintThresholds,
196
212
  evaluationDelay: 900,
197
213
  },
198
- notification: new datadogv2_1.NoNotification(),
214
+ notification: monitorNotification,
199
215
  });
200
216
  const bounceThresholds = {
201
217
  warning: props.bounceThresholds?.warning ?? BOUNCE_THRESHOLDS_DEFAULT.warning,
@@ -213,17 +229,13 @@ class SesObservability extends constructs_1.Construct {
213
229
  If this metric reaches \`10%\` the email sending capability of your account will be disabled by AWS.
214
230
  You can find logs about all mails sent at \`${logFunction.logGroup.logGroupName}\`.
215
231
  See [ADR - SES domain reputation observability](https://confluence.collaboration-man.com/display/MAN/ADR+-+SES+domain+reputation+observability).
216
-
217
-
218
- {{#is_alert}}@slack-${notificationHandle}{{/is_alert}}
219
- {{#is_alert_recovery}}@slack-${notificationHandle}{{/is_alert_recovery}}
220
232
  `,
221
233
  priority: 2,
222
234
  optionOverrides: {
223
235
  thresholds: bounceThresholds,
224
236
  evaluationDelay: 900,
225
237
  },
226
- notification: new datadogv2_1.NoNotification(),
238
+ notification: monitorNotification,
227
239
  });
228
240
  }
229
241
  /**
@@ -253,4 +265,4 @@ SesObservability[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.SesObservability", v
253
265
  // ! changing these values is a breaking change for users
254
266
  SesObservability.CONFIGURATION_SET_NAME_SSM_PARAMETER = '/rio/config/ses-observability/configuration-set-name';
255
267
  SesObservability.SNS_TOPIC_ARN_EXPORT_NAME = 'RioSesObservabilityTopicArn';
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VzLW9ic2VydmFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VzL3Nlcy1vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLDZDQUFvQztBQUNwQyxpREFBaUQ7QUFFakQsbURBQTRFO0FBQzVFLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0Msc0VBQXNFO0FBQ3RFLDJDQUEyQztBQUMzQyx3Q0FBd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLHFDQUFzQztBQUN0Qyw0Q0FBb0Q7QUFDcEQsNENBQTRGO0FBQzVGLDBEQUFxRDtBQUVyRCxNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLFFBQVEsRUFBRSxJQUFJO0lBQ2QsT0FBTyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUYsTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxRQUFRLEVBQUUsS0FBSztJQUNmLE9BQU8sRUFBRSxNQUFNO0NBQ2hCLENBQUM7QUF5Q0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1REc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLHNCQUFTO0lBTzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixNQUFNLFNBQVMsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsaUNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFFN0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUN0RSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsb0NBQW9DO1lBQ3BFLFdBQVcsRUFBRSx5Q0FBeUM7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QUM7Z0JBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQyxJQUFJLElBQUksWUFBWSxnQ0FBcUIsRUFBRSxDQUFDO3dCQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO3dCQUN2QyxJQUFJLFlBQVksS0FBSyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDOzRCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7d0JBQzFGLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF2TEgsNENBd0xDOzs7QUF2TEMseURBQXlEO0FBQ3pDLHFEQUFvQyxHQUFHLHNEQUFzRCxDQUFDO0FBQzlGLDBDQUF5QixHQUFHLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgTm9kZWpzRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgeyBDZm5TdWJzY3JpcHRpb25GaWx0ZXIsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyBzZXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlcyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzY3JpcHRpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IHRyaW1JbmRlbnQgfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBERUZBVUxUX05PREVfUlVOVElNRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBEYXRhZG9nTW9uaXRvciwgRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZSwgTm9Ob3RpZmljYXRpb24gfSBmcm9tICcuLi9kYXRhZG9ndjInO1xuaW1wb3J0IHsgUmlvTGFuZGluZ1pvbmUgfSBmcm9tICcuLi9yaW8tbGFuZGluZy16b25lJztcblxuY29uc3QgQk9VTkNFX1RIUkVTSE9MRFNfREVGQVVMVCA9IHtcbiAgY3JpdGljYWw6IDAuMDUsXG4gIHdhcm5pbmc6IDAuMDQsXG59O1xuXG5jb25zdCBDT01QTEFJTlRfVEhSRVNIT0xEU19ERUZBVUxUID0ge1xuICBjcml0aWNhbDogMC4wMDEsXG4gIHdhcm5pbmc6IDAuMDAwOCxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm91bmNlVGhyZXNob2xkc1Byb3BzIHtcbiAgcmVhZG9ubHkgd2FybmluZz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY3JpdGljYWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxhaW50VGhyZXNob2xkc1Byb3BzIHtcbiAgcmVhZG9ubHkgd2FybmluZz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY3JpdGljYWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VzT2JzZXJ2YWJpbGl0eVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBTRVMgZXZlbnRzIHRvIGxvZy5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBbRW1haWxTZW5kaW5nRXZlbnQuREVMSVZFUlksIEVtYWlsU2VuZGluZ0V2ZW50LkJPVU5DRSwgRW1haWxTZW5kaW5nRXZlbnQuQ09NUExBSU5ULCBFbWFpbFNlbmRpbmdFdmVudC5SRUpFQ1RdXG4gICAqL1xuICByZWFkb25seSBsb2dnZWRTZXNFdmVudHM/OiBzZXMuRW1haWxTZW5kaW5nRXZlbnRbXTtcblxuICAvKipcbiAgICogVGhlIFRocmVzaG9sZHMgZm9yIGJvdW5jZSByYXRlIE1vbml0b3JzLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBzaG91bGQgb25seSBiZSBvdmVyd3JpdHRlbiwgaWYgdGhlcmUgaXMgcmVhbGx5IG5vIHBvc3NpYmlsaXR5IHRvIHJlZHVjZSB0aGUgYm91bmNlIHJhdGUgbWVhbmluZ2Z1bGx5LlxuICAgKiBJZiB0aGlzIG1ldHJpYyByZWFjaGVzIGAxMCVgIHRoZSBlbWFpbCBzZW5kaW5nIGNhcGFiaWxpdHkgb2YgeW91ciBhY2NvdW50IHdpbGwgYmUgZGlzYWJsZWQgYnkgQVdTLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7IGNyaXRpY2FsOiAwLjA1LCB3YXJuaW5nOiAwLjA0IH1cbiAgICovXG4gIHJlYWRvbmx5IGJvdW5jZVRocmVzaG9sZHM/OiBCb3VuY2VUaHJlc2hvbGRzUHJvcHM7XG5cbiAgLyoqXG4gICAqIFRoZSBUaHJlc2hvbGRzIGZvciBib3VuY2UgcmF0ZSBNb25pdG9ycy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgc2hvdWxkIG9ubHkgYmUgb3ZlcndyaXR0ZW4sIGlmIHRoZXJlIGlzIHJlYWxseSBubyBwb3NzaWJpbGl0eSB0byByZWR1Y2UgdGhlIGJvdW5jZSBjb21wbGFpbnQgbWVhbmluZ2Z1bGx5LlxuICAgKiBJZiB0aGlzIG1ldHJpYyByZWFjaGVzIGAwLjUlYCB0aGUgZW1haWwgc2VuZGluZyBjYXBhYmlsaXR5IG9mIHlvdXIgYWNjb3VudCB3aWxsIGJlIGRpc2FibGVkIGJ5IEFXUy5cbiAgICpcbiAgICogQGRlZmF1bHQgeyBjcml0aWNhbDogMC4wMDEsIHdhcm5pbmc6IDAuMDAwOCB9XG4gICAqL1xuICByZWFkb25seSBjb21wbGFpbnRUaHJlc2hvbGRzPzogQ29tcGxhaW50VGhyZXNob2xkc1Byb3BzO1xufVxuXG4vKipcbiAqIFJpb1Nlc09ic2VydmFiaWxpdHlcbiAqXG4gKiBUaGlzIGNvbnN0cnVjdCBzZXRzIHVwIG9ic2VydmFiaWxpdHkgZm9yIFNFUyBhcyBkZWZpbmVkIGJ5IFtBRFIgLSBTRVMgZG9tYWluIHJlcHV0YXRpb24gb2JzZXJ2YWJpbGl0eV0oaHR0cHM6Ly9jb25mbHVlbmNlLmNvbGxhYm9yYXRpb24tbWFuLmNvbS9kaXNwbGF5L01BTi9BRFIrLStTRVMrZG9tYWluK3JlcHV0YXRpb24rb2JzZXJ2YWJpbGl0eSkuXG4gKlxuICogIyBXYXJuaW5nXG4gKiBUaGlzIGNvbnN0cnVjdCByZXN1bHRzIGluIGxvZ2dpbmcgYWxsIHNlbnQgZW1haWxzIGluY2x1ZGluZyB0aGUgcmVjaXBpZW50IGFkZHJlc3MgaW50byBDbG91ZFdhdGNoIGxvZ3MuXG4gKiBBcyB0aGlzIGlzIGNvbnNpZGVyZWQgKipQSUkqKiwgdGhpcyBpbmZvcm1hdGlvbiBNVVNUIGJlIGhhbmRsZWQgYWNjb3JkaW5nbHkuXG4gKiBJbiBwYXJ0aWN1bGFyLCBsb2dzICoqTVVTVCBOT1QqKiBiZSBzZW50IHRvIGZ1cnRoZXIgdGhpcmQgcGFydHkgc2VydmljZXMgKGUuZy4gRGF0YWRvZykgYW5kIHRoZSByZXRlbnRpb24gcGVyaW9kIGZvciBsb2dzICoqTVVTVCBOT1QqKiBiZSBleHRlbmRlZC5cbiAqXG4gKiAjIFVzYWdlXG4gKiAjIyBEZWZhdWx0IENvbmZpZ3VyYXRpb24gU2V0IGZvciBJZGVudGl0eVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJpb1Nlc09ic2VydmFiaWxpdHkgPSBuZXcgUmlvU2VzT2JzZXJ2YWJpbGl0eSh0aGlzLCAnQ29uZmlndXJhdGlvblNldCcsIHt9KVxuICogY29uc3QgaWRlbnRpdHkgPSBuZXcgRW1haWxJZGVudGl0eSh0aGlzLCAnRW1haWxJZGVudGl0eScsIHtcbiAqICAgICBpZGVudGl0eTogSWRlbnRpdHkuZG9tYWluKCdleGFtcGxlLmNvbScpLFxuICogICAgIGNvbmZpZ3VyYXRpb25TZXQ6IHJpb1Nlc09ic2VydmFiaWxpdHkuY29uZmlndXJhdGlvblNldCxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogIyMgU3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIHNldCBwZXIgcmVxdWVzdFxuICpcbiAqIFRoaXMgaXMgaWRlYWwgaWYgeW91IHdhbnQgdG8gdHJ5IG91dCB0aGUgY29uc3RydWN0IGZpcnN0IG9uZSBzb21lIHNwZWNpZmljIGVtYWlscyAoZS5nLiBkdXJpbmcgaW5pdGlhbCBtaWdyYXRpb24pLlxuICogVGhlIGNvbmZpZ3VyYXRpb24gc2V0IG5hbWUgaXMgZXhwb3J0ZWQgYXMgYW4gU1NNIHBhcmFtZXRlciBgL3Jpby9jb25maWcvc2VzLW9ic2VydmFiaWxpdHkvY29uZmlndXJhdGlvbi1zZXQtbmFtZWAuXG4gKiBUaHVzLCB5b3UgY2FuIGVhc2lseSBtYWtlIGl0IGF2YWlsYWJsZSBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB5b3VyIGNvZGUuXG4gKlxuICogYGBga290bGluXG4gKiBpbXBvcnQgY29tLmFtYXpvbmF3cy5zZXJ2aWNlcy5zaW1wbGVlbWFpbC5tb2RlbC5TZW5kRW1haWxSZXF1ZXN0XG4gKlxuICogdmFsIHJlcXVlc3QgPSBTZW5kRW1haWxSZXF1ZXN0KClcbiAqICAgICAgICAgICAgICAgICAud2l0aENvbmZpZ3VyYXRpb25TZXROYW1lKFNTTV9DT05GSUdVUkFUSU9OX1NTTV9QQVJBTUVURVJfVkFMVUUpXG4gKiAgICAgICAgICAgICAgICAgLi4uXG4gKiBgYGBcbiAqXG4gKiAjIyBBdXRvbWF0ZWQgZXZlbnQgcHJvY2Vzc2luZ1xuICpcbiAqIElmIHlvdSBoYXZlIHNwZWNpZmljIG5lZWRzIGZvciB3aGljaCB5b3UnZCBsaWtlIHRvIHByb2Nlc3MgdGhlIFNOUyBldmVudHMgZGlyZWN0bHlcbiAqIChlLmcuIGF1dG9tYXRpY2FsbHkgY3JlYXRpbmcgYSBzdXBwcmVzc2lvbiBsaXN0IGZyb20gYm91bmNlcyksIHlvdSBjYW4gc3Vic2NyaWJlIHRvIHRoZSBTTlMgdG9waWMuXG4gKiBUbyBlbmFibGUgdGhpcyB0aGUgU05TIHRvcGljIEFSTiBpcyBleHBvcnRlZCB2aWEgQ2xvdWRmb3JtYXRpb24gYXMgYFJpb1Nlc09ic2VydmFiaWxpdHlUb3BpY0FybmAuXG4gKlxuICogIyBOb3Rlc1xuICogIyMgQWRkIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBmb3IgZmFyZ2F0ZSB0YXNrIHRvIGVuYWJsZSB1c2luZyBzZXMgY29uZmlndXJhdGlvbiBzZXRcbiAqIE1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zIGluIHRoZSB0YXNrIHJvbGUgb2YgdGhlIGZhcmdhdGUgdGFzaywgZS5nLjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICAgICBzZXJ2aWNlLnRhc2tEZWZpbml0aW9uLnRhc2tSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICogICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICogICAgICAgICBhY3Rpb25zOiBbJ3NlczpzZW5kRW1haWwnLCAnc2VzOnNlbmRSYXdFbWFpbCddLFxuICogICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzZXM6PHlvdXJfcmVnaW9uPjo8eW91cl9hY2NvdW50Pjpjb25maWd1cmF0aW9uLXNldC88eW91cl9jb25maWd1cmF0aW9uX3NldF9uYW1lPmBdLFxuICogICAgICAgfSkpO1xuICogYGBgXG4gKlxuICogIyMgV2F0Y2hmdWxcbiAqIEl0IG1pZ2h0IGJlIGhlbHBmdWwgdG8gYWRkIHdhdGNoZnVsIHRvIHlvdXIgc3RhY2sgdG9cbiAqIGdldCBub3RpZmllZCBpZiB0aGUgc2VzLWxvZ2dlciBsYW1iZGEgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNPYnNlcnZhYmlsaXR5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLy8gISBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMgaXMgYSBicmVha2luZyBjaGFuZ2UgZm9yIHVzZXJzXG4gIHN0YXRpYyByZWFkb25seSBDT05GSUdVUkFUSU9OX1NFVF9OQU1FX1NTTV9QQVJBTUVURVIgPSAnL3Jpby9jb25maWcvc2VzLW9ic2VydmFiaWxpdHkvY29uZmlndXJhdGlvbi1zZXQtbmFtZSc7XG4gIHN0YXRpYyByZWFkb25seSBTTlNfVE9QSUNfQVJOX0VYUE9SVF9OQU1FID0gJ1Jpb1Nlc09ic2VydmFiaWxpdHlUb3BpY0Fybic7XG4gIHJlYWRvbmx5IHNuc1RvcGljOiBzbnMuVG9waWM7XG4gIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb25TZXQ6IHNlcy5Db25maWd1cmF0aW9uU2V0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTZXNPYnNlcnZhYmlsaXR5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgY29uc3QgYWNjb3VudE5hbWUgPSBSaW9MYW5kaW5nWm9uZS5nZXRBY2NvdW50TmFtZVBhcmFtZXRlcih0aGlzKS5zdHJpbmdWYWx1ZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlciA9IG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdDb25maWd1cmF0aW9uU2V0TmFtZScsIHtcbiAgICAgIHBhcmFtZXRlck5hbWU6IFNlc09ic2VydmFiaWxpdHkuQ09ORklHVVJBVElPTl9TRVRfTkFNRV9TU01fUEFSQU1FVEVSLFxuICAgICAgc3RyaW5nVmFsdWU6ICdyaW8tc2VzLW9ic2VydmFiaWxpdHktY29uZmlndXJhdGlvbi1zZXQnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zbnNUb3BpYyA9IG5ldyBzbnMuVG9waWModGhpcywgJ1Nuc1RvcGljJywge1xuICAgICAgdG9waWNOYW1lOiAncmlvLXNlcy1vYnNlcnZhYmlsaXR5LXRvcGljJyxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlndXJhdGlvblNldCA9IG5ldyBzZXMuQ29uZmlndXJhdGlvblNldCh0aGlzLCAnQ29uZmlndXJhdGlvblNldCcsIHtcbiAgICAgIGNvbmZpZ3VyYXRpb25TZXROYW1lOiBwYXJhbWV0ZXIuc3RyaW5nVmFsdWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25TZXQuYWRkRXZlbnREZXN0aW5hdGlvbignRXZlbnREZXN0aW5hdGlvbicsIHtcbiAgICAgIGNvbmZpZ3VyYXRpb25TZXRFdmVudERlc3RpbmF0aW9uTmFtZTogJ3Jpby1zZXMtb2JzZXJ2YWJpbGl0eS1ldmVudC1kZXN0aW5hdGlvbicsXG4gICAgICBkZXN0aW5hdGlvbjogc2VzLkV2ZW50RGVzdGluYXRpb24uc25zVG9waWModGhpcy5zbnNUb3BpYyksXG4gICAgICBldmVudHM6IHByb3BzLmxvZ2dlZFNlc0V2ZW50cyA/PyBbXG4gICAgICAgIHNlcy5FbWFpbFNlbmRpbmdFdmVudC5ERUxJVkVSWSxcbiAgICAgICAgc2VzLkVtYWlsU2VuZGluZ0V2ZW50LkJPVU5DRSxcbiAgICAgICAgc2VzLkVtYWlsU2VuZGluZ0V2ZW50LkNPTVBMQUlOVCxcbiAgICAgICAgc2VzLkVtYWlsU2VuZGluZ0V2ZW50LlJFSkVDVCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2dGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ0xvZ0Z1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiAncmlvLXNlcy1vYnNlcnZhYmlsaXR5LWxvZy1mdW5jdGlvbicsXG4gICAgICBydW50aW1lOiBERUZBVUxUX05PREVfUlVOVElNRSxcbiAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhLkFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICBoYW5kbGVyOiAnc2VzLWxvZ2dlci5oYW5kbGVyJyxcbiAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5USFJFRV9NT05USFMsXG4gICAgICBzeXN0ZW1Mb2dMZXZlbFYyOiBsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuV0FSTixcbiAgICAgIGxvZ2dpbmdGb3JtYXQ6IGxhbWJkYS5Mb2dnaW5nRm9ybWF0LkpTT04sXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2xhbWJkYScpLCB7XG4gICAgICAgIGV4Y2x1ZGU6IFsnKi5qcycsICcqLmQudHMnXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlTm9TdWJzY3JpcHRpb25GaWx0ZXJzT25MYW1iZGFzTG9nR3JvdXAobG9nRnVuY3Rpb24pO1xuXG4gICAgdGhpcy5zbnNUb3BpYy5hZGRTdWJzY3JpcHRpb24obmV3IHNuc1N1YnNjcmlwdGlvbnMuTGFtYmRhU3Vic2NyaXB0aW9uKGxvZ0Z1bmN0aW9uKSk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnU25zVG9waWNBcm4nLCB7XG4gICAgICB2YWx1ZTogdGhpcy5zbnNUb3BpYy50b3BpY0FybixcbiAgICAgIGV4cG9ydE5hbWU6IFNlc09ic2VydmFiaWxpdHkuU05TX1RPUElDX0FSTl9FWFBPUlRfTkFNRSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbkhhbmRsZSA9IFJpb0xhbmRpbmdab25lLmdldFRlYW1BbGVydFNsYWNrQ2hhbm5lbFBhcmFtZXRlcih0aGlzKS5zdHJpbmdWYWx1ZTtcblxuICAgIG5ldyBEYXRhZG9nTW9uaXRvcih0aGlzLCAnUXVvdGFNb25pdG9yJywge1xuICAgICAgbmFtZTogYCR7YWNjb3VudE5hbWV9IFNFUyBxdW90YSBhbG1vc3QgcmVhY2hlZGAsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2F3cy1zZXMnLFxuICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuUVVFUllfQUxFUlQsXG4gICAgICBxdWVyeTogYG1heChsYXN0XzFoKTptYXg6YXdzLnNlcy5zZW50X2xhc3RfMjRfaG91cnN7YWNjb3VudF9pZDoke2FjY291bnRJZH19IC8gbWF4OmF3cy5zZXMubWF4XzI0X2hvdXJfc2VuZHthY2NvdW50X2lkOiR7YWNjb3VudElkfX0gPiAwLjhgLFxuICAgICAgbWVzc2FnZTogdHJpbUluZGVudGBcbiAgICAgICAgWW91IGFyZSBhbG1vc3QgdXNpbmcgdXAgeW91J3JlIG1heGltdW0gZW1haWwgc2VuZGluZyBxdW90YSBwZXIgMjRoLiBcbiAgICAgICAgRWl0aGVyIFtyZXF1ZXN0IGFuIGluY3JlYXNlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VzL2xhdGVzdC9kZy9tYW5hZ2Utc2VuZGluZy1xdW90YXMtcmVxdWVzdC1pbmNyZWFzZS5odG1sKSBmb3IgeW91ciBxdW90YSBieSBBV1Mgb3IgcmVkdWNlIHRoZSBhbW91bnQgb2YgZW1haWxzIHNlbnQuXG4gICAgICAgIFlvdSBjYW4gZmluZCBsb2dzIGFib3V0IGFsbCBtYWlscyBzZW50IGF0IFxcYCR7bG9nRnVuY3Rpb24ubG9nR3JvdXAubG9nR3JvdXBOYW1lfVxcYC5cbiAgICAgICAgXG4gICAgICAgIHt7I2lzX2FsZXJ0fX1Ac2xhY2stJHtub3RpZmljYXRpb25IYW5kbGV9e3svaXNfYWxlcnR9fVxuICAgICAgICB7eyNpc19hbGVydF9yZWNvdmVyeX19QHNsYWNrLSR7bm90aWZpY2F0aW9uSGFuZGxlfXt7L2lzX2FsZXJ0X3JlY292ZXJ5fX1cbiAgICAgICAgYCxcbiAgICAgIHByaW9yaXR5OiA0LFxuICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHRocmVzaG9sZHM6IHtcbiAgICAgICAgICBjcml0aWNhbDogMC44LFxuICAgICAgICAgIHdhcm5pbmc6IDAuNyxcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGlvbkRlbGF5OiA5MDAsXG4gICAgICB9LFxuICAgICAgbm90aWZpY2F0aW9uOiBuZXcgTm9Ob3RpZmljYXRpb24oKSxcbiAgICB9KTtcblxuICAgIG5ldyBEYXRhZG9nTW9uaXRvcih0aGlzLCAnRW1haWxSZWplY3RlZE1vbml0b3InLCB7XG4gICAgICBuYW1lOiBgJHthY2NvdW50TmFtZX0gU0VTIEVtYWlsIFJlamVjdGVkYCxcbiAgICAgIHNlcnZpY2VOYW1lOiAnYXdzLXNlcycsXG4gICAgICBtb25pdG9yVHlwZTogRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZS5RVUVSWV9BTEVSVCxcbiAgICAgIHF1ZXJ5OiBgc3VtKGxhc3RfMWgpOm1heDphd3Muc2VzLnJlamVjdHN7YWNjb3VudF9pZDoke2FjY291bnRJZH19ID4gMGAsXG4gICAgICBtZXNzYWdlOiB0cmltSW5kZW50YFxuICAgICAgICBTRVMgW3JlamVjdGVkXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VzL2xhdGVzdC9kZy9tb25pdG9yLXNlbmRpbmctYWN0aXZpdHkuaHRtbCkgc2VuZGluZyBhdCBsZWFzdCBvbmUgZW1haWwuXG4gICAgICAgIFBsZWFzZSBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXNlLCBhcyB0aGlzIGlzIG5vdCBleHBlY3RlZCB0byBoYXBwZW4gaW4gcHJvZHVjdGlvbiBldmVyLlxuICAgICAgICBZb3UgY2FuIGZpbmQgbG9ncyBhYm91dCBhbGwgbWFpbHMgc2VudCBhdCBcXGAke2xvZ0Z1bmN0aW9uLmxvZ0dyb3VwLmxvZ0dyb3VwTmFtZX1cXGAuXG4gICAgICAgIFxuICAgICAgICB7eyNpc19hbGVydH19QHNsYWNrLSR7bm90aWZpY2F0aW9uSGFuZGxlfXt7L2lzX2FsZXJ0fX1cbiAgICAgICAgYCxcbiAgICAgIHByaW9yaXR5OiAzLFxuICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHRocmVzaG9sZHM6IHtcbiAgICAgICAgICBjcml0aWNhbDogMCxcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGlvbkRlbGF5OiA5MDAsXG4gICAgICB9LFxuICAgICAgbm90aWZpY2F0aW9uOiBuZXcgTm9Ob3RpZmljYXRpb24oKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXBsYWludFRocmVzaG9sZHMgPSB7XG4gICAgICB3YXJuaW5nOiBwcm9wcy5jb21wbGFpbnRUaHJlc2hvbGRzPy53YXJuaW5nID8/IENPTVBMQUlOVF9USFJFU0hPTERTX0RFRkFVTFQud2FybmluZyxcbiAgICAgIGNyaXRpY2FsOiBwcm9wcy5jb21wbGFpbnRUaHJlc2hvbGRzPy5jcml0aWNhbCA/PyBDT01QTEFJTlRfVEhSRVNIT0xEU19ERUZBVUxULmNyaXRpY2FsLFxuICAgIH07XG4gICAgbmV3IERhdGFkb2dNb25pdG9yKHRoaXMsICdDb21wbGFpbnRSYXRlTW9uaXRvcicsIHtcbiAgICAgIG5hbWU6IGAke2FjY291bnROYW1lfSBTRVMgcmVwdXRhdGlvbiBlbmRhbmdlcmVkOiBDb21wbGFpbnQgcmF0ZSBIaWdoYCxcbiAgICAgIHNlcnZpY2VOYW1lOiAnYXdzLXNlcycsXG4gICAgICBtb25pdG9yVHlwZTogRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZS5RVUVSWV9BTEVSVCxcbiAgICAgIHF1ZXJ5OiBgbWF4KGxhc3RfMWgpOm1heDphd3Muc2VzLnJlcHV0YXRpb25fY29tcGxhaW50X3JhdGV7YWNjb3VudF9pZDoke2FjY291bnRJZH0gYW5kIG5vdCBzZXM6Kn0gPiAke2NvbXBsYWludFRocmVzaG9sZHMuY3JpdGljYWx9YCxcbiAgICAgIG1lc3NhZ2U6IHRyaW1JbmRlbnRgXG4gICAgICAgIFdhcm5pbmcgVGhyZXNob2xkIGZvciBDb21wbGFpbnQgcmF0ZSB7eyNpc193YXJuaW5nfX1hbG1vc3Qge3svaXNfd2FybmluZ319cmVhY2hlZCAoYXMgZGVmaW5lZCBpbiBBV1MpLlxuICAgICAgICBcbiAgICAgICAgUGxlYXNlIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbXBsYWludHMgcmVjZWl2ZWQgZm9yIEUtbWFpbHMgc2VudCBieSB5b3VyIEFjY291bnQuXG4gICAgICAgIElmIHRoaXMgbWV0cmljIHJlYWNoZXMgXFxgMC41JVxcYCB0aGUgZW1haWwgc2VuZGluZyBjYXBhYmlsaXR5IG9mIHlvdXIgYWNjb3VudCB3aWxsIGJlIGRpc2FibGVkIGJ5IEFXUy5cbiAgICAgICAgWW91IGNhbiBmaW5kIGxvZ3MgYWJvdXQgYWxsIG1haWxzIHNlbnQgYXQgXFxgJHtsb2dGdW5jdGlvbi5sb2dHcm91cC5sb2dHcm91cE5hbWV9XFxgLlxuICAgICAgICBTZWUgW0FEUiAtIFNFUyBkb21haW4gcmVwdXRhdGlvbiBvYnNlcnZhYmlsaXR5XShodHRwczovL2NvbmZsdWVuY2UuY29sbGFib3JhdGlvbi1tYW4uY29tL2Rpc3BsYXkvTUFOL0FEUistK1NFUytkb21haW4rcmVwdXRhdGlvbitvYnNlcnZhYmlsaXR5KS5cbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICB7eyNpc19hbGVydH19QHNsYWNrLSR7bm90aWZpY2F0aW9uSGFuZGxlfXt7L2lzX2FsZXJ0fX1cbiAgICAgICAge3sjaXNfYWxlcnRfcmVjb3Zlcnl9fUBzbGFjay0ke25vdGlmaWNhdGlvbkhhbmRsZX17ey9pc19hbGVydF9yZWNvdmVyeX19XG4gICAgICAgIGAsXG4gICAgICBwcmlvcml0eTogMixcbiAgICAgIG9wdGlvbk92ZXJyaWRlczoge1xuICAgICAgICB0aHJlc2hvbGRzOiBjb21wbGFpbnRUaHJlc2hvbGRzLFxuICAgICAgICBldmFsdWF0aW9uRGVsYXk6IDkwMCxcbiAgICAgIH0sXG4gICAgICBub3RpZmljYXRpb246IG5ldyBOb05vdGlmaWNhdGlvbigpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm91bmNlVGhyZXNob2xkcyA9IHtcbiAgICAgIHdhcm5pbmc6IHByb3BzLmJvdW5jZVRocmVzaG9sZHM/Lndhcm5pbmcgPz8gQk9VTkNFX1RIUkVTSE9MRFNfREVGQVVMVC53YXJuaW5nLFxuICAgICAgY3JpdGljYWw6IHByb3BzLmJvdW5jZVRocmVzaG9sZHM/LmNyaXRpY2FsID8/IEJPVU5DRV9USFJFU0hPTERTX0RFRkFVTFQuY3JpdGljYWwsXG4gICAgfTtcbiAgICBuZXcgRGF0YWRvZ01vbml0b3IodGhpcywgJ0JvdW5jZVJhdGVNb25pdG9yJywge1xuICAgICAgbmFtZTogYCR7YWNjb3VudE5hbWV9IFNFUyByZXB1dGF0aW9uIGVuZGFuZ2VyZWQ6IEJvdW5jZSBSYXRlIEhpZ2hgLFxuICAgICAgc2VydmljZU5hbWU6ICdhd3Mtc2VzJyxcbiAgICAgIG1vbml0b3JUeXBlOiBEYXRhZG9nTW9uaXRvclF1ZXJ5QWxlcnRUeXBlLlFVRVJZX0FMRVJULFxuICAgICAgcXVlcnk6IGBtYXgobGFzdF8xaCk6bWF4OmF3cy5zZXMucmVwdXRhdGlvbl9ib3VuY2VfcmF0ZXthY2NvdW50X2lkOiR7YWNjb3VudElkfSBhbmQgbm90IHNlczoqfSA+ICR7Ym91bmNlVGhyZXNob2xkcy5jcml0aWNhbH1gLFxuICAgICAgbWVzc2FnZTogdHJpbUluZGVudGBcbiAgICAgICAgV2FybmluZyBUaHJlc2hvbGQgZm9yIEJvdW5jZSByYXRlIHt7I2lzX3dhcm5pbmd9fWFsbW9zdCB7ey9pc193YXJuaW5nfX1yZWFjaGVkIChhcyBkZWZpbmVkIGluIEFXUykuXG4gICAgICAgIFxuICAgICAgICBQbGVhc2UgcmVkdWNlIHRoZSBudW1iZXIgb2YgYm91bmNlcyBmb3IgRS1tYWlscyBzZW50IGJ5IHlvdXIgQWNjb3VudC5cbiAgICAgICAgSWYgdGhpcyBtZXRyaWMgcmVhY2hlcyBcXGAxMCVcXGAgdGhlIGVtYWlsIHNlbmRpbmcgY2FwYWJpbGl0eSBvZiB5b3VyIGFjY291bnQgd2lsbCBiZSBkaXNhYmxlZCBieSBBV1MuXG4gICAgICAgIFlvdSBjYW4gZmluZCBsb2dzIGFib3V0IGFsbCBtYWlscyBzZW50IGF0IFxcYCR7bG9nRnVuY3Rpb24ubG9nR3JvdXAubG9nR3JvdXBOYW1lfVxcYC5cbiAgICAgICAgU2VlIFtBRFIgLSBTRVMgZG9tYWluIHJlcHV0YXRpb24gb2JzZXJ2YWJpbGl0eV0oaHR0cHM6Ly9jb25mbHVlbmNlLmNvbGxhYm9yYXRpb24tbWFuLmNvbS9kaXNwbGF5L01BTi9BRFIrLStTRVMrZG9tYWluK3JlcHV0YXRpb24rb2JzZXJ2YWJpbGl0eSkuXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAge3sjaXNfYWxlcnR9fUBzbGFjay0ke25vdGlmaWNhdGlvbkhhbmRsZX17ey9pc19hbGVydH19XG4gICAgICAgIHt7I2lzX2FsZXJ0X3JlY292ZXJ5fX1Ac2xhY2stJHtub3RpZmljYXRpb25IYW5kbGV9e3svaXNfYWxlcnRfcmVjb3Zlcnl9fVxuICAgICAgICBgLFxuICAgICAgcHJpb3JpdHk6IDIsXG4gICAgICBvcHRpb25PdmVycmlkZXM6IHtcbiAgICAgICAgdGhyZXNob2xkczogYm91bmNlVGhyZXNob2xkcyxcbiAgICAgICAgZXZhbHVhdGlvbkRlbGF5OiA5MDAsXG4gICAgICB9LFxuICAgICAgbm90aWZpY2F0aW9uOiBuZXcgTm9Ob3RpZmljYXRpb24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBubyBQSUkgaXMgbGVha2VkIHRvIERhdGFkb2cgYnkgYWRkaW5nIGEgc3Vic2NyaXB0aW9uIGZpbHRlciB0byB0aGUgbG9nIGdyb3VwIG9mIHRoZSBsYW1iZGEuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZU5vU3Vic2NyaXB0aW9uRmlsdGVyc09uTGFtYmRhc0xvZ0dyb3VwKGxvZ0Z1bmN0aW9uOiBOb2RlanNGdW5jdGlvbikge1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuICAgIHN0YWNrLm5vZGUuYWRkVmFsaWRhdGlvbih7XG4gICAgICB2YWxpZGF0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHN0YWNrLm5vZGUuZmluZEFsbCgpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5TdWJzY3JpcHRpb25GaWx0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IG5vZGUubG9nR3JvdXBOYW1lO1xuICAgICAgICAgICAgaWYgKGxvZ0dyb3VwTmFtZSA9PT0gbG9nRnVuY3Rpb24ubG9nR3JvdXAubG9nR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdTdWJzY3JpcHRpb24gZmlsdGVycyBhcmUgbm90IGFsbG93ZWQgc2VzLW9ic2VydmFiaWxpdHkgbGFtYmRhcyBsb2cgZ3JvdXAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VzLW9ic2VydmFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VzL3Nlcy1vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLDZDQUFvQztBQUNwQyxpREFBaUQ7QUFFakQsbURBQTRFO0FBQzVFLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0Msc0VBQXNFO0FBQ3RFLDJDQUEyQztBQUMzQyx3Q0FBd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLHFDQUFzQztBQUN0Qyw0Q0FBb0Q7QUFDcEQsNENBTXNCO0FBQ3RCLDBEQUFxRDtBQUVyRCxNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLFFBQVEsRUFBRSxJQUFJO0lBQ2QsT0FBTyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUYsTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxRQUFRLEVBQUUsS0FBSztJQUNmLE9BQU8sRUFBRSxNQUFNO0NBQ2hCLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQjtJQUkxQixZQUE2QixpQkFBMEI7UUFBMUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFTO1FBSHRDLHNCQUFpQixHQUFHLElBQUksb0NBQXdCLEVBQUUsQ0FBQztRQUNuRCxxQkFBZ0IsR0FBRyxJQUFJLG1DQUF1QixFQUFFLENBQUM7SUFHbEUsQ0FBQztJQUVELHlCQUF5QixDQUFDLE9BQXVCO1FBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUUsTUFBTSxZQUFZLEdBQUc7WUFDbkIsV0FBVztZQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FB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Y2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBOb2RlanNGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCB7IENmblN1YnNjcmlwdGlvbkZpbHRlciwgUmV0ZW50aW9uRGF5cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHNlcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VzJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCAqIGFzIHNuc1N1YnNjcmlwdGlvbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucy1zdWJzY3JpcHRpb25zJztcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgdHJpbUluZGVudCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IERFRkFVTFRfTk9ERV9SVU5USU1FIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIERhdGFkb2dDYXNlTm90aWZpY2F0aW9uLFxuICBEYXRhZG9nTW9uaXRvcixcbiAgRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZSxcbiAgRGVmYXVsdFNsYWNrTm90aWZpY2F0aW9uLFxuICBJTm90aWZpY2F0aW9uLFxufSBmcm9tICcuLi9kYXRhZG9ndjInO1xuaW1wb3J0IHsgUmlvTGFuZGluZ1pvbmUgfSBmcm9tICcuLi9yaW8tbGFuZGluZy16b25lJztcblxuY29uc3QgQk9VTkNFX1RIUkVTSE9MRFNfREVGQVVMVCA9IHtcbiAgY3JpdGljYWw6IDAuMDUsXG4gIHdhcm5pbmc6IDAuMDQsXG59O1xuXG5jb25zdCBDT01QTEFJTlRfVEhSRVNIT0xEU19ERUZBVUxUID0ge1xuICBjcml0aWNhbDogMC4wMDEsXG4gIHdhcm5pbmc6IDAuMDAwOCxcbn07XG5cbi8qKlxuICogU2VuZHMgYSBTbGFjayBub3RpZmljYXRpb24gZm9yIG1vbml0b3IgYWxlcnRzIGFuZCByZWNvdmVyeSAobm8gbm90aWZpY2F0aW9uIGZvciBtb25pdG9yIHdhcm5pbmdzKS5cbiAqIEFsc28gY3JlYXRlcyBhIERhdGFkb2cgY2FzZSB3aGVuIGNyZWF0ZUNhc2UgaXMgc2V0IHRvIHRydWUuXG4gKi9cbmNsYXNzIFNlc01vbml0b3JOb3RpZmljYXRpb24gaW1wbGVtZW50cyBJTm90aWZpY2F0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzbGFja05vdGlmaWNhdGlvbiA9IG5ldyBEZWZhdWx0U2xhY2tOb3RpZmljYXRpb24oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjYXNlTm90aWZpY2F0aW9uID0gbmV3IERhdGFkb2dDYXNlTm90aWZpY2F0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjcmVhdGVEYXRhZG9nQ2FzZTogYm9vbGVhbikge1xuICB9XG5cbiAgZ2VuZXJhdGVNZXNzYWdlQW5ub3RhdGlvbihtb25pdG9yOiBEYXRhZG9nTW9uaXRvcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2xhY2tIYW5kbGUgPSB0aGlzLnNsYWNrTm90aWZpY2F0aW9uLmdlbmVyYXRlTWVzc2FnZUFubm90YXRpb24obW9uaXRvcik7XG4gICAgY29uc3QgY2FzZUhhbmRsZSA9IHRoaXMuY2FzZU5vdGlmaWNhdGlvbi5nZW5lcmF0ZU1lc3NhZ2VBbm5vdGF0aW9uKG1vbml0b3IpO1xuICAgIGNvbnN0IGFsZXJ0SGFuZGxlcyA9IFtcbiAgICAgIHNsYWNrSGFuZGxlLFxuICAgICAgLi4uKHRoaXMuY3JlYXRlRGF0YWRvZ0Nhc2UgPyBbY2FzZUhhbmRsZV0gOiBbXSksXG4gICAgXTtcblxuICAgIHJldHVybiBbXG4gICAgICAne3sjaXNfYWxlcnR9fScsXG4gICAgICAuLi5hbGVydEhhbmRsZXMsXG4gICAgICAne3svaXNfYWxlcnR9fScsXG4gICAgICBge3sjaXNfYWxlcnRfcmVjb3Zlcnl9fSR7c2xhY2tIYW5kbGV9e3svaXNfYWxlcnRfcmVjb3Zlcnl9fWAsXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvdW5jZVRocmVzaG9sZHNQcm9wcyB7XG4gIHJlYWRvbmx5IHdhcm5pbmc/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNyaXRpY2FsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsYWludFRocmVzaG9sZHNQcm9wcyB7XG4gIHJlYWRvbmx5IHdhcm5pbmc/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNyaXRpY2FsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc09ic2VydmFiaWxpdHlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgU0VTIGV2ZW50cyB0byBsb2cuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgW0VtYWlsU2VuZGluZ0V2ZW50LkRFTElWRVJZLCBFbWFpbFNlbmRpbmdFdmVudC5CT1VOQ0UsIEVtYWlsU2VuZGluZ0V2ZW50LkNPTVBMQUlOVCwgRW1haWxTZW5kaW5nRXZlbnQuUkVKRUNUXVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nZ2VkU2VzRXZlbnRzPzogc2VzLkVtYWlsU2VuZGluZ0V2ZW50W107XG5cbiAgLyoqXG4gICAqIFRoZSBUaHJlc2hvbGRzIGZvciBib3VuY2UgcmF0ZSBNb25pdG9ycy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgc2hvdWxkIG9ubHkgYmUgb3ZlcndyaXR0ZW4sIGlmIHRoZXJlIGlzIHJlYWxseSBubyBwb3NzaWJpbGl0eSB0byByZWR1Y2UgdGhlIGJvdW5jZSByYXRlIG1lYW5pbmdmdWxseS5cbiAgICogSWYgdGhpcyBtZXRyaWMgcmVhY2hlcyBgMTAlYCB0aGUgZW1haWwgc2VuZGluZyBjYXBhYmlsaXR5IG9mIHlvdXIgYWNjb3VudCB3aWxsIGJlIGRpc2FibGVkIGJ5IEFXUy5cbiAgICpcbiAgICogQGRlZmF1bHQgeyBjcml0aWNhbDogMC4wNSwgd2FybmluZzogMC4wNCB9XG4gICAqL1xuICByZWFkb25seSBib3VuY2VUaHJlc2hvbGRzPzogQm91bmNlVGhyZXNob2xkc1Byb3BzO1xuXG4gIC8qKlxuICAgKiBUaGUgVGhyZXNob2xkcyBmb3IgYm91bmNlIHJhdGUgTW9uaXRvcnMuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHNob3VsZCBvbmx5IGJlIG92ZXJ3cml0dGVuLCBpZiB0aGVyZSBpcyByZWFsbHkgbm8gcG9zc2liaWxpdHkgdG8gcmVkdWNlIHRoZSBib3VuY2UgY29tcGxhaW50IG1lYW5pbmdmdWxseS5cbiAgICogSWYgdGhpcyBtZXRyaWMgcmVhY2hlcyBgMC41JWAgdGhlIGVtYWlsIHNlbmRpbmcgY2FwYWJpbGl0eSBvZiB5b3VyIGFjY291bnQgd2lsbCBiZSBkaXNhYmxlZCBieSBBV1MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHsgY3JpdGljYWw6IDAuMDAxLCB3YXJuaW5nOiAwLjAwMDggfVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGxhaW50VGhyZXNob2xkcz86IENvbXBsYWludFRocmVzaG9sZHNQcm9wcztcblxuICAvKipcbiAgICogRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgdGhlIERhdGFkb2cgbW9uaXRvcnMgdG8gY3JlYXRlIGNhc2VzIGluIERhdGFkb2cgd2hlbiBhbiBhbGVydCBpcyB0cmlnZ2VyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUNhc2VzRnJvbU1vbml0b3JzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSaW9TZXNPYnNlcnZhYmlsaXR5XG4gKlxuICogVGhpcyBjb25zdHJ1Y3Qgc2V0cyB1cCBvYnNlcnZhYmlsaXR5IGZvciBTRVMgYXMgZGVmaW5lZCBieSBbQURSIC0gU0VTIGRvbWFpbiByZXB1dGF0aW9uIG9ic2VydmFiaWxpdHldKGh0dHBzOi8vY29uZmx1ZW5jZS5jb2xsYWJvcmF0aW9uLW1hbi5jb20vZGlzcGxheS9NQU4vQURSKy0rU0VTK2RvbWFpbityZXB1dGF0aW9uK29ic2VydmFiaWxpdHkpLlxuICpcbiAqICMgV2FybmluZ1xuICogVGhpcyBjb25zdHJ1Y3QgcmVzdWx0cyBpbiBsb2dnaW5nIGFsbCBzZW50IGVtYWlscyBpbmNsdWRpbmcgdGhlIHJlY2lwaWVudCBhZGRyZXNzIGludG8gQ2xvdWRXYXRjaCBsb2dzLlxuICogQXMgdGhpcyBpcyBjb25zaWRlcmVkICoqUElJKiosIHRoaXMgaW5mb3JtYXRpb24gTVVTVCBiZSBoYW5kbGVkIGFjY29yZGluZ2x5LlxuICogSW4gcGFydGljdWxhciwgbG9ncyAqKk1VU1QgTk9UKiogYmUgc2VudCB0byBmdXJ0aGVyIHRoaXJkIHBhcnR5IHNlcnZpY2VzIChlLmcuIERhdGFkb2cpIGFuZCB0aGUgcmV0ZW50aW9uIHBlcmlvZCBmb3IgbG9ncyAqKk1VU1QgTk9UKiogYmUgZXh0ZW5kZWQuXG4gKlxuICogIyBVc2FnZVxuICogIyMgRGVmYXVsdCBDb25maWd1cmF0aW9uIFNldCBmb3IgSWRlbnRpdHlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByaW9TZXNPYnNlcnZhYmlsaXR5ID0gbmV3IFJpb1Nlc09ic2VydmFiaWxpdHkodGhpcywgJ0NvbmZpZ3VyYXRpb25TZXQnLCB7fSlcbiAqIGNvbnN0IGlkZW50aXR5ID0gbmV3IEVtYWlsSWRlbnRpdHkodGhpcywgJ0VtYWlsSWRlbnRpdHknLCB7XG4gKiAgICAgaWRlbnRpdHk6IElkZW50aXR5LmRvbWFpbignZXhhbXBsZS5jb20nKSxcbiAqICAgICBjb25maWd1cmF0aW9uU2V0OiByaW9TZXNPYnNlcnZhYmlsaXR5LmNvbmZpZ3VyYXRpb25TZXQsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIFNwZWNpZmljYWxseSB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBzZXQgcGVyIHJlcXVlc3RcbiAqXG4gKiBUaGlzIGlzIGlkZWFsIGlmIHlvdSB3YW50IHRvIHRyeSBvdXQgdGhlIGNvbnN0cnVjdCBmaXJzdCBvbmUgc29tZSBzcGVjaWZpYyBlbWFpbHMgKGUuZy4gZHVyaW5nIGluaXRpYWwgbWlncmF0aW9uKS5cbiAqIFRoZSBjb25maWd1cmF0aW9uIHNldCBuYW1lIGlzIGV4cG9ydGVkIGFzIGFuIFNTTSBwYXJhbWV0ZXIgYC9yaW8vY29uZmlnL3Nlcy1vYnNlcnZhYmlsaXR5L2NvbmZpZ3VyYXRpb24tc2V0LW5hbWVgLlxuICogVGh1cywgeW91IGNhbiBlYXNpbHkgbWFrZSBpdCBhdmFpbGFibGUgYXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4geW91ciBjb2RlLlxuICpcbiAqIGBgYGtvdGxpblxuICogaW1wb3J0IGNvbS5hbWF6b25hd3Muc2VydmljZXMuc2ltcGxlZW1haWwubW9kZWwuU2VuZEVtYWlsUmVxdWVzdFxuICpcbiAqIHZhbCByZXF1ZXN0ID0gU2VuZEVtYWlsUmVxdWVzdCgpXG4gKiAgICAgICAgICAgICAgICAgLndpdGhDb25maWd1cmF0aW9uU2V0TmFtZShTU01fQ09ORklHVVJBVElPTl9TU01fUEFSQU1FVEVSX1ZBTFVFKVxuICogICAgICAgICAgICAgICAgIC4uLlxuICogYGBgXG4gKlxuICogIyMgQXV0b21hdGVkIGV2ZW50IHByb2Nlc3NpbmdcbiAqXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpYyBuZWVkcyBmb3Igd2hpY2ggeW91J2QgbGlrZSB0byBwcm9jZXNzIHRoZSBTTlMgZXZlbnRzIGRpcmVjdGx5XG4gKiAoZS5nLiBhdXRvbWF0aWNhbGx5IGNyZWF0aW5nIGEgc3VwcHJlc3Npb24gbGlzdCBmcm9tIGJvdW5jZXMpLCB5b3UgY2FuIHN1YnNjcmliZSB0byB0aGUgU05TIHRvcGljLlxuICogVG8gZW5hYmxlIHRoaXMgdGhlIFNOUyB0b3BpYyBBUk4gaXMgZXhwb3J0ZWQgdmlhIENsb3VkZm9ybWF0aW9uIGFzIGBSaW9TZXNPYnNlcnZhYmlsaXR5VG9waWNBcm5gLlxuICpcbiAqICMgTm90ZXNcbiAqICMjIEFkZCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIGZhcmdhdGUgdGFzayB0byBlbmFibGUgdXNpbmcgc2VzIGNvbmZpZ3VyYXRpb24gc2V0XG4gKiBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9ucyBpbiB0aGUgdGFzayByb2xlIG9mIHRoZSBmYXJnYXRlIHRhc2ssIGUuZy46XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgICAgc2VydmljZS50YXNrRGVmaW5pdGlvbi50YXNrUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAqICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAqICAgICAgICAgYWN0aW9uczogWydzZXM6c2VuZEVtYWlsJywgJ3NlczpzZW5kUmF3RW1haWwnXSxcbiAqICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VzOjx5b3VyX3JlZ2lvbj46PHlvdXJfYWNjb3VudD46Y29uZmlndXJhdGlvbi1zZXQvPHlvdXJfY29uZmlndXJhdGlvbl9zZXRfbmFtZT5gXSxcbiAqICAgICAgIH0pKTtcbiAqIGBgYFxuICpcbiAqICMjIFdhdGNoZnVsXG4gKiBJdCBtaWdodCBiZSBoZWxwZnVsIHRvIGFkZCB3YXRjaGZ1bCB0byB5b3VyIHN0YWNrIHRvXG4gKiBnZXQgbm90aWZpZWQgaWYgdGhlIHNlcy1sb2dnZXIgbGFtYmRhIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgU2VzT2JzZXJ2YWJpbGl0eSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8vICEgY2hhbmdpbmcgdGhlc2UgdmFsdWVzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIGZvciB1c2Vyc1xuICBzdGF0aWMgcmVhZG9ubHkgQ09ORklHVVJBVElPTl9TRVRfTkFNRV9TU01fUEFSQU1FVEVSID0gJy9yaW8vY29uZmlnL3Nlcy1vYnNlcnZhYmlsaXR5L2NvbmZpZ3VyYXRpb24tc2V0LW5hbWUnO1xuICBzdGF0aWMgcmVhZG9ubHkgU05TX1RPUElDX0FSTl9FWFBPUlRfTkFNRSA9ICdSaW9TZXNPYnNlcnZhYmlsaXR5VG9waWNBcm4nO1xuICByZWFkb25seSBzbnNUb3BpYzogc25zLlRvcGljO1xuICByZWFkb25seSBjb25maWd1cmF0aW9uU2V0OiBzZXMuQ29uZmlndXJhdGlvblNldDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2VzT2JzZXJ2YWJpbGl0eVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBjb25zdCBhY2NvdW50SWQgPSBTdGFjay5vZih0aGlzKS5hY2NvdW50O1xuICAgIGNvbnN0IGFjY291bnROYW1lID0gUmlvTGFuZGluZ1pvbmUuZ2V0QWNjb3VudE5hbWVQYXJhbWV0ZXIodGhpcykuc3RyaW5nVmFsdWU7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXIgPSBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCAnQ29uZmlndXJhdGlvblNldE5hbWUnLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBTZXNPYnNlcnZhYmlsaXR5LkNPTkZJR1VSQVRJT05fU0VUX05BTUVfU1NNX1BBUkFNRVRFUixcbiAgICAgIHN0cmluZ1ZhbHVlOiAncmlvLXNlcy1vYnNlcnZhYmlsaXR5LWNvbmZpZ3VyYXRpb24tc2V0JyxcbiAgICB9KTtcblxuICAgIHRoaXMuc25zVG9waWMgPSBuZXcgc25zLlRvcGljKHRoaXMsICdTbnNUb3BpYycsIHtcbiAgICAgIHRvcGljTmFtZTogJ3Jpby1zZXMtb2JzZXJ2YWJpbGl0eS10b3BpYycsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25TZXQgPSBuZXcgc2VzLkNvbmZpZ3VyYXRpb25TZXQodGhpcywgJ0NvbmZpZ3VyYXRpb25TZXQnLCB7XG4gICAgICBjb25maWd1cmF0aW9uU2V0TmFtZTogcGFyYW1ldGVyLnN0cmluZ1ZhbHVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uU2V0LmFkZEV2ZW50RGVzdGluYXRpb24oJ0V2ZW50RGVzdGluYXRpb24nLCB7XG4gICAgICBjb25maWd1cmF0aW9uU2V0RXZlbnREZXN0aW5hdGlvbk5hbWU6ICdyaW8tc2VzLW9ic2VydmFiaWxpdHktZXZlbnQtZGVzdGluYXRpb24nLFxuICAgICAgZGVzdGluYXRpb246IHNlcy5FdmVudERlc3RpbmF0aW9uLnNuc1RvcGljKHRoaXMuc25zVG9waWMpLFxuICAgICAgZXZlbnRzOiBwcm9wcy5sb2dnZWRTZXNFdmVudHMgPz8gW1xuICAgICAgICBzZXMuRW1haWxTZW5kaW5nRXZlbnQuREVMSVZFUlksXG4gICAgICAgIHNlcy5FbWFpbFNlbmRpbmdFdmVudC5CT1VOQ0UsXG4gICAgICAgIHNlcy5FbWFpbFNlbmRpbmdFdmVudC5DT01QTEFJTlQsXG4gICAgICAgIHNlcy5FbWFpbFNlbmRpbmdFdmVudC5SRUpFQ1QsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbG9nRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdMb2dGdW5jdGlvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ3Jpby1zZXMtb2JzZXJ2YWJpbGl0eS1sb2ctZnVuY3Rpb24nLFxuICAgICAgcnVudGltZTogREVGQVVMVF9OT0RFX1JVTlRJTUUsXG4gICAgICBhcmNoaXRlY3R1cmU6IGxhbWJkYS5BcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgaGFuZGxlcjogJ3Nlcy1sb2dnZXIuaGFuZGxlcicsXG4gICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVEhSRUVfTU9OVEhTLFxuICAgICAgc3lzdGVtTG9nTGV2ZWxWMjogbGFtYmRhLlN5c3RlbUxvZ0xldmVsLldBUk4sXG4gICAgICBsb2dnaW5nRm9ybWF0OiBsYW1iZGEuTG9nZ2luZ0Zvcm1hdC5KU09OLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdsYW1iZGEnKSwge1xuICAgICAgICBleGNsdWRlOiBbJyouanMnLCAnKi5kLnRzJ10sXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICB0aGlzLmVuc3VyZU5vU3Vic2NyaXB0aW9uRmlsdGVyc09uTGFtYmRhc0xvZ0dyb3VwKGxvZ0Z1bmN0aW9uKTtcblxuICAgIHRoaXMuc25zVG9waWMuYWRkU3Vic2NyaXB0aW9uKG5ldyBzbnNTdWJzY3JpcHRpb25zLkxhbWJkYVN1YnNjcmlwdGlvbihsb2dGdW5jdGlvbikpO1xuXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ1Nuc1RvcGljQXJuJywge1xuICAgICAgdmFsdWU6IHRoaXMuc25zVG9waWMudG9waWNBcm4sXG4gICAgICBleHBvcnROYW1lOiBTZXNPYnNlcnZhYmlsaXR5LlNOU19UT1BJQ19BUk5fRVhQT1JUX05BTUUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtb25pdG9yTm90aWZpY2F0aW9uID0gbmV3IFNlc01vbml0b3JOb3RpZmljYXRpb24ocHJvcHMuY3JlYXRlQ2FzZXNGcm9tTW9uaXRvcnMgPz8gZmFsc2UpO1xuXG4gICAgbmV3IERhdGFkb2dNb25pdG9yKHRoaXMsICdRdW90YU1vbml0b3InLCB7XG4gICAgICBuYW1lOiBgJHthY2NvdW50TmFtZX0gU0VTIHF1b3RhIGFsbW9zdCByZWFjaGVkYCxcbiAgICAgIHNlcnZpY2VOYW1lOiAnYXdzLXNlcycsXG4gICAgICBtb25pdG9yVHlwZTogRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZS5RVUVSWV9BTEVSVCxcbiAgICAgIHF1ZXJ5OiBgbWF4KGxhc3RfMWgpOm1heDphd3Muc2VzLnNlbnRfbGFzdF8yNF9ob3Vyc3thY2NvdW50X2lkOiR7YWNjb3VudElkfX0gLyBtYXg6YXdzLnNlcy5tYXhfMjRfaG91cl9zZW5ke2FjY291bnRfaWQ6JHthY2NvdW50SWR9fSA+IDAuOGAsXG4gICAgICBtZXNzYWdlOiB0cmltSW5kZW50YFxuICAgICAgICBZb3UgYXJlIGFsbW9zdCB1c2luZyB1cCB5b3UncmUgbWF4aW11bSBlbWFpbCBzZW5kaW5nIHF1b3RhIHBlciAyNGguIFxuICAgICAgICBFaXRoZXIgW3JlcXVlc3QgYW4gaW5jcmVhc2VdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXMvbGF0ZXN0L2RnL21hbmFnZS1zZW5kaW5nLXF1b3Rhcy1yZXF1ZXN0LWluY3JlYXNlLmh0bWwpIGZvciB5b3VyIHF1b3RhIGJ5IEFXUyBvciByZWR1Y2UgdGhlIGFtb3VudCBvZiBlbWFpbHMgc2VudC5cbiAgICAgICAgWW91IGNhbiBmaW5kIGxvZ3MgYWJvdXQgYWxsIG1haWxzIHNlbnQgYXQgXFxgJHtsb2dGdW5jdGlvbi5sb2dHcm91cC5sb2dHcm91cE5hbWV9XFxgLlxuICAgICAgICBgLFxuICAgICAgcHJpb3JpdHk6IDQsXG4gICAgICBvcHRpb25PdmVycmlkZXM6IHtcbiAgICAgICAgdGhyZXNob2xkczoge1xuICAgICAgICAgIGNyaXRpY2FsOiAwLjgsXG4gICAgICAgICAgd2FybmluZzogMC43LFxuICAgICAgICB9LFxuICAgICAgICBldmFsdWF0aW9uRGVsYXk6IDkwMCxcbiAgICAgIH0sXG4gICAgICBub3RpZmljYXRpb246IG1vbml0b3JOb3RpZmljYXRpb24sXG4gICAgfSk7XG5cbiAgICBuZXcgRGF0YWRvZ01vbml0b3IodGhpcywgJ0VtYWlsUmVqZWN0ZWRNb25pdG9yJywge1xuICAgICAgbmFtZTogYCR7YWNjb3VudE5hbWV9IFNFUyBFbWFpbCBSZWplY3RlZGAsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2F3cy1zZXMnLFxuICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuUVVFUllfQUxFUlQsXG4gICAgICBxdWVyeTogYHN1bShsYXN0XzFoKTptYXg6YXdzLnNlcy5yZWplY3Rze2FjY291bnRfaWQ6JHthY2NvdW50SWR9fSA+IDBgLFxuICAgICAgbWVzc2FnZTogdHJpbUluZGVudGBcbiAgICAgICAgU0VTIFtyZWplY3RlZF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Nlcy9sYXRlc3QvZGcvbW9uaXRvci1zZW5kaW5nLWFjdGl2aXR5Lmh0bWwpIHNlbmRpbmcgYXQgbGVhc3Qgb25lIGVtYWlsLlxuICAgICAgICBQbGVhc2UgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2FzZSwgYXMgdGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gaGFwcGVuIGluIHByb2R1Y3Rpb24gZXZlci5cbiAgICAgICAgWW91IGNhbiBmaW5kIGxvZ3MgYWJvdXQgYWxsIG1haWxzIHNlbnQgYXQgXFxgJHtsb2dGdW5jdGlvbi5sb2dHcm91cC5sb2dHcm91cE5hbWV9XFxgLlxuICAgICAgICBgLFxuICAgICAgcHJpb3JpdHk6IDMsXG4gICAgICBvcHRpb25PdmVycmlkZXM6IHtcbiAgICAgICAgdGhyZXNob2xkczoge1xuICAgICAgICAgIGNyaXRpY2FsOiAwLFxuICAgICAgICB9LFxuICAgICAgICBldmFsdWF0aW9uRGVsYXk6IDkwMCxcbiAgICAgIH0sXG4gICAgICBub3RpZmljYXRpb246IG1vbml0b3JOb3RpZmljYXRpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wbGFpbnRUaHJlc2hvbGRzID0ge1xuICAgICAgd2FybmluZzogcHJvcHMuY29tcGxhaW50VGhyZXNob2xkcz8ud2FybmluZyA/PyBDT01QTEFJTlRfVEhSRVNIT0xEU19ERUZBVUxULndhcm5pbmcsXG4gICAgICBjcml0aWNhbDogcHJvcHMuY29tcGxhaW50VGhyZXNob2xkcz8uY3JpdGljYWwgPz8gQ09NUExBSU5UX1RIUkVTSE9MRFNfREVGQVVMVC5jcml0aWNhbCxcbiAgICB9O1xuICAgIG5ldyBEYXRhZG9nTW9uaXRvcih0aGlzLCAnQ29tcGxhaW50UmF0ZU1vbml0b3InLCB7XG4gICAgICBuYW1lOiBgJHthY2NvdW50TmFtZX0gU0VTIHJlcHV0YXRpb24gZW5kYW5nZXJlZDogQ29tcGxhaW50IHJhdGUgSGlnaGAsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2F3cy1zZXMnLFxuICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuUVVFUllfQUxFUlQsXG4gICAgICBxdWVyeTogYG1heChsYXN0XzFoKTptYXg6YXdzLnNlcy5yZXB1dGF0aW9uX2NvbXBsYWludF9yYXRle2FjY291bnRfaWQ6JHthY2NvdW50SWR9IGFuZCBub3Qgc2VzOip9ID4gJHtjb21wbGFpbnRUaHJlc2hvbGRzLmNyaXRpY2FsfWAsXG4gICAgICBtZXNzYWdlOiB0cmltSW5kZW50YFxuICAgICAgICBXYXJuaW5nIFRocmVzaG9sZCBmb3IgQ29tcGxhaW50IHJhdGUge3sjaXNfd2FybmluZ319YWxtb3N0IHt7L2lzX3dhcm5pbmd9fXJlYWNoZWQgKGFzIGRlZmluZWQgaW4gQVdTKS5cbiAgICAgICAgXG4gICAgICAgIFBsZWFzZSByZWR1Y2UgdGhlIG51bWJlciBvZiBjb21wbGFpbnRzIHJlY2VpdmVkIGZvciBFLW1haWxzIHNlbnQgYnkgeW91ciBBY2NvdW50LlxuICAgICAgICBJZiB0aGlzIG1ldHJpYyByZWFjaGVzIFxcYDAuNSVcXGAgdGhlIGVtYWlsIHNlbmRpbmcgY2FwYWJpbGl0eSBvZiB5b3VyIGFjY291bnQgd2lsbCBiZSBkaXNhYmxlZCBieSBBV1MuXG4gICAgICAgIFlvdSBjYW4gZmluZCBsb2dzIGFib3V0IGFsbCBtYWlscyBzZW50IGF0IFxcYCR7bG9nRnVuY3Rpb24ubG9nR3JvdXAubG9nR3JvdXBOYW1lfVxcYC5cbiAgICAgICAgU2VlIFtBRFIgLSBTRVMgZG9tYWluIHJlcHV0YXRpb24gb2JzZXJ2YWJpbGl0eV0oaHR0cHM6Ly9jb25mbHVlbmNlLmNvbGxhYm9yYXRpb24tbWFuLmNvbS9kaXNwbGF5L01BTi9BRFIrLStTRVMrZG9tYWluK3JlcHV0YXRpb24rb2JzZXJ2YWJpbGl0eSkuXG4gICAgICAgIGAsXG4gICAgICBwcmlvcml0eTogMixcbiAgICAgIG9wdGlvbk92ZXJyaWRlczoge1xuICAgICAgICB0aHJlc2hvbGRzOiBjb21wbGFpbnRUaHJlc2hvbGRzLFxuICAgICAgICBldmFsdWF0aW9uRGVsYXk6IDkwMCxcbiAgICAgIH0sXG4gICAgICBub3RpZmljYXRpb246IG1vbml0b3JOb3RpZmljYXRpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBib3VuY2VUaHJlc2hvbGRzID0ge1xuICAgICAgd2FybmluZzogcHJvcHMuYm91bmNlVGhyZXNob2xkcz8ud2FybmluZyA/PyBCT1VOQ0VfVEhSRVNIT0xEU19ERUZBVUxULndhcm5pbmcsXG4gICAgICBjcml0aWNhbDogcHJvcHMuYm91bmNlVGhyZXNob2xkcz8uY3JpdGljYWwgPz8gQk9VTkNFX1RIUkVTSE9MRFNfREVGQVVMVC5jcml0aWNhbCxcbiAgICB9O1xuICAgIG5ldyBEYXRhZG9nTW9uaXRvcih0aGlzLCAnQm91bmNlUmF0ZU1vbml0b3InLCB7XG4gICAgICBuYW1lOiBgJHthY2NvdW50TmFtZX0gU0VTIHJlcHV0YXRpb24gZW5kYW5nZXJlZDogQm91bmNlIFJhdGUgSGlnaGAsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2F3cy1zZXMnLFxuICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuUVVFUllfQUxFUlQsXG4gICAgICBxdWVyeTogYG1heChsYXN0XzFoKTptYXg6YXdzLnNlcy5yZXB1dGF0aW9uX2JvdW5jZV9yYXRle2FjY291bnRfaWQ6JHthY2NvdW50SWR9IGFuZCBub3Qgc2VzOip9ID4gJHtib3VuY2VUaHJlc2hvbGRzLmNyaXRpY2FsfWAsXG4gICAgICBtZXNzYWdlOiB0cmltSW5kZW50YFxuICAgICAgICBXYXJuaW5nIFRocmVzaG9sZCBmb3IgQm91bmNlIHJhdGUge3sjaXNfd2FybmluZ319YWxtb3N0IHt7L2lzX3dhcm5pbmd9fXJlYWNoZWQgKGFzIGRlZmluZWQgaW4gQVdTKS5cbiAgICAgICAgXG4gICAgICAgIFBsZWFzZSByZWR1Y2UgdGhlIG51bWJlciBvZiBib3VuY2VzIGZvciBFLW1haWxzIHNlbnQgYnkgeW91ciBBY2NvdW50LlxuICAgICAgICBJZiB0aGlzIG1ldHJpYyByZWFjaGVzIFxcYDEwJVxcYCB0aGUgZW1haWwgc2VuZGluZyBjYXBhYmlsaXR5IG9mIHlvdXIgYWNjb3VudCB3aWxsIGJlIGRpc2FibGVkIGJ5IEFXUy5cbiAgICAgICAgWW91IGNhbiBmaW5kIGxvZ3MgYWJvdXQgYWxsIG1haWxzIHNlbnQgYXQgXFxgJHtsb2dGdW5jdGlvbi5sb2dHcm91cC5sb2dHcm91cE5hbWV9XFxgLlxuICAgICAgICBTZWUgW0FEUiAtIFNFUyBkb21haW4gcmVwdXRhdGlvbiBvYnNlcnZhYmlsaXR5XShodHRwczovL2NvbmZsdWVuY2UuY29sbGFib3JhdGlvbi1tYW4uY29tL2Rpc3BsYXkvTUFOL0FEUistK1NFUytkb21haW4rcmVwdXRhdGlvbitvYnNlcnZhYmlsaXR5KS5cbiAgICAgICAgYCxcbiAgICAgIHByaW9yaXR5OiAyLFxuICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHRocmVzaG9sZHM6IGJvdW5jZVRocmVzaG9sZHMsXG4gICAgICAgIGV2YWx1YXRpb25EZWxheTogOTAwLFxuICAgICAgfSxcbiAgICAgIG5vdGlmaWNhdGlvbjogbW9uaXRvck5vdGlmaWNhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBubyBQSUkgaXMgbGVha2VkIHRvIERhdGFkb2cgYnkgYWRkaW5nIGEgc3Vic2NyaXB0aW9uIGZpbHRlciB0byB0aGUgbG9nIGdyb3VwIG9mIHRoZSBsYW1iZGEuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZU5vU3Vic2NyaXB0aW9uRmlsdGVyc09uTGFtYmRhc0xvZ0dyb3VwKGxvZ0Z1bmN0aW9uOiBOb2RlanNGdW5jdGlvbikge1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuICAgIHN0YWNrLm5vZGUuYWRkVmFsaWRhdGlvbih7XG4gICAgICB2YWxpZGF0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHN0YWNrLm5vZGUuZmluZEFsbCgpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5TdWJzY3JpcHRpb25GaWx0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IG5vZGUubG9nR3JvdXBOYW1lO1xuICAgICAgICAgICAgaWYgKGxvZ0dyb3VwTmFtZSA9PT0gbG9nRnVuY3Rpb24ubG9nR3JvdXAubG9nR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdTdWJzY3JpcHRpb24gZmlsdGVycyBhcmUgbm90IGFsbG93ZWQgc2VzLW9ic2VydmFiaWxpdHkgbGFtYmRhcyBsb2cgZ3JvdXAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "main": "lib/index.js",
17
17
  "license": "Apache-2.0",
18
- "version": "8.0.7",
18
+ "version": "8.1.0-alpha.1",
19
19
  "types": "lib/index.d.ts",
20
20
  "stability": "stable",
21
21
  "exports": {
@@ -86,7 +86,7 @@
86
86
  "@typescript-eslint/eslint-plugin": "6.12.0",
87
87
  "@typescript-eslint/parser": "6.12.0",
88
88
  "aws-cdk": "^2.177.0",
89
- "aws-cdk-lib": "2.254.0",
89
+ "aws-cdk-lib": "2.258.0",
90
90
  "aws-sdk-client-mock": "^4.1.0",
91
91
  "commit-and-tag-version": "^12.5.0",
92
92
  "constructs": "10.5.1",
package/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "8.0.7"
2
+ "version": "8.1.0-alpha.1"
3
3
  }