@cloudsnorkel/cdk-github-runners 0.14.24 → 0.15.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.
Files changed (142) hide show
  1. package/.jsii +5953 -602
  2. package/API.md +1349 -115
  3. package/README.md +53 -1
  4. package/assets/delete-failed-runner.lambda/index.js +122 -9
  5. package/assets/idle-runner-repear.lambda/index.js +153 -14
  6. package/assets/image-builders/aws-image-builder/delete-resources.lambda/index.js +1 -1
  7. package/assets/image-builders/build-image.lambda/index.js +1 -1
  8. package/assets/providers/ami-root-device.lambda/index.js +1 -1
  9. package/assets/setup.lambda/index.html +7 -7
  10. package/assets/setup.lambda/index.js +118 -8
  11. package/assets/status.lambda/index.js +121 -8
  12. package/assets/token-retriever.lambda/index.js +121 -8
  13. package/assets/warm-runner-manager.lambda/index.js +5909 -0
  14. package/assets/webhook-handler.lambda/index.js +126 -11
  15. package/assets/webhook-redelivery.lambda/index.js +139 -24
  16. package/lib/access.js +1 -1
  17. package/lib/delete-failed-runner.lambda.js +2 -2
  18. package/lib/idle-runner-repear.lambda.js +33 -7
  19. package/lib/image-builders/api.js +1 -1
  20. package/lib/image-builders/aws-image-builder/base-image.d.ts +13 -0
  21. package/lib/image-builders/aws-image-builder/base-image.js +36 -3
  22. package/lib/image-builders/aws-image-builder/builder.js +4 -4
  23. package/lib/image-builders/aws-image-builder/delete-resources.lambda.js +2 -2
  24. package/lib/image-builders/aws-image-builder/deprecated/ami.js +1 -1
  25. package/lib/image-builders/aws-image-builder/deprecated/container.js +1 -1
  26. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +1 -1
  27. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +1 -1
  28. package/lib/image-builders/build-image.lambda.js +2 -2
  29. package/lib/image-builders/codebuild-deprecated.js +1 -1
  30. package/lib/image-builders/components.js +3 -3
  31. package/lib/image-builders/static.js +1 -1
  32. package/lib/index.d.ts +1 -0
  33. package/lib/index.js +2 -1
  34. package/lib/lambda-github.d.ts +1 -1
  35. package/lib/lambda-github.js +3 -2
  36. package/lib/lambda-helpers.js +4 -4
  37. package/lib/providers/ami-root-device.lambda.js +2 -2
  38. package/lib/providers/codebuild.d.ts +18 -2
  39. package/lib/providers/codebuild.js +15 -4
  40. package/lib/providers/common.d.ts +47 -3
  41. package/lib/providers/common.js +29 -5
  42. package/lib/providers/composite.js +14 -19
  43. package/lib/providers/ec2.d.ts +9 -2
  44. package/lib/providers/ec2.js +84 -42
  45. package/lib/providers/ecs.d.ts +19 -2
  46. package/lib/providers/ecs.js +49 -44
  47. package/lib/providers/fargate.d.ts +2 -2
  48. package/lib/providers/fargate.js +19 -36
  49. package/lib/providers/lambda.d.ts +2 -2
  50. package/lib/providers/lambda.js +3 -3
  51. package/lib/runner.d.ts +31 -3
  52. package/lib/runner.js +171 -46
  53. package/lib/secrets.js +1 -1
  54. package/lib/setup.lambda.js +2 -2
  55. package/lib/utils.d.ts +10 -1
  56. package/lib/utils.js +15 -1
  57. package/lib/warm-runner-manager-function.d.ts +18 -0
  58. package/lib/warm-runner-manager-function.js +24 -0
  59. package/lib/warm-runner-manager.lambda.d.ts +41 -0
  60. package/lib/warm-runner-manager.lambda.js +487 -0
  61. package/lib/warm-runner.d.ts +155 -0
  62. package/lib/warm-runner.js +217 -0
  63. package/lib/webhook-handler.lambda.js +5 -3
  64. package/lib/webhook-redelivery.lambda.js +17 -16
  65. package/lib/webhook.d.ts +4 -0
  66. package/lib/webhook.js +2 -1
  67. package/node_modules/cron-parser/LICENSE +21 -0
  68. package/node_modules/cron-parser/README.md +408 -0
  69. package/node_modules/cron-parser/dist/CronDate.js +518 -0
  70. package/node_modules/cron-parser/dist/CronExpression.js +520 -0
  71. package/node_modules/cron-parser/dist/CronExpressionParser.js +382 -0
  72. package/node_modules/cron-parser/dist/CronFieldCollection.js +371 -0
  73. package/node_modules/cron-parser/dist/CronFileParser.js +109 -0
  74. package/node_modules/cron-parser/dist/fields/CronDayOfMonth.js +44 -0
  75. package/node_modules/cron-parser/dist/fields/CronDayOfWeek.js +51 -0
  76. package/node_modules/cron-parser/dist/fields/CronField.js +214 -0
  77. package/node_modules/cron-parser/dist/fields/CronHour.js +40 -0
  78. package/node_modules/cron-parser/dist/fields/CronMinute.js +40 -0
  79. package/node_modules/cron-parser/dist/fields/CronMonth.js +44 -0
  80. package/node_modules/cron-parser/dist/fields/CronSecond.js +40 -0
  81. package/node_modules/cron-parser/dist/fields/index.js +24 -0
  82. package/node_modules/cron-parser/dist/fields/types.js +2 -0
  83. package/node_modules/cron-parser/dist/index.js +31 -0
  84. package/node_modules/cron-parser/dist/types/CronDate.d.ts +288 -0
  85. package/node_modules/cron-parser/dist/types/CronExpression.d.ts +118 -0
  86. package/node_modules/cron-parser/dist/types/CronExpressionParser.d.ts +70 -0
  87. package/node_modules/cron-parser/dist/types/CronFieldCollection.d.ts +153 -0
  88. package/node_modules/cron-parser/dist/types/CronFileParser.d.ts +30 -0
  89. package/node_modules/cron-parser/dist/types/fields/CronDayOfMonth.d.ts +25 -0
  90. package/node_modules/cron-parser/dist/types/fields/CronDayOfWeek.d.ts +30 -0
  91. package/node_modules/cron-parser/dist/types/fields/CronField.d.ts +130 -0
  92. package/node_modules/cron-parser/dist/types/fields/CronHour.d.ts +23 -0
  93. package/node_modules/cron-parser/dist/types/fields/CronMinute.d.ts +23 -0
  94. package/node_modules/cron-parser/dist/types/fields/CronMonth.d.ts +24 -0
  95. package/node_modules/cron-parser/dist/types/fields/CronSecond.d.ts +23 -0
  96. package/node_modules/cron-parser/dist/types/fields/index.d.ts +8 -0
  97. package/node_modules/cron-parser/dist/types/fields/types.d.ts +18 -0
  98. package/node_modules/cron-parser/dist/types/index.d.ts +8 -0
  99. package/node_modules/cron-parser/dist/types/utils/random.d.ts +10 -0
  100. package/node_modules/cron-parser/dist/utils/random.js +38 -0
  101. package/node_modules/cron-parser/package.json +117 -0
  102. package/node_modules/luxon/LICENSE.md +7 -0
  103. package/node_modules/luxon/README.md +55 -0
  104. package/node_modules/luxon/build/amd/luxon.js +8741 -0
  105. package/node_modules/luxon/build/amd/luxon.js.map +1 -0
  106. package/node_modules/luxon/build/cjs-browser/luxon.js +8739 -0
  107. package/node_modules/luxon/build/cjs-browser/luxon.js.map +1 -0
  108. package/node_modules/luxon/build/es6/luxon.mjs +8133 -0
  109. package/node_modules/luxon/build/es6/luxon.mjs.map +1 -0
  110. package/node_modules/luxon/build/global/luxon.js +8744 -0
  111. package/node_modules/luxon/build/global/luxon.js.map +1 -0
  112. package/node_modules/luxon/build/global/luxon.min.js +1 -0
  113. package/node_modules/luxon/build/global/luxon.min.js.map +1 -0
  114. package/node_modules/luxon/build/node/luxon.js +7792 -0
  115. package/node_modules/luxon/build/node/luxon.js.map +1 -0
  116. package/node_modules/luxon/package.json +87 -0
  117. package/node_modules/luxon/src/datetime.js +2603 -0
  118. package/node_modules/luxon/src/duration.js +1009 -0
  119. package/node_modules/luxon/src/errors.js +61 -0
  120. package/node_modules/luxon/src/impl/conversions.js +206 -0
  121. package/node_modules/luxon/src/impl/diff.js +95 -0
  122. package/node_modules/luxon/src/impl/digits.js +94 -0
  123. package/node_modules/luxon/src/impl/english.js +233 -0
  124. package/node_modules/luxon/src/impl/formats.js +176 -0
  125. package/node_modules/luxon/src/impl/formatter.js +434 -0
  126. package/node_modules/luxon/src/impl/invalid.js +14 -0
  127. package/node_modules/luxon/src/impl/locale.js +569 -0
  128. package/node_modules/luxon/src/impl/regexParser.js +335 -0
  129. package/node_modules/luxon/src/impl/tokenParser.js +505 -0
  130. package/node_modules/luxon/src/impl/util.js +330 -0
  131. package/node_modules/luxon/src/impl/zoneUtil.js +34 -0
  132. package/node_modules/luxon/src/info.js +205 -0
  133. package/node_modules/luxon/src/interval.js +669 -0
  134. package/node_modules/luxon/src/luxon.js +26 -0
  135. package/node_modules/luxon/src/package.json +4 -0
  136. package/node_modules/luxon/src/settings.js +180 -0
  137. package/node_modules/luxon/src/zone.js +97 -0
  138. package/node_modules/luxon/src/zones/IANAZone.js +235 -0
  139. package/node_modules/luxon/src/zones/fixedOffsetZone.js +150 -0
  140. package/node_modules/luxon/src/zones/invalidZone.js +53 -0
  141. package/node_modules/luxon/src/zones/systemZone.js +61 -0
  142. package/package.json +33 -24
@@ -11,6 +11,7 @@ async function handler(event) {
11
11
  const input = JSON.parse(record.body);
12
12
  console.log({
13
13
  notice: 'Checking runner',
14
+ runnerName: input.runnerName,
14
15
  input,
15
16
  });
16
17
  const retryLater = () => result.batchItemFailures.push({ itemIdentifier: record.messageId });
@@ -20,6 +21,7 @@ async function handler(event) {
20
21
  // no need to test again as runner already finished
21
22
  console.log({
22
23
  notice: 'Runner already finished',
24
+ runnerName: input.runnerName,
23
25
  input,
24
26
  });
25
27
  continue;
@@ -46,6 +48,7 @@ async function handler(event) {
46
48
  if (!runner) {
47
49
  console.log({
48
50
  notice: 'Runner not running yet',
51
+ runnerName: input.runnerName,
49
52
  input,
50
53
  });
51
54
  retryLater();
@@ -57,6 +60,8 @@ async function handler(event) {
57
60
  if (runner.busy) {
58
61
  console.log({
59
62
  notice: 'Runner is not idle',
63
+ runnerId: runner.id,
64
+ runnerName: input.runnerName,
60
65
  input,
61
66
  });
62
67
  retryLater();
@@ -71,20 +76,30 @@ async function handler(event) {
71
76
  const now = new Date();
72
77
  const diffMs = now.getTime() - startedDate.getTime();
73
78
  console.log({
74
- notice: `Runner ${input.runnerName} started ${diffMs / 1000} seconds ago`,
79
+ notice: 'Runner is idle',
80
+ runnerId: runner.id,
81
+ runnerName: input.runnerName,
82
+ idleSeconds: diffMs / 1000,
75
83
  input,
76
84
  });
77
85
  if (diffMs > 1000 * input.maxIdleSeconds) {
78
86
  // max idle time reached, delete runner
79
87
  console.log({
80
- notice: `Runner ${input.runnerName} is idle for too long`,
88
+ notice: 'Runner is idle for too long',
89
+ runnerId: runner.id,
90
+ runnerName: input.runnerName,
91
+ idleSeconds: diffMs / 1000,
92
+ maxIdleSeconds: input.maxIdleSeconds,
81
93
  input,
82
94
  });
83
95
  try {
84
96
  // stop step function first, so it's marked as aborted with the proper error
85
97
  // if we delete the runner first, the step function will be marked as failed with a generic error
86
98
  console.log({
87
- notice: `Stopping step function ${input.executionArn}...`,
99
+ notice: 'Stopping step function',
100
+ executionArn: input.executionArn,
101
+ runnerId: runner.id,
102
+ runnerName: input.runnerName,
88
103
  input,
89
104
  });
90
105
  await sfn.send(new client_sfn_1.StopExecutionCommand({
@@ -95,7 +110,11 @@ async function handler(event) {
95
110
  }
96
111
  catch (e) {
97
112
  console.error({
98
- notice: `Failed to stop step function ${input.executionArn}: ${e}`,
113
+ notice: 'Failed to stop step function',
114
+ executionArn: input.executionArn,
115
+ runnerId: runner.id,
116
+ runnerName: input.runnerName,
117
+ error: e,
99
118
  input,
100
119
  });
101
120
  retryLater();
@@ -103,14 +122,19 @@ async function handler(event) {
103
122
  }
104
123
  try {
105
124
  console.log({
106
- notice: `Deleting runner ${runner.id}...`,
125
+ notice: 'Deleting runner',
126
+ runnerId: runner.id,
127
+ runnerName: input.runnerName,
107
128
  input,
108
129
  });
109
130
  await (0, lambda_github_1.deleteRunner)(octokit, secrets.runnerLevel, input.owner, input.repo, runner.id);
110
131
  }
111
132
  catch (e) {
112
133
  console.error({
113
- notice: `Failed to delete runner ${runner.id}: ${e}`,
134
+ notice: 'Failed to delete runner',
135
+ runnerId: runner.id,
136
+ runnerName: input.runnerName,
137
+ error: e,
114
138
  input,
115
139
  });
116
140
  retryLater();
@@ -129,6 +153,8 @@ async function handler(event) {
129
153
  // no started label? retry later (it won't retry forever as eventually the runner will stop and the step function will finish)
130
154
  console.error({
131
155
  notice: 'No `cdkghr:started:xxx` label found???',
156
+ runnerId: runner.id,
157
+ runnerName: input.runnerName,
132
158
  input,
133
159
  });
134
160
  retryLater();
@@ -136,4 +162,4 @@ async function handler(event) {
136
162
  }
137
163
  return result;
138
164
  }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS1ydW5uZXItcmVwZWFyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pZGxlLXJ1bm5lci1yZXBlYXIubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0JBLDBCQTZJQztBQTdKRCxvREFBZ0c7QUFHaEcsbURBQXFGO0FBV3JGLE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDO0FBRXJCLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBeUI7SUFDckQsTUFBTSxNQUFNLEdBQStCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQW9FLENBQUM7SUFFakcsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUEwQixDQUFDO1FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDVixNQUFNLEVBQUUsaUJBQWlCO1lBQ3pCLEtBQUs7U0FDTixDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTdGLDBDQUEwQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxxQ0FBd0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNsQyxtREFBbUQ7WUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDVixNQUFNLEVBQUUseUJBQXlCO2dCQUNqQyxLQUFL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LEVBQUU7NEJBQ3BELEtBQUs7eUJBQ04sQ0FBQyxDQUFDO3dCQUNILFVBQVUsRUFBRSxDQUFDO3dCQUNiLFNBQVM7b0JBQ1gsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04saURBQWlEO29CQUNqRCxVQUFVLEVBQUUsQ0FBQztnQkFDZixDQUFDO2dCQUVELEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2IsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsOEhBQThIO1lBQzlILE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ1osTUFBTSxFQUFFLHdDQUF3QztnQkFDaEQsS0FBSzthQUNOLENBQUMsQ0FBQztZQUNILFVBQVUsRUFBRSxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVFeGVjdXRpb25Db21tYW5kLCBTRk5DbGllbnQsIFN0b3BFeGVjdXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNmbic7XG5pbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9yZXN0JztcbmltcG9ydCAqIGFzIEFXU0xhbWJkYSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGRlbGV0ZVJ1bm5lciwgZ2V0T2N0b2tpdCwgZ2V0UnVubmVyLCBHaXRIdWJTZWNyZXRzIH0gZnJvbSAnLi9sYW1iZGEtZ2l0aHViJztcblxuaW50ZXJmYWNlIElkbGVSZWFwZXJMYW1iZGFJbnB1dCB7XG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkFybjogc3RyaW5nO1xuICByZWFkb25seSBydW5uZXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG93bmVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgaW5zdGFsbGF0aW9uSWQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heElkbGVTZWNvbmRzOiBudW1iZXI7XG59XG5cbmNvbnN0IHNmbiA9IG5ldyBTRk5DbGllbnQoKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5TUVNFdmVudCk6IFByb21pc2U8QVdTTGFtYmRhLlNRU0JhdGNoUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVzdWx0OiBBV1NMYW1iZGEuU1FTQmF0Y2hSZXNwb25zZSA9IHsgYmF0Y2hJdGVtRmFpbHVyZXM6IFtdIH07XG4gIGNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8bnVtYmVyIHwgdW5kZWZpbmVkLCB7IG9jdG9raXQ6IE9jdG9raXQ7IHNlY3JldHM6IEdpdEh1YlNlY3JldHMgfT4oKTtcblxuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KSBhcyBJZGxlUmVhcGVyTGFtYmRhSW5wdXQ7XG4gICAgY29uc29sZS5sb2coe1xuICAgICAgbm90aWNlOiAnQ2hlY2tpbmcgcnVubmVyJyxcbiAgICAgIGlucHV0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0cnlMYXRlciA9ICgpID0+IHJlc3VsdC5iYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKHsgaXRlbUlkZW50aWZpZXI6IHJlY29yZC5tZXNzYWdlSWQgfSk7XG5cbiAgICAvLyBjaGVjayBpZiBzdGVwIGZ1bmN0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgICBjb25zdCBleGVjdXRpb24gPSBhd2FpdCBzZm4uc2VuZChuZXcgRGVzY3JpYmVFeGVjdXRpb25Db21tYW5kKHsgZXhlY3V0aW9uQXJuOiBpbnB1dC5leGVjdXRpb25Bcm4gfSkpO1xuICAgIGlmIChleGVjdXRpb24uc3RhdHVzICE9ICdSVU5OSU5HJykge1xuICAgICAgLy8gbm8gbmVlZCB0byB0ZXN0IGFnYWluIGFzIHJ1bm5lciBhbHJlYWR5IGZpbmlzaGVkXG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIG5vdGljZTogJ1J1bm5lciBhbHJlYWR5IGZpbmlzaGVkJyxcbiAgICAgICAgaW5wdXQsXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGdldCBnaXRodWIgYWNjZXNzXG4gICAgbGV0IG9jdG9raXQ6IE9jdG9raXQ7XG4gICAgbGV0IHNlY3JldHM6IEdpdEh1YlNlY3JldHM7XG4gICAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChpbnB1dC5pbnN0YWxsYXRpb25JZCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgLy8gdXNlIGNhY2hlZCBvY3Rva2l0XG4gICAgICBvY3Rva2l0ID0gY2FjaGVkLm9jdG9raXQ7XG4gICAgICBzZWNyZXRzID0gY2FjaGVkLnNlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGdldE9jdG9raXQgY2FsbHMgc2VjcmV0cyBtYW5hZ2VyIGFuZCBHaXRodWIgQVBJIGV2ZXJ5IHRpbWUsIHNvIGNhY2hlIHRoZSByZXN1bHRcbiAgICAgIC8vIHRoaXMgaGFuZGxlciBjYW4gd29yayBvbiBtdWx0aXBsZSBydW5uZXJzIGF0IG9uY2UsIHNvIGNhY2hpbmcgaXMgaW1wb3J0YW50XG4gICAgICBjb25zdCB7IG9jdG9raXQ6IG5ld09jdG9raXQsIGdpdGh1YlNlY3JldHM6IG5ld1NlY3JldHMgfSA9IGF3YWl0IGdldE9jdG9raXQoaW5wdXQuaW5zdGFsbGF0aW9uSWQpO1xuICAgICAgb2N0b2tpdCA9IG5ld09jdG9raXQ7XG4gICAgICBzZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICAgIG9jdG9raXRDYWNoZS5zZXQoaW5wdXQuaW5zdGFsbGF0aW9uSWQsIHsgb2N0b2tpdCwgc2VjcmV0cyB9KTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIHJ1bm5lclxuICAgIGNvbnN0IHJ1bm5lciA9IGF3YWl0IGdldFJ1bm5lcihvY3Rva2l0LCBzZWNyZXRzLnJ1bm5lckxldmVsLCBpbnB1dC5vd25lciwgaW5wdXQucmVwbywgaW5wdXQucnVubmVyTmFtZSk7XG4gICAgaWYgKCFydW5uZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgbm90aWNlOiAnUnVubmVyIG5vdCBydW5uaW5nIHlldCcsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSk7XG4gICAgICByZXRyeUxhdGVyKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBub3QgaWRsZSwgdHJ5IGFnYWluIGxhdGVyXG4gICAgLy8gd2Ugd2FudCB0byB0cnkgYWdhaW4gYmVjYXVzZSB0aGUgcnVubmVyIG1pZ2h0IGJlIHJldHJpZWQgZHVlIHRvIGUuZy4gbGFtYmRhIHRpbWVvdXRcbiAgICAvLyB3ZSBuZWVkIHRvIGtlZXAgZm9sbG93aW5nIHRoZSByZXRyeSB0b28gYW5kIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGdvIGlkbGVcbiAgICBpZiAocnVubmVyLmJ1c3kpIHtcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgbm90aWNlOiAnUnVubmVyIGlzIG5vdCBpZGxlJyxcbiAgICAgICAgaW5wdXQsXG4gICAgICB9KTtcbiAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIG1heCBpZGxlIHRpbWVvdXQgaGFzIHJlYWNoZWRcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIHJ1bm5lci5sYWJlbHMpIHtcbiAgICAgIGlmIChsYWJlbC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnY2RrZ2hyOnN0YXJ0ZWQ6JykpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRlZCA9IHBhcnNlRmxvYXQobGFiZWwubmFtZS5zcGxpdCgnOicpWzJdKTtcbiAgICAgICAgY29uc3Qgc3RhcnRlZERhdGUgPSBuZXcgRGF0ZShzdGFydGVkICogMTAwMCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IGRpZmZNcyA9IG5vdy5nZXRUaW1lKCkgLSBzdGFydGVkRGF0ZS5nZXRUaW1lKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgIG5vdGljZTogYFJ1bm5lciAke2lucHV0LnJ1bm5lck5hbWV9IHN0YXJ0ZWQgJHtkaWZmTXMgLyAxMDAwfSBzZWNvbmRzIGFnb2AsXG4gICAgICAgICAgaW5wdXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaWZmTXMgPiAxMDAwICogaW5wdXQubWF4SWRsZVNlY29uZHMpIHtcbiAgICAgICAgICAvLyBtYXggaWRsZSB0aW1lIHJlYWNoZWQsIGRlbGV0ZSBydW5uZXJcbiAgICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgICBub3RpY2U6IGBSdW5uZXIgJHtpbnB1dC5ydW5uZXJOYW1lfSBpcyBpZGxlIGZvciB0b28gbG9uZ2AsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBzdG9wIHN0ZXAgZnVuY3Rpb24gZmlyc3QsIHNvIGl0J3MgbWFya2VkIGFzIGFib3J0ZWQgd2l0aCB0aGUgcHJvcGVyIGVycm9yXG4gICAgICAgICAgICAvLyBpZiB3ZSBkZWxldGUgdGhlIHJ1bm5lciBmaXJzdCwgdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBtYXJrZWQgYXMgZmFpbGVkIHdpdGggYSBnZW5lcmljIGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgICAgIG5vdGljZTogYFN0b3BwaW5nIHN0ZXAgZnVuY3Rpb24gJHtpbnB1dC5leGVjdXRpb25Bcm59Li4uYCxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHNmbi5zZW5kKG5ldyBTdG9wRXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkFybjogaW5wdXQuZXhlY3V0aW9uQXJuLFxuICAgICAgICAgICAgICBlcnJvcjogJ0lkbGVSdW5uZXInLFxuICAgICAgICAgICAgICBjYXVzZTogYFJ1bm5lciAke2lucHV0LnJ1bm5lck5hbWV9IG9uICR7aW5wdXQub3duZXJ9LyR7aW5wdXQucmVwb30gaXMgaWRsZSBmb3IgdG9vIGxvbmcgKCR7ZGlmZk1zIC8gMTAwMH0gc2Vjb25kcyBhbmQgbGltaXQgaXMgJHtpbnB1dC5tYXhJZGxlU2Vjb25kc30gc2Vjb25kcylgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioe1xuICAgICAgICAgICAgICBub3RpY2U6IGBGYWlsZWQgdG8gc3RvcCBzdGVwIGZ1bmN0aW9uICR7aW5wdXQuZXhlY3V0aW9uQXJufTogJHtlfWAsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXRyeUxhdGVyKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgICAgICBub3RpY2U6IGBEZWxldGluZyBydW5uZXIgJHtydW5uZXIuaWR9Li4uYCxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZVJ1bm5lcihvY3Rva2l0LCBzZWNyZXRzLnJ1bm5lckxldmVsLCBpbnB1dC5vd25lciwgaW5wdXQucmVwbywgcnVubmVyLmlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHtcbiAgICAgICAgICAgICAgbm90aWNlOiBgRmFpbGVkIHRvIGRlbGV0ZSBydW5uZXIgJHtydW5uZXIuaWR9OiAke2V9YCxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdGlsbCBpZGxlLCB0aW1lb3V0IG5vdCByZWFjaGVkIC0tIHJldHJ5IGxhdGVyXG4gICAgICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAvLyBubyBzdGFydGVkIGxhYmVsPyByZXRyeSBsYXRlciAoaXQgd29uJ3QgcmV0cnkgZm9yZXZlciBhcyBldmVudHVhbGx5IHRoZSBydW5uZXIgd2lsbCBzdG9wIGFuZCB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGZpbmlzaClcbiAgICAgIGNvbnNvbGUuZXJyb3Ioe1xuICAgICAgICBub3RpY2U6ICdObyBgY2RrZ2hyOnN0YXJ0ZWQ6eHh4YCBsYWJlbCBmb3VuZD8/PycsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSk7XG4gICAgICByZXRyeUxhdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS1ydW5uZXItcmVwZWFyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pZGxlLXJ1bm5lci1yZXBlYXIubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0JBLDBCQXVLQztBQXZMRCxvREFBZ0c7QUFHaEcsbURBQXFGO0FBV3JGLE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDO0FBRXJCLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBeUI7SUFDckQsTUFBTSxNQUFNLEdBQStCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQW9FLENBQUM7SUFFakcsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUEwQixDQUFDO1FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDVixNQUFNLEVBQUUsaUJBQWlCO1lBQ3pCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUU3RiwwQ0FBMEM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUkscUNBQXdCLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEMsbURBQW1EO1lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JB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TSxDQUFDLEVBQUU7Z0JBQ25CLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsS0FBSzthQUNOLENBQUMsQ0FBQztZQUNILFVBQVUsRUFBRSxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVFeGVjdXRpb25Db21tYW5kLCBTRk5DbGllbnQsIFN0b3BFeGVjdXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNmbic7XG5pbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9yZXN0JztcbmltcG9ydCAqIGFzIEFXU0xhbWJkYSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGRlbGV0ZVJ1bm5lciwgZ2V0T2N0b2tpdCwgZ2V0UnVubmVyLCBHaXRIdWJTZWNyZXRzIH0gZnJvbSAnLi9sYW1iZGEtZ2l0aHViJztcblxuaW50ZXJmYWNlIElkbGVSZWFwZXJMYW1iZGFJbnB1dCB7XG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkFybjogc3RyaW5nO1xuICByZWFkb25seSBydW5uZXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG93bmVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgaW5zdGFsbGF0aW9uSWQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heElkbGVTZWNvbmRzOiBudW1iZXI7XG59XG5cbmNvbnN0IHNmbiA9IG5ldyBTRk5DbGllbnQoKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5TUVNFdmVudCk6IFByb21pc2U8QVdTTGFtYmRhLlNRU0JhdGNoUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVzdWx0OiBBV1NMYW1iZGEuU1FTQmF0Y2hSZXNwb25zZSA9IHsgYmF0Y2hJdGVtRmFpbHVyZXM6IFtdIH07XG4gIGNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8bnVtYmVyIHwgdW5kZWZpbmVkLCB7IG9jdG9raXQ6IE9jdG9raXQ7IHNlY3JldHM6IEdpdEh1YlNlY3JldHMgfT4oKTtcblxuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgY29uc3QgaW5wdXQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KSBhcyBJZGxlUmVhcGVyTGFtYmRhSW5wdXQ7XG4gICAgY29uc29sZS5sb2coe1xuICAgICAgbm90aWNlOiAnQ2hlY2tpbmcgcnVubmVyJyxcbiAgICAgIHJ1bm5lck5hbWU6IGlucHV0LnJ1bm5lck5hbWUsXG4gICAgICBpbnB1dCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHJ5TGF0ZXIgPSAoKSA9PiByZXN1bHQuYmF0Y2hJdGVtRmFpbHVyZXMucHVzaCh7IGl0ZW1JZGVudGlmaWVyOiByZWNvcmQubWVzc2FnZUlkIH0pO1xuXG4gICAgLy8gY2hlY2sgaWYgc3RlcCBmdW5jdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gICAgY29uc3QgZXhlY3V0aW9uID0gYXdhaXQgc2ZuLnNlbmQobmV3IERlc2NyaWJlRXhlY3V0aW9uQ29tbWFuZCh7IGV4ZWN1dGlvbkFybjogaW5wdXQuZXhlY3V0aW9uQXJuIH0pKTtcbiAgICBpZiAoZXhlY3V0aW9uLnN0YXR1cyAhPSAnUlVOTklORycpIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gdGVzdCBhZ2FpbiBhcyBydW5uZXIgYWxyZWFkeSBmaW5pc2hlZFxuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBub3RpY2U6ICdSdW5uZXIgYWxyZWFkeSBmaW5pc2hlZCcsXG4gICAgICAgIHJ1bm5lck5hbWU6IGlucHV0LnJ1bm5lck5hbWUsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBnZXQgZ2l0aHViIGFjY2Vzc1xuICAgIGxldCBvY3Rva2l0OiBPY3Rva2l0O1xuICAgIGxldCBzZWNyZXRzOiBHaXRIdWJTZWNyZXRzO1xuICAgIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoaW5wdXQuaW5zdGFsbGF0aW9uSWQpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIC8vIHVzZSBjYWNoZWQgb2N0b2tpdFxuICAgICAgb2N0b2tpdCA9IGNhY2hlZC5vY3Rva2l0O1xuICAgICAgc2VjcmV0cyA9IGNhY2hlZC5zZWNyZXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBnZXRPY3Rva2l0IGNhbGxzIHNlY3JldHMgbWFuYWdlciBhbmQgR2l0aHViIEFQSSBldmVyeSB0aW1lLCBzbyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICAvLyB0aGlzIGhhbmRsZXIgY2FuIHdvcmsgb24gbXVsdGlwbGUgcnVubmVycyBhdCBvbmNlLCBzbyBjYWNoaW5nIGlzIGltcG9ydGFudFxuICAgICAgY29uc3QgeyBvY3Rva2l0OiBuZXdPY3Rva2l0LCBnaXRodWJTZWNyZXRzOiBuZXdTZWNyZXRzIH0gPSBhd2FpdCBnZXRPY3Rva2l0KGlucHV0Lmluc3RhbGxhdGlvbklkKTtcbiAgICAgIG9jdG9raXQgPSBuZXdPY3Rva2l0O1xuICAgICAgc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgICBvY3Rva2l0Q2FjaGUuc2V0KGlucHV0Lmluc3RhbGxhdGlvbklkLCB7IG9jdG9raXQsIHNlY3JldHMgfSk7XG4gICAgfVxuXG4gICAgLy8gZmluZCBydW5uZXJcbiAgICBjb25zdCBydW5uZXIgPSBhd2FpdCBnZXRSdW5uZXIob2N0b2tpdCwgc2VjcmV0cy5ydW5uZXJMZXZlbCwgaW5wdXQub3duZXIsIGlucHV0LnJlcG8sIGlucHV0LnJ1bm5lck5hbWUpO1xuICAgIGlmICghcnVubmVyKSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIG5vdGljZTogJ1J1bm5lciBub3QgcnVubmluZyB5ZXQnLFxuICAgICAgICBydW5uZXJOYW1lOiBpbnB1dC5ydW5uZXJOYW1lLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gaWYgbm90IGlkbGUsIHRyeSBhZ2FpbiBsYXRlclxuICAgIC8vIHdlIHdhbnQgdG8gdHJ5IGFnYWluIGJlY2F1c2UgdGhlIHJ1bm5lciBtaWdodCBiZSByZXRyaWVkIGR1ZSB0byBlLmcuIGxhbWJkYSB0aW1lb3V0XG4gICAgLy8gd2UgbmVlZCB0byBrZWVwIGZvbGxvd2luZyB0aGUgcmV0cnkgdG9vIGFuZCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBpZGxlXG4gICAgaWYgKHJ1bm5lci5idXN5KSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIG5vdGljZTogJ1J1bm5lciBpcyBub3QgaWRsZScsXG4gICAgICAgIHJ1bm5lcklkOiBydW5uZXIuaWQsXG4gICAgICAgIHJ1bm5lck5hbWU6IGlucHV0LnJ1bm5lck5hbWUsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSk7XG4gICAgICByZXRyeUxhdGVyKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiBtYXggaWRsZSB0aW1lb3V0IGhhcyByZWFjaGVkXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBsYWJlbCBvZiBydW5uZXIubGFiZWxzKSB7XG4gICAgICBpZiAobGFiZWwubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2Nka2docjpzdGFydGVkOicpKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBwYXJzZUZsb2F0KGxhYmVsLm5hbWUuc3BsaXQoJzonKVsyXSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ZWREYXRlID0gbmV3IERhdGUoc3RhcnRlZCAqIDEwMDApO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBkaWZmTXMgPSBub3cuZ2V0VGltZSgpIC0gc3RhcnRlZERhdGUuZ2V0VGltZSgpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICBub3RpY2U6ICdSdW5uZXIgaXMgaWRsZScsXG4gICAgICAgICAgcnVubmVySWQ6IHJ1bm5lci5pZCxcbiAgICAgICAgICBydW5uZXJOYW1lOiBpbnB1dC5ydW5uZXJOYW1lLFxuICAgICAgICAgIGlkbGVTZWNvbmRzOiBkaWZmTXMgLyAxMDAwLFxuICAgICAgICAgIGlucHV0LFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZGlmZk1zID4gMTAwMCAqIGlucHV0Lm1heElkbGVTZWNvbmRzKSB7XG4gICAgICAgICAgLy8gbWF4IGlkbGUgdGltZSByZWFjaGVkLCBkZWxldGUgcnVubmVyXG4gICAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgICAgbm90aWNlOiAnUnVubmVyIGlzIGlkbGUgZm9yIHRvbyBsb25nJyxcbiAgICAgICAgICAgIHJ1bm5lcklkOiBydW5uZXIuaWQsXG4gICAgICAgICAgICBydW5uZXJOYW1lOiBpbnB1dC5ydW5uZXJOYW1lLFxuICAgICAgICAgICAgaWRsZVNlY29uZHM6IGRpZmZNcyAvIDEwMDAsXG4gICAgICAgICAgICBtYXhJZGxlU2Vjb25kczogaW5wdXQubWF4SWRsZVNlY29uZHMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBzdG9wIHN0ZXAgZnVuY3Rpb24gZmlyc3QsIHNvIGl0J3MgbWFya2VkIGFzIGFib3J0ZWQgd2l0aCB0aGUgcHJvcGVyIGVycm9yXG4gICAgICAgICAgICAvLyBpZiB3ZSBkZWxldGUgdGhlIHJ1bm5lciBmaXJzdCwgdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBtYXJrZWQgYXMgZmFpbGVkIHdpdGggYSBnZW5lcmljIGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgICAgIG5vdGljZTogJ1N0b3BwaW5nIHN0ZXAgZnVuY3Rpb24nLFxuICAgICAgICAgICAgICBleGVjdXRpb25Bcm46IGlucHV0LmV4ZWN1dGlvbkFybixcbiAgICAgICAgICAgICAgcnVubmVySWQ6IHJ1bm5lci5pZCxcbiAgICAgICAgICAgICAgcnVubmVyTmFtZTogaW5wdXQucnVubmVyTmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHNmbi5zZW5kKG5ldyBTdG9wRXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkFybjogaW5wdXQuZXhlY3V0aW9uQXJuLFxuICAgICAgICAgICAgICBlcnJvcjogJ0lkbGVSdW5uZXInLFxuICAgICAgICAgICAgICBjYXVzZTogYFJ1bm5lciAke2lucHV0LnJ1bm5lck5hbWV9IG9uICR7aW5wdXQub3duZXJ9LyR7aW5wdXQucmVwb30gaXMgaWRsZSBmb3IgdG9vIGxvbmcgKCR7ZGlmZk1zIC8gMTAwMH0gc2Vjb25kcyBhbmQgbGltaXQgaXMgJHtpbnB1dC5tYXhJZGxlU2Vjb25kc30gc2Vjb25kcylgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioe1xuICAgICAgICAgICAgICBub3RpY2U6ICdGYWlsZWQgdG8gc3RvcCBzdGVwIGZ1bmN0aW9uJyxcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQXJuOiBpbnB1dC5leGVjdXRpb25Bcm4sXG4gICAgICAgICAgICAgIHJ1bm5lcklkOiBydW5uZXIuaWQsXG4gICAgICAgICAgICAgIHJ1bm5lck5hbWU6IGlucHV0LnJ1bm5lck5hbWUsXG4gICAgICAgICAgICAgIGVycm9yOiBlLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICAgICAgbm90aWNlOiAnRGVsZXRpbmcgcnVubmVyJyxcbiAgICAgICAgICAgICAgcnVubmVySWQ6IHJ1bm5lci5pZCxcbiAgICAgICAgICAgICAgcnVubmVyTmFtZTogaW5wdXQucnVubmVyTmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZVJ1bm5lcihvY3Rva2l0LCBzZWNyZXRzLnJ1bm5lckxldmVsLCBpbnB1dC5vd25lciwgaW5wdXQucmVwbywgcnVubmVyLmlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHtcbiAgICAgICAgICAgICAgbm90aWNlOiAnRmFpbGVkIHRvIGRlbGV0ZSBydW5uZXInLFxuICAgICAgICAgICAgICBydW5uZXJJZDogcnVubmVyLmlkLFxuICAgICAgICAgICAgICBydW5uZXJOYW1lOiBpbnB1dC5ydW5uZXJOYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogZSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdGlsbCBpZGxlLCB0aW1lb3V0IG5vdCByZWFjaGVkIC0tIHJldHJ5IGxhdGVyXG4gICAgICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAvLyBubyBzdGFydGVkIGxhYmVsPyByZXRyeSBsYXRlciAoaXQgd29uJ3QgcmV0cnkgZm9yZXZlciBhcyBldmVudHVhbGx5IHRoZSBydW5uZXIgd2lsbCBzdG9wIGFuZCB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGZpbmlzaClcbiAgICAgIGNvbnNvbGUuZXJyb3Ioe1xuICAgICAgICBub3RpY2U6ICdObyBgY2RrZ2hyOnN0YXJ0ZWQ6eHh4YCBsYWJlbCBmb3VuZD8/PycsXG4gICAgICAgIHJ1bm5lcklkOiBydW5uZXIuaWQsXG4gICAgICAgIHJ1bm5lck5hbWU6IGlucHV0LnJ1bm5lck5hbWUsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSk7XG4gICAgICByZXRyeUxhdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -43,5 +43,5 @@ class RunnerImageBuilder extends common_1.RunnerImageBuilderBase {
43
43
  }
44
44
  exports.RunnerImageBuilder = RunnerImageBuilder;
45
45
  _a = JSII_RTTI_SYMBOL_1;
46
- RunnerImageBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerImageBuilder", version: "0.14.24" };
46
+ RunnerImageBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerImageBuilder", version: "0.15.1" };
47
47
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUEwQztBQUUxQywyREFBd0U7QUFDeEUsMkNBQTBEO0FBQzFELHFDQUFvSTtBQUNwSSw0Q0FBa0M7QUFFbEM7Ozs7OztHQU1HO0FBQ0gsTUFBc0Isa0JBQW1CLFNBQVEsK0JBQXNCO0lBQ3JFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN0RSxJQUFJLEtBQUssRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLHlCQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrSEFBa0gsQ0FBQyxDQUFDO1FBQ3ZKLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxXQUFXLEtBQUssK0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0QsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQUksS0FBSyxFQUFFLFdBQVcsS0FBSywrQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNFLE9BQU8sSUFBSSxxREFBaUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxJQUFJLGNBQUUsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUkscURBQWlDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDOztBQXZCSCxnREF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQXdzSW1hZ2VCdWlsZGVyUnVubmVySW1hZ2VCdWlsZGVyIH0gZnJvbSAnLi9hd3MtaW1hZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXIgfSBmcm9tICcuL2NvZGVidWlsZCc7XG5pbXBvcnQgeyBJQ29uZmlndXJhYmxlUnVubmVySW1hZ2VCdWlsZGVyLCBSdW5uZXJJbWFnZUJ1aWxkZXJCYXNlLCBSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcywgUnVubmVySW1hZ2VCdWlsZGVyVHlwZSB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IE9zIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiBHaXRIdWIgUnVubmVyIGltYWdlIGJ1aWxkZXIuIEJ1aWxkcyBhIERvY2tlciBpbWFnZSBvciBBTUkgd2l0aCBHaXRIdWIgUnVubmVyIGFuZCBvdGhlciByZXF1aXJlbWVudHMgaW5zdGFsbGVkLlxuICpcbiAqIEltYWdlcyBjYW4gYmUgY3VzdG9taXplZCBiZWZvcmUgcGFzc2VkIGludG8gdGhlIHByb3ZpZGVyIGJ5IGFkZGluZyBvciByZW1vdmluZyBjb21wb25lbnRzIHRvIGJlIGluc3RhbGxlZC5cbiAqXG4gKiBJbWFnZXMgYXJlIHJlYnVpbHQgZXZlcnkgd2VlayBieSBkZWZhdWx0IHRvIGVuc3VyZSB0aGF0IHRoZSBsYXRlc3Qgc2VjdXJpdHkgcGF0Y2hlcyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJ1bm5lckltYWdlQnVpbGRlciBleHRlbmRzIFJ1bm5lckltYWdlQnVpbGRlckJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ1aWxkZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMuIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGRpZmZlciBiYXNlZCBvbiB0aGUgT1MsIGFyY2hpdGVjdHVyZSwgYW5kIHJlcXVlc3RlZCBidWlsZGVyIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgbmV3KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogUnVubmVySW1hZ2VCdWlsZGVyUHJvcHMpOiBJQ29uZmlndXJhYmxlUnVubmVySW1hZ2VCdWlsZGVyIHtcbiAgICBpZiAocHJvcHM/LmNvbXBvbmVudHMgJiYgcHJvcHMucnVubmVyVmVyc2lvbikge1xuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmcoJ3J1bm5lclZlcnNpb24gaXMgaWdub3JlZCB3aGVuIGNvbXBvbmVudHMgYXJlIHNwZWNpZmllZC4gVGhlIHJ1bm5lciB2ZXJzaW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29tcG9uZW50cy4nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmJ1aWxkZXJUeXBlID09PSBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkNPREVfQlVJTEQpIHtcbiAgICAgIHJldHVybiBuZXcgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAocHJvcHM/LmJ1aWxkZXJUeXBlID09PSBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkFXU19JTUFHRV9CVUlMREVSKSB7XG4gICAgICByZXR1cm4gbmV3IEF3c0ltYWdlQnVpbGRlclJ1bm5lckltYWdlQnVpbGRlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcyA9IHByb3BzPy5vcyA/PyBPcy5MSU5VWF9VQlVOVFU7XG4gICAgaWYgKG9zLmlzSW4oT3MuX0FMTF9MSU5VWF9WRVJTSU9OUykpIHtcbiAgICAgIHJldHVybiBuZXcgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICAgIHJldHVybiBuZXcgQXdzSW1hZ2VCdWlsZGVyUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIHJ1bm5lciBpbWFnZSBidWlsZGVyIGltcGxlbWVudGF0aW9uIGZvciAke29zLm5hbWV9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,6 +1,7 @@
1
1
  import * as ecr from 'aws-cdk-lib/aws-ecr';
2
2
  import * as ssm from 'aws-cdk-lib/aws-ssm';
3
3
  import { Construct } from 'constructs';
4
+ import { Architecture, Os } from '../../providers';
4
5
  /**
5
6
  * Type that can be used to specify a base image - either a string (deprecated) or a BaseImage object.
6
7
  *
@@ -56,6 +57,18 @@ export declare class BaseImage {
56
57
  * @param baseImageString The base image as a direct string value
57
58
  */
58
59
  static fromString(baseImageString: string): BaseImage;
60
+ /**
61
+ * A base AMI with NVIDIA drivers pre-installed for GPU workloads.
62
+ *
63
+ * Uses AWS Deep Learning AMIs for Linux (Ubuntu, Amazon Linux 2, Amazon Linux 2023).
64
+ * For Windows, subscribe to NVIDIA RTX Virtual Workstation in AWS Marketplace, then use
65
+ * {@link fromMarketplaceProductId} with the product ID.
66
+ *
67
+ * @param os Target operating system
68
+ * @param architecture Target architecture
69
+ * @throws Error if the OS/architecture combo has no GPU base AMI
70
+ */
71
+ static fromGpuBase(os: Os, architecture: Architecture): BaseImage;
59
72
  /**
60
73
  * The rendered base image to use
61
74
  */
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.BaseContainerImage = exports.BaseImage = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const cdk = require("aws-cdk-lib");
7
+ const providers_1 = require("../../providers");
7
8
  /**
8
9
  * Represents a base image that is used to start from in EC2 Image Builder image builds.
9
10
  *
@@ -69,13 +70,45 @@ class BaseImage {
69
70
  static fromString(baseImageString) {
70
71
  return new BaseImage(baseImageString);
71
72
  }
73
+ /**
74
+ * A base AMI with NVIDIA drivers pre-installed for GPU workloads.
75
+ *
76
+ * Uses AWS Deep Learning AMIs for Linux (Ubuntu, Amazon Linux 2, Amazon Linux 2023).
77
+ * For Windows, subscribe to NVIDIA RTX Virtual Workstation in AWS Marketplace, then use
78
+ * {@link fromMarketplaceProductId} with the product ID.
79
+ *
80
+ * @param os Target operating system
81
+ * @param architecture Target architecture
82
+ * @throws Error if the OS/architecture combo has no GPU base AMI
83
+ */
84
+ static fromGpuBase(os, architecture) {
85
+ const arch = architecture.is(providers_1.Architecture.X86_64) ? 'x86_64' : 'arm64';
86
+ if (os.is(providers_1.Os.LINUX_UBUNTU) || os.is(providers_1.Os.LINUX_UBUNTU_2204) || os.is(providers_1.Os.LINUX)) {
87
+ return BaseImage.fromSsmParameterName(`/aws/service/deeplearning/ami/${arch}/base-oss-nvidia-driver-gpu-ubuntu-22.04/latest/ami-id`);
88
+ }
89
+ if (os.is(providers_1.Os.LINUX_UBUNTU_2404)) {
90
+ return BaseImage.fromSsmParameterName(`/aws/service/deeplearning/ami/${arch}/base-oss-nvidia-driver-gpu-ubuntu-24.04/latest/ami-id`);
91
+ }
92
+ if (os.is(providers_1.Os.LINUX_AMAZON_2)) {
93
+ return BaseImage.fromSsmParameterName(`/aws/service/deeplearning/ami/${arch}/base-oss-nvidia-driver-amazon-linux-2/latest/ami-id`);
94
+ }
95
+ if (os.is(providers_1.Os.LINUX_AMAZON_2023)) {
96
+ return BaseImage.fromSsmParameterName(`/aws/service/deeplearning/ami/${arch}/base-oss-nvidia-driver-gpu-amazon-linux-2023/latest/ami-id`);
97
+ }
98
+ if (os.is(providers_1.Os.WINDOWS) && architecture.is(providers_1.Architecture.X86_64)) {
99
+ throw new Error('No GPU base AMI for Windows. Subscribe to NVIDIA RTX Virtual Workstation (WinServer 2022) at ' +
100
+ 'https://aws.amazon.com/marketplace/pp/prodview-f4reygwmtxipu (free), then use ' +
101
+ "`baseAmi: BaseImage.fromMarketplaceProductId('prod-77u2eeb33lmrm')` (other AMIs with NVIDIA drivers installed can also be used).");
102
+ }
103
+ throw new Error(`No GPU base AMI for ${os.name} / ${architecture.name}.`);
104
+ }
72
105
  constructor(image) {
73
106
  this.image = image;
74
107
  }
75
108
  }
76
109
  exports.BaseImage = BaseImage;
77
110
  _a = JSII_RTTI_SYMBOL_1;
78
- BaseImage[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.BaseImage", version: "0.14.24" };
111
+ BaseImage[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.BaseImage", version: "0.15.1" };
79
112
  /**
80
113
  * Represents a base container image that is used to start from in EC2 Image Builder container builds.
81
114
  *
@@ -126,5 +159,5 @@ class BaseContainerImage {
126
159
  }
127
160
  exports.BaseContainerImage = BaseContainerImage;
128
161
  _b = JSII_RTTI_SYMBOL_1;
129
- BaseContainerImage[_b] = { fqn: "@cloudsnorkel/cdk-github-runners.BaseContainerImage", version: "0.14.24" };
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbWFnZS1idWlsZGVycy9hd3MtaW1hZ2UtYnVpbGRlci9iYXNlLWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBY25DOzs7O0dBSUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBYTtRQUNuQyxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFnQixFQUFFLFlBQW9CLEVBQUUsVUFBa0IsT0FBTztRQUM5RixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbkMsT0FBTyxFQUFFLGNBQWM7WUFDdkIsUUFBUSxFQUFFLE9BQU87WUFDakIsT0FBTyxFQUFFLEtBQUs7WUFDZCxZQUFZLEVBQUUsR0FBRyxZQUFZLElBQUksT0FBTyxFQUFFO1NBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsU0FBaUI7UUFDdEQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUF5QjtRQUN0RCxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsYUFBcUI7UUFDdEQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxPQUFPLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUF1QjtRQUM5QyxPQUFPLElBQUksU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFPRCxZQUFzQixLQUFhO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7O0FBekVILDhCQTBFQzs7O0FBV0Q7Ozs7R0FJRztBQUNILE1BQWEsa0JBQWtCO0lBQzdCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFrQixFQUFFLEdBQVc7UUFDekQsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsVUFBVSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUEyQixFQUFFLEdBQVc7UUFDNUQsT0FBTyxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFxQixFQUFFLGNBQXNCLEVBQUUsR0FBVztRQUNwRixPQUFPLElBQUksa0JBQWtCLENBQUMsa0JBQWtCLGFBQWEsSUFBSSxjQUFjLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLHdCQUFnQztRQUN2RCxPQUFPLElBQUksa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBYUQsWUFBc0IsS0FBYSxFQUFFLGFBQStCO1FBQ2xFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3JDLENBQUM7O0FBeERILGdEQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlY3IgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUeXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGJhc2UgaW1hZ2UgLSBlaXRoZXIgYSBzdHJpbmcgKGRlcHJlY2F0ZWQpIG9yIGEgQmFzZUltYWdlIG9iamVjdC5cbiAqXG4gKiBUbyBjcmVhdGUgYSBCYXNlSW1hZ2Ugb2JqZWN0LCB1c2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgbGlrZSBCYXNlSW1hZ2UuZnJvbUFtaUlkKCkuXG4gKlxuICogTm90ZTogU3RyaW5nIHN1cHBvcnQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFVzZSBCYXNlSW1hZ2Ugc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBpbnN0ZWFkLlxuICovXG5leHBvcnQgdHlwZSBCYXNlSW1hZ2VJbnB1dCA9IHN0cmluZyB8IEJhc2VJbWFnZTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgYmFzZSBpbWFnZSB0aGF0IGlzIHVzZWQgdG8gc3RhcnQgZnJvbSBpbiBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZSBidWlsZHMuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBhZGFwdGVkIGZyb20gQVdTIENESydzIEJhc2VJbWFnZSBjbGFzcyB0byBzdXBwb3J0IGJvdGggc3RyaW5nIGFuZCBvYmplY3QgaW5wdXRzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZUltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBBTUkgSUQgdG8gdXNlIGFzIGEgYmFzZSBpbWFnZSBpbiBhbiBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIGFtaUlkIFRoZSBBTUkgSUQgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BbWlJZChhbWlJZDogc3RyaW5nKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShhbWlJZCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gQVdTLXByb3ZpZGVkIEVDMiBJbWFnZSBCdWlsZGVyIGltYWdlIHRvIHVzZSBhcyBhIGJhc2UgaW1hZ2UgaW4gYW4gaW1hZ2UgcmVjaXBlLlxuICAgKlxuICAgKiBUaGlzIGNvbnN0cnVjdHMgYW4gSW1hZ2UgQnVpbGRlciBBUk4gZm9yIEFXUy1wcm92aWRlZCBpbWFnZXMgbGlrZSBgdWJ1bnR1LXNlcnZlci0yMi1sdHMteDg2L3gueC54YC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGUgKHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFjayBhbmQgcmVnaW9uKVxuICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIFRoZSBJbWFnZSBCdWlsZGVyIHJlc291cmNlIG5hbWUgcGF0dGVybiAoZS5nLiwgYHVidW50dS1zZXJ2ZXItMjItbHRzLXg4NmAgb3IgYHVidW50dS1zZXJ2ZXItMjItbHRzLSR7YXJjaH1gKVxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBwYXR0ZXJuIChkZWZhdWx0cyB0byBgeC54LnhgIHRvIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24pXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbWFnZUJ1aWxkZXIoc2NvcGU6IENvbnN0cnVjdCwgcmVzb3VyY2VOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyA9ICd4LngueCcpOiBCYXNlSW1hZ2Uge1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHNjb3BlKTtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2ltYWdlJyxcbiAgICAgIGFjY291bnQ6ICdhd3MnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LyR7dmVyc2lvbn1gLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWFya2V0cGxhY2UgcHJvZHVjdCBJRCBmb3IgYW4gQU1JIHByb2R1Y3QgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlIGluIGFuIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAcGFyYW0gcHJvZHVjdElkIFRoZSBNYXJrZXRwbGFjZSBBTUkgcHJvZHVjdCBJRCB0byB1c2UgYXMgdGhlIGJhc2UgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU1hcmtldHBsYWNlUHJvZHVjdElkKHByb2R1Y3RJZDogc3RyaW5nKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShwcm9kdWN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIHRvIHVzZSBhcyB0aGUgYmFzZSBpbWFnZSBpbiBhbiBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtZXRlciBUaGUgU1NNIHBhcmFtZXRlciB0byB1c2UgYXMgdGhlIGJhc2UgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNzbVBhcmFtZXRlcihwYXJhbWV0ZXI6IHNzbS5JUGFyYW1ldGVyKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShgc3NtOiR7cGFyYW1ldGVyLnBhcmFtZXRlckFybn1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBTU00gcGFyYW1ldGVyIHRvIHVzZSBhcyB0aGUgYmFzZSBpbWFnZSBpbiBhbiBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIFNTTSBwYXJhbWV0ZXIgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Tc21QYXJhbWV0ZXJOYW1lKHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IEJhc2VJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBCYXNlSW1hZ2UoYHNzbToke3BhcmFtZXRlck5hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpcmVjdCBzdHJpbmcgdmFsdWUgb2YgdGhlIGJhc2UgaW1hZ2UgdG8gdXNlIGluIGFuIGltYWdlIHJlY2lwZS4gVGhpcyBjYW4gYmUgYW4gRUMyIEltYWdlIEJ1aWxkZXIgaW1hZ2UgQVJOLFxuICAgKiBhbiBTU00gcGFyYW1ldGVyLCBhbiBBV1MgTWFya2V0cGxhY2UgcHJvZHVjdCBJRCwgb3IgYW4gQU1JIElELlxuICAgKlxuICAgKiBAcGFyYW0gYmFzZUltYWdlU3RyaW5nIFRoZSBiYXNlIGltYWdlIGFzIGEgZGlyZWN0IHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKGJhc2VJbWFnZVN0cmluZzogc3RyaW5nKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShiYXNlSW1hZ2VTdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCBiYXNlIGltYWdlIHRvIHVzZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGltYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGJhc2UgY29udGFpbmVyIGltYWdlIC0gZWl0aGVyIGEgc3RyaW5nIChkZXByZWNhdGVkKSBvciBhIEJhc2VDb250YWluZXJJbWFnZSBvYmplY3QuXG4gKlxuICogVG8gY3JlYXRlIGEgQmFzZUNvbnRhaW5lckltYWdlIG9iamVjdCwgdXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIGxpa2UgQmFzZUNvbnRhaW5lckltYWdlLmZyb21FY3IoKS5cbiAqXG4gKiBOb3RlOiBTdHJpbmcgc3VwcG9ydCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gVXNlIEJhc2VDb250YWluZXJJbWFnZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIEJhc2VDb250YWluZXJJbWFnZUlucHV0ID0gc3RyaW5nIHwgQmFzZUNvbnRhaW5lckltYWdlO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYXNlIGNvbnRhaW5lciBpbWFnZSB0aGF0IGlzIHVzZWQgdG8gc3RhcnQgZnJvbSBpbiBFQzIgSW1hZ2UgQnVpbGRlciBjb250YWluZXIgYnVpbGRzLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgYWRhcHRlZCBmcm9tIEFXUyBDREsncyBCYXNlQ29udGFpbmVySW1hZ2UgY2xhc3MgdG8gc3VwcG9ydCBib3RoIHN0cmluZyBhbmQgb2JqZWN0IGlucHV0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VDb250YWluZXJJbWFnZSB7XG4gIC8qKlxuICAgKiBUaGUgRG9ja2VySHViIGltYWdlIHRvIHVzZSBhcyB0aGUgYmFzZSBpbWFnZSBpbiBhIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIHJlcG9zaXRvcnkgVGhlIERvY2tlckh1YiByZXBvc2l0b3J5IHdoZXJlIHRoZSBiYXNlIGltYWdlIHJlc2lkZXMgaW5cbiAgICogQHBhcmFtIHRhZyBUaGUgdGFnIG9mIHRoZSBiYXNlIGltYWdlIGluIHRoZSBEb2NrZXJIdWIgcmVwb3NpdG9yeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRG9ja2VySHViKHJlcG9zaXRvcnk6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBCYXNlQ29udGFpbmVySW1hZ2Uge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnRhaW5lckltYWdlKGAke3JlcG9zaXRvcnl9OiR7dGFnfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBFQ1IgY29udGFpbmVyIGltYWdlIHRvIHVzZSBhcyB0aGUgYmFzZSBpbWFnZSBpbiBhIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIHJlcG9zaXRvcnkgVGhlIEVDUiByZXBvc2l0b3J5IHdoZXJlIHRoZSBiYXNlIGltYWdlIHJlc2lkZXMgaW5cbiAgICogQHBhcmFtIHRhZyBUaGUgdGFnIG9mIHRoZSBiYXNlIGltYWdlIGluIHRoZSBFQ1IgcmVwb3NpdG9yeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRWNyKHJlcG9zaXRvcnk6IGVjci5JUmVwb3NpdG9yeSwgdGFnOiBzdHJpbmcpOiBCYXNlQ29udGFpbmVySW1hZ2Uge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnRhaW5lckltYWdlKHJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaUZvclRhZyh0YWcpLCByZXBvc2l0b3J5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgRUNSIHB1YmxpYyBjb250YWluZXIgaW1hZ2UgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlIGluIGEgY29udGFpbmVyIHJlY2lwZVxuICAgKlxuICAgKiBAcGFyYW0gcmVnaXN0cnlBbGlhcyBUaGUgYWxpYXMgb2YgdGhlIEVDUiBwdWJsaWMgcmVnaXN0cnkgd2hlcmUgdGhlIGJhc2UgaW1hZ2UgcmVzaWRlcyBpblxuICAgKiBAcGFyYW0gcmVwb3NpdG9yeU5hbWUgVGhlIG5hbWUgb2YgdGhlIEVDUiBwdWJsaWMgcmVwb3NpdG9yeSwgd2hlcmUgdGhlIGJhc2UgaW1hZ2UgcmVzaWRlcyBpblxuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgb2YgdGhlIGJhc2UgaW1hZ2UgaW4gdGhlIEVDUiBwdWJsaWMgcmVwb3NpdG9yeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRWNyUHVibGljKHJlZ2lzdHJ5QWxpYXM6IHN0cmluZywgcmVwb3NpdG9yeU5hbWU6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBCYXNlQ29udGFpbmVySW1hZ2Uge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnRhaW5lckltYWdlKGBwdWJsaWMuZWNyLmF3cy8ke3JlZ2lzdHJ5QWxpYXN9LyR7cmVwb3NpdG9yeU5hbWV9OiR7dGFnfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGJhc2UgaW1hZ2UgdG8gdXNlIGluIGEgY29udGFpbmVyIHJlY2lwZS4gVGhpcyBjYW4gYmUgYW4gRUMyIEltYWdlIEJ1aWxkZXIgaW1hZ2UgQVJOLFxuICAgKiBhbiBFQ1Igb3IgRUNSIHB1YmxpYyBpbWFnZSwgb3IgYSBjb250YWluZXIgVVJJIHNvdXJjZWQgZnJvbSBhIHRoaXJkLXBhcnR5IGNvbnRhaW5lciByZWdpc3RyeSBzdWNoIGFzIERvY2tlckh1Yi5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VDb250YWluZXJJbWFnZVN0cmluZyBUaGUgYmFzZSBpbWFnZSBhcyBhIGRpcmVjdCBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyhiYXNlQ29udGFpbmVySW1hZ2VTdHJpbmc6IHN0cmluZyk6IEJhc2VDb250YWluZXJJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udGFpbmVySW1hZ2UoYmFzZUNvbnRhaW5lckltYWdlU3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgYmFzZSBpbWFnZSB0byB1c2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbWFnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRUNSIHJlcG9zaXRvcnkgaWYgdGhpcyBpbWFnZSB3YXMgY3JlYXRlZCBmcm9tIGFuIEVDUiByZXBvc2l0b3J5LlxuICAgKiBUaGlzIGFsbG93cyBhdXRvbWF0aWMgcGVybWlzc2lvbiBncmFudGluZyBmb3IgQ29kZUJ1aWxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVjclJlcG9zaXRvcnk/OiBlY3IuSVJlcG9zaXRvcnk7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGltYWdlOiBzdHJpbmcsIGVjclJlcG9zaXRvcnk/OiBlY3IuSVJlcG9zaXRvcnkpIHtcbiAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5ID0gZWNyUmVwb3NpdG9yeTtcbiAgfVxufVxuIl19
162
+ BaseContainerImage[_b] = { fqn: "@cloudsnorkel/cdk-github-runners.BaseContainerImage", version: "0.15.1" };
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbWFnZS1idWlsZGVycy9hd3MtaW1hZ2UtYnVpbGRlci9iYXNlLWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBSW5DLCtDQUFtRDtBQVduRDs7OztHQUlHO0FBQ0gsTUFBYSxTQUFTO0lBQ3BCOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWE7UUFDbkMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBZ0IsRUFBRSxZQUFvQixFQUFFLFVBQWtCLE9BQU87UUFDOUYsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ25DLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsWUFBWSxFQUFFLEdBQUcsWUFBWSxJQUFJLE9BQU8sRUFBRTtTQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLHdCQUF3QixDQUFDLFNBQWlCO1FBQ3RELE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBeUI7UUFDdEQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLGFBQXFCO1FBQ3RELE9BQU8s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Qyx3QkFBZ0M7UUFDdkQsT0FBTyxJQUFJLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQWFELFlBQXNCLEtBQWEsRUFBRSxhQUErQjtRQUNsRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNyQyxDQUFDOztBQXhESCxnREF5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgZWNyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUsIE9zIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiBUeXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGJhc2UgaW1hZ2UgLSBlaXRoZXIgYSBzdHJpbmcgKGRlcHJlY2F0ZWQpIG9yIGEgQmFzZUltYWdlIG9iamVjdC5cbiAqXG4gKiBUbyBjcmVhdGUgYSBCYXNlSW1hZ2Ugb2JqZWN0LCB1c2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgbGlrZSBCYXNlSW1hZ2UuZnJvbUFtaUlkKCkuXG4gKlxuICogTm90ZTogU3RyaW5nIHN1cHBvcnQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFVzZSBCYXNlSW1hZ2Ugc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBpbnN0ZWFkLlxuICovXG5leHBvcnQgdHlwZSBCYXNlSW1hZ2VJbnB1dCA9IHN0cmluZyB8IEJhc2VJbWFnZTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgYmFzZSBpbWFnZSB0aGF0IGlzIHVzZWQgdG8gc3RhcnQgZnJvbSBpbiBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZSBidWlsZHMuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBhZGFwdGVkIGZyb20gQVdTIENESydzIEJhc2VJbWFnZSBjbGFzcyB0byBzdXBwb3J0IGJvdGggc3RyaW5nIGFuZCBvYmplY3QgaW5wdXRzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZUltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBBTUkgSUQgdG8gdXNlIGFzIGEgYmFzZSBpbWFnZSBpbiBhbiBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIGFtaUlkIFRoZSBBTUkgSUQgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BbWlJZChhbWlJZDogc3RyaW5nKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShhbWlJZCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gQVdTLXByb3ZpZGVkIEVDMiBJbWFnZSBCdWlsZGVyIGltYWdlIHRvIHVzZSBhcyBhIGJhc2UgaW1hZ2UgaW4gYW4gaW1hZ2UgcmVjaXBlLlxuICAgKlxuICAgKiBUaGlzIGNvbnN0cnVjdHMgYW4gSW1hZ2UgQnVpbGRlciBBUk4gZm9yIEFXUy1wcm92aWRlZCBpbWFnZXMgbGlrZSBgdWJ1bnR1LXNlcnZlci0yMi1sdHMteDg2L3gueC54YC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGUgKHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFjayBhbmQgcmVnaW9uKVxuICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIFRoZSBJbWFnZSBCdWlsZGVyIHJlc291cmNlIG5hbWUgcGF0dGVybiAoZS5nLiwgYHVidW50dS1zZXJ2ZXItMjItbHRzLXg4NmAgb3IgYHVidW50dS1zZXJ2ZXItMjItbHRzLSR7YXJjaH1gKVxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBwYXR0ZXJuIChkZWZhdWx0cyB0byBgeC54LnhgIHRvIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24pXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbWFnZUJ1aWxkZXIoc2NvcGU6IENvbnN0cnVjdCwgcmVzb3VyY2VOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyA9ICd4LngueCcpOiBCYXNlSW1hZ2Uge1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHNjb3BlKTtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2ltYWdlJyxcbiAgICAgIGFjY291bnQ6ICdhd3MnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LyR7dmVyc2lvbn1gLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWFya2V0cGxhY2UgcHJvZHVjdCBJRCBmb3IgYW4gQU1JIHByb2R1Y3QgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlIGluIGFuIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAcGFyYW0gcHJvZHVjdElkIFRoZSBNYXJrZXRwbGFjZSBBTUkgcHJvZHVjdCBJRCB0byB1c2UgYXMgdGhlIGJhc2UgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU1hcmtldHBsYWNlUHJvZHVjdElkKHByb2R1Y3RJZDogc3RyaW5nKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShwcm9kdWN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTU00gcGFyYW1ldGVyIHRvIHVzZSBhcyB0aGUgYmFzZSBpbWFnZSBpbiBhbiBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtZXRlciBUaGUgU1NNIHBhcmFtZXRlciB0byB1c2UgYXMgdGhlIGJhc2UgaW1hZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNzbVBhcmFtZXRlcihwYXJhbWV0ZXI6IHNzbS5JUGFyYW1ldGVyKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShgc3NtOiR7cGFyYW1ldGVyLnBhcmFtZXRlckFybn1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBTU00gcGFyYW1ldGVyIHRvIHVzZSBhcyB0aGUgYmFzZSBpbWFnZSBpbiBhbiBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIFNTTSBwYXJhbWV0ZXIgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Tc21QYXJhbWV0ZXJOYW1lKHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IEJhc2VJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBCYXNlSW1hZ2UoYHNzbToke3BhcmFtZXRlck5hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpcmVjdCBzdHJpbmcgdmFsdWUgb2YgdGhlIGJhc2UgaW1hZ2UgdG8gdXNlIGluIGFuIGltYWdlIHJlY2lwZS4gVGhpcyBjYW4gYmUgYW4gRUMyIEltYWdlIEJ1aWxkZXIgaW1hZ2UgQVJOLFxuICAgKiBhbiBTU00gcGFyYW1ldGVyLCBhbiBBV1MgTWFya2V0cGxhY2UgcHJvZHVjdCBJRCwgb3IgYW4gQU1JIElELlxuICAgKlxuICAgKiBAcGFyYW0gYmFzZUltYWdlU3RyaW5nIFRoZSBiYXNlIGltYWdlIGFzIGEgZGlyZWN0IHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKGJhc2VJbWFnZVN0cmluZzogc3RyaW5nKTogQmFzZUltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VJbWFnZShiYXNlSW1hZ2VTdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgYmFzZSBBTUkgd2l0aCBOVklESUEgZHJpdmVycyBwcmUtaW5zdGFsbGVkIGZvciBHUFUgd29ya2xvYWRzLlxuICAgKlxuICAgKiBVc2VzIEFXUyBEZWVwIExlYXJuaW5nIEFNSXMgZm9yIExpbnV4IChVYnVudHUsIEFtYXpvbiBMaW51eCAyLCBBbWF6b24gTGludXggMjAyMykuXG4gICAqIEZvciBXaW5kb3dzLCBzdWJzY3JpYmUgdG8gTlZJRElBIFJUWCBWaXJ0dWFsIFdvcmtzdGF0aW9uIGluIEFXUyBNYXJrZXRwbGFjZSwgdGhlbiB1c2VcbiAgICoge0BsaW5rIGZyb21NYXJrZXRwbGFjZVByb2R1Y3RJZH0gd2l0aCB0aGUgcHJvZHVjdCBJRC5cbiAgICpcbiAgICogQHBhcmFtIG9zIFRhcmdldCBvcGVyYXRpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSBhcmNoaXRlY3R1cmUgVGFyZ2V0IGFyY2hpdGVjdHVyZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBPUy9hcmNoaXRlY3R1cmUgY29tYm8gaGFzIG5vIEdQVSBiYXNlIEFNSVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tR3B1QmFzZShvczogT3MsIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogQmFzZUltYWdlIHtcbiAgICBjb25zdCBhcmNoID0gYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpID8gJ3g4Nl82NCcgOiAnYXJtNjQnO1xuXG4gICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgfHwgb3MuaXMoT3MuTElOVVhfVUJVTlRVXzIyMDQpIHx8IG9zLmlzKE9zLkxJTlVYKSkge1xuICAgICAgcmV0dXJuIEJhc2VJbWFnZS5mcm9tU3NtUGFyYW1ldGVyTmFtZShgL2F3cy9zZXJ2aWNlL2RlZXBsZWFybmluZy9hbWkvJHthcmNofS9iYXNlLW9zcy1udmlkaWEtZHJpdmVyLWdwdS11YnVudHUtMjIuMDQvbGF0ZXN0L2FtaS1pZGApO1xuICAgIH1cbiAgICBpZiAob3MuaXMoT3MuTElOVVhfVUJVTlRVXzI0MDQpKSB7XG4gICAgICByZXR1cm4gQmFzZUltYWdlLmZyb21Tc21QYXJhbWV0ZXJOYW1lKGAvYXdzL3NlcnZpY2UvZGVlcGxlYXJuaW5nL2FtaS8ke2FyY2h9L2Jhc2Utb3NzLW52aWRpYS1kcml2ZXItZ3B1LXVidW50dS0yNC4wNC9sYXRlc3QvYW1pLWlkYCk7XG4gICAgfVxuICAgIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMikpIHtcbiAgICAgIHJldHVybiBCYXNlSW1hZ2UuZnJvbVNzbVBhcmFtZXRlck5hbWUoYC9hd3Mvc2VydmljZS9kZWVwbGVhcm5pbmcvYW1pLyR7YXJjaH0vYmFzZS1vc3MtbnZpZGlhLWRyaXZlci1hbWF6b24tbGludXgtMi9sYXRlc3QvYW1pLWlkYCk7XG4gICAgfVxuICAgIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMjAyMykpIHtcbiAgICAgIHJldHVybiBCYXNlSW1hZ2UuZnJvbVNzbVBhcmFtZXRlck5hbWUoYC9hd3Mvc2VydmljZS9kZWVwbGVhcm5pbmcvYW1pLyR7YXJjaH0vYmFzZS1vc3MtbnZpZGlhLWRyaXZlci1ncHUtYW1hem9uLWxpbnV4LTIwMjMvbGF0ZXN0L2FtaS1pZGApO1xuICAgIH1cbiAgICBpZiAob3MuaXMoT3MuV0lORE9XUykgJiYgYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdObyBHUFUgYmFzZSBBTUkgZm9yIFdpbmRvd3MuIFN1YnNjcmliZSB0byBOVklESUEgUlRYIFZpcnR1YWwgV29ya3N0YXRpb24gKFdpblNlcnZlciAyMDIyKSBhdCAnICtcbiAgICAgICAgJ2h0dHBzOi8vYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UvcHAvcHJvZHZpZXctZjRyZXlnd210eGlwdSAoZnJlZSksIHRoZW4gdXNlICcgK1xuICAgICAgICBcImBiYXNlQW1pOiBCYXNlSW1hZ2UuZnJvbU1hcmtldHBsYWNlUHJvZHVjdElkKCdwcm9kLTc3dTJlZWIzM2xtcm0nKWAgKG90aGVyIEFNSXMgd2l0aCBOVklESUEgZHJpdmVycyBpbnN0YWxsZWQgY2FuIGFsc28gYmUgdXNlZCkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBHUFUgYmFzZSBBTUkgZm9yICR7b3MubmFtZX0gLyAke2FyY2hpdGVjdHVyZS5uYW1lfS5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIGJhc2UgaW1hZ2UgdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW1hZ2U6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoaW1hZ2U6IHN0cmluZykge1xuICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgYmFzZSBjb250YWluZXIgaW1hZ2UgLSBlaXRoZXIgYSBzdHJpbmcgKGRlcHJlY2F0ZWQpIG9yIGEgQmFzZUNvbnRhaW5lckltYWdlIG9iamVjdC5cbiAqXG4gKiBUbyBjcmVhdGUgYSBCYXNlQ29udGFpbmVySW1hZ2Ugb2JqZWN0LCB1c2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgbGlrZSBCYXNlQ29udGFpbmVySW1hZ2UuZnJvbUVjcigpLlxuICpcbiAqIE5vdGU6IFN0cmluZyBzdXBwb3J0IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBVc2UgQmFzZUNvbnRhaW5lckltYWdlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgQmFzZUNvbnRhaW5lckltYWdlSW5wdXQgPSBzdHJpbmcgfCBCYXNlQ29udGFpbmVySW1hZ2U7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhc2UgY29udGFpbmVyIGltYWdlIHRoYXQgaXMgdXNlZCB0byBzdGFydCBmcm9tIGluIEVDMiBJbWFnZSBCdWlsZGVyIGNvbnRhaW5lciBidWlsZHMuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBhZGFwdGVkIGZyb20gQVdTIENESydzIEJhc2VDb250YWluZXJJbWFnZSBjbGFzcyB0byBzdXBwb3J0IGJvdGggc3RyaW5nIGFuZCBvYmplY3QgaW5wdXRzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZUNvbnRhaW5lckltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBEb2NrZXJIdWIgaW1hZ2UgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlIGluIGEgY29udGFpbmVyIHJlY2lwZVxuICAgKlxuICAgKiBAcGFyYW0gcmVwb3NpdG9yeSBUaGUgRG9ja2VySHViIHJlcG9zaXRvcnkgd2hlcmUgdGhlIGJhc2UgaW1hZ2UgcmVzaWRlcyBpblxuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgb2YgdGhlIGJhc2UgaW1hZ2UgaW4gdGhlIERvY2tlckh1YiByZXBvc2l0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Eb2NrZXJIdWIocmVwb3NpdG9yeTogc3RyaW5nLCB0YWc6IHN0cmluZyk6IEJhc2VDb250YWluZXJJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udGFpbmVySW1hZ2UoYCR7cmVwb3NpdG9yeX06JHt0YWd9YCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEVDUiBjb250YWluZXIgaW1hZ2UgdG8gdXNlIGFzIHRoZSBiYXNlIGltYWdlIGluIGEgY29udGFpbmVyIHJlY2lwZVxuICAgKlxuICAgKiBAcGFyYW0gcmVwb3NpdG9yeSBUaGUgRUNSIHJlcG9zaXRvcnkgd2hlcmUgdGhlIGJhc2UgaW1hZ2UgcmVzaWRlcyBpblxuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgb2YgdGhlIGJhc2UgaW1hZ2UgaW4gdGhlIEVDUiByZXBvc2l0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21FY3IocmVwb3NpdG9yeTogZWNyLklSZXBvc2l0b3J5LCB0YWc6IHN0cmluZyk6IEJhc2VDb250YWluZXJJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udGFpbmVySW1hZ2UocmVwb3NpdG9yeS5yZXBvc2l0b3J5VXJpRm9yVGFnKHRhZyksIHJlcG9zaXRvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBFQ1IgcHVibGljIGNvbnRhaW5lciBpbWFnZSB0byB1c2UgYXMgdGhlIGJhc2UgaW1hZ2UgaW4gYSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSByZWdpc3RyeUFsaWFzIFRoZSBhbGlhcyBvZiB0aGUgRUNSIHB1YmxpYyByZWdpc3RyeSB3aGVyZSB0aGUgYmFzZSBpbWFnZSByZXNpZGVzIGluXG4gICAqIEBwYXJhbSByZXBvc2l0b3J5TmFtZSBUaGUgbmFtZSBvZiB0aGUgRUNSIHB1YmxpYyByZXBvc2l0b3J5LCB3aGVyZSB0aGUgYmFzZSBpbWFnZSByZXNpZGVzIGluXG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBvZiB0aGUgYmFzZSBpbWFnZSBpbiB0aGUgRUNSIHB1YmxpYyByZXBvc2l0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21FY3JQdWJsaWMocmVnaXN0cnlBbGlhczogc3RyaW5nLCByZXBvc2l0b3J5TmFtZTogc3RyaW5nLCB0YWc6IHN0cmluZyk6IEJhc2VDb250YWluZXJJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udGFpbmVySW1hZ2UoYHB1YmxpYy5lY3IuYXdzLyR7cmVnaXN0cnlBbGlhc30vJHtyZXBvc2l0b3J5TmFtZX06JHt0YWd9YCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYmFzZSBpbWFnZSB0byB1c2UgaW4gYSBjb250YWluZXIgcmVjaXBlLiBUaGlzIGNhbiBiZSBhbiBFQzIgSW1hZ2UgQnVpbGRlciBpbWFnZSBBUk4sXG4gICAqIGFuIEVDUiBvciBFQ1IgcHVibGljIGltYWdlLCBvciBhIGNvbnRhaW5lciBVUkkgc291cmNlZCBmcm9tIGEgdGhpcmQtcGFydHkgY29udGFpbmVyIHJlZ2lzdHJ5IHN1Y2ggYXMgRG9ja2VySHViLlxuICAgKlxuICAgKiBAcGFyYW0gYmFzZUNvbnRhaW5lckltYWdlU3RyaW5nIFRoZSBiYXNlIGltYWdlIGFzIGEgZGlyZWN0IHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKGJhc2VDb250YWluZXJJbWFnZVN0cmluZzogc3RyaW5nKTogQmFzZUNvbnRhaW5lckltYWdlIHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb250YWluZXJJbWFnZShiYXNlQ29udGFpbmVySW1hZ2VTdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCBiYXNlIGltYWdlIHRvIHVzZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBFQ1IgcmVwb3NpdG9yeSBpZiB0aGlzIGltYWdlIHdhcyBjcmVhdGVkIGZyb20gYW4gRUNSIHJlcG9zaXRvcnkuXG4gICAqIFRoaXMgYWxsb3dzIGF1dG9tYXRpYyBwZXJtaXNzaW9uIGdyYW50aW5nIGZvciBDb2RlQnVpbGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWNyUmVwb3NpdG9yeT86IGVjci5JUmVwb3NpdG9yeTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoaW1hZ2U6IHN0cmluZywgZWNyUmVwb3NpdG9yeT86IGVjci5JUmVwb3NpdG9yeSkge1xuICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkgPSBlY3JSZXBvc2l0b3J5O1xuICB9XG59XG4iXX0=