studiokit-scaffolding-js 7.2.0-next.2.5 → 7.2.0-next.2.7

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.
@@ -52,13 +52,20 @@ let logger;
52
52
 
53
53
  function* getTokenFromCode(code) {
54
54
  const appConfig = (0, _constants.getAppConfig)();
55
+ if (!appConfig.CLIENT_ID || !appConfig.CLIENT_SECRET) {
56
+ throw new Error('CLIENT_ID and CLIENT_SECRET are required in AppConfig');
57
+ }
55
58
  const getTokenModelName = 'getToken';
56
- const formBody = ['grant_type=authorization_code', `client_id=${appConfig.CLIENT_ID}`, `client_secret=${appConfig.CLIENT_SECRET}`, `code=${encodeURIComponent(code)}`];
57
- const formBodyString = formBody.join('&');
59
+ const formBody = new URLSearchParams({
60
+ grant_type: 'authorization_code',
61
+ client_id: appConfig.CLIENT_ID,
62
+ client_secret: appConfig.CLIENT_SECRET,
63
+ code: code
64
+ });
58
65
  yield (0, _effects.put)({
59
66
  type: _actions.MODEL_FETCH_REQUEST_ACTION_TYPE.FETCH_REQUEST,
60
67
  modelName: getTokenModelName,
61
- body: formBodyString,
68
+ body: formBody.toString(),
62
69
  noStore: true
63
70
  });
64
71
  const {
@@ -75,25 +82,38 @@ function* getTokenFromCode(code) {
75
82
  }
76
83
  function* getTokenFromCodeAndState(code, state) {
77
84
  const appConfig = (0, _constants.getAppConfig)();
85
+ if (!appConfig.CLIENT_ID || !appConfig.OAUTH_PKCE_SCOPE || !appConfig.OAUTH_PKCE_ENDPOINT) {
86
+ throw new Error('CLIENT_ID, OAUTH_PKCE_SCOPE, and OAUTH_PKCE_ENDPOINT are required in AppConfig');
87
+ }
78
88
 
79
- // compare state to persisted value
80
- const codeVerifier = oauthPersistenceService.getPersistedCodeVerifier();
81
- const persistedState = oauthPersistenceService.getPersistedState();
89
+ // validate persisted values
90
+ const codeVerifier = yield (0, _effects.call)(oauthPersistenceService.getPersistedCodeVerifier);
91
+ if (!codeVerifier) {
92
+ throw new Error('invalid code_verifier');
93
+ }
94
+ const persistedState = yield (0, _effects.call)(oauthPersistenceService.getPersistedState);
82
95
  if (persistedState !== state) {
83
- throw new Error('Invalid state');
96
+ throw new Error('invalid state');
84
97
  }
85
- // clear persisted state
86
- oauthPersistenceService.persistState(null);
98
+ // clear persisted values
99
+ yield (0, _effects.call)(oauthPersistenceService.persistState, null);
100
+ yield (0, _effects.call)(oauthPersistenceService.persistCodeVerifier, null);
87
101
 
88
102
  // dispatch request
89
- const location = _windowService.windowService.getLocation();
90
103
  const getTokenModelName = 'getToken';
91
- const formBody = [`code=${encodeURIComponent(code)}`, `scope=${appConfig.OAUTH_PKCE_SCOPE}`, `code_verifier=${codeVerifier}`, `redirect_uri=${location.origin}`];
92
- const formBodyString = formBody.join('&');
104
+ const location = _windowService.windowService.getLocation();
105
+ const formBody = new URLSearchParams({
106
+ grant_type: 'authorization_code',
107
+ client_id: appConfig.CLIENT_ID,
108
+ scope: appConfig.OAUTH_PKCE_SCOPE,
109
+ code_verifier: codeVerifier,
110
+ redirect_uri: location.origin,
111
+ code: code
112
+ });
93
113
  yield (0, _effects.put)({
94
114
  type: _actions.MODEL_FETCH_REQUEST_ACTION_TYPE.FETCH_REQUEST,
95
115
  modelName: getTokenModelName,
96
- body: formBodyString,
116
+ body: formBody.toString(),
97
117
  noStore: true
98
118
  });
99
119
  const {
@@ -106,20 +126,27 @@ function* getTokenFromCodeAndState(code, state) {
106
126
  if (fetchErrorAction || !fetchResultAction?.data) {
107
127
  return null;
108
128
  }
109
- // clear persisted codeVerifier on success
110
- oauthPersistenceService.persistCodeVerifier(null);
111
129
  return fetchResultAction.data;
112
130
  }
113
131
  function* getTokenFromRefreshToken(oauthTokenParam) {
114
132
  const appConfig = (0, _constants.getAppConfig)();
133
+ if (!appConfig.CLIENT_ID) {
134
+ throw new Error('CLIENT_ID, is required in AppConfig');
135
+ }
115
136
  const getTokenModelName = 'getToken';
137
+ const formBody = new URLSearchParams({
138
+ grant_type: 'refresh_token',
139
+ client_id: appConfig.CLIENT_ID,
140
+ refresh_token: oauthTokenParam.refresh_token
141
+ });
116
142
  // create the form body based on if using a client_secret: traditional OAuth vs. PKCE flow
117
- const formBody = appConfig.CLIENT_SECRET ? ['grant_type=refresh_token', `client_id=${appConfig.CLIENT_ID}`, `client_secret=${appConfig.CLIENT_SECRET}`, `refresh_token=${encodeURIComponent(oauthTokenParam.refresh_token)}`] : [`refresh_token=${encodeURIComponent(oauthTokenParam.refresh_token)}`];
118
- const formBodyString = formBody.join('&');
143
+ if (appConfig.CLIENT_SECRET) {
144
+ formBody.append('client_secret', appConfig.CLIENT_SECRET);
145
+ }
119
146
  yield (0, _effects.put)({
120
147
  type: _actions.MODEL_FETCH_REQUEST_ACTION_TYPE.FETCH_REQUEST,
121
148
  modelName: getTokenModelName,
122
- body: formBodyString,
149
+ body: formBody.toString(),
123
150
  noStore: true
124
151
  });
125
152
  const {
@@ -233,21 +260,21 @@ function* casTicketLoginFlow(ticket, service) {
233
260
  function* pkceLoginFlow(_) {
234
261
  const appConfig = (0, _constants.getAppConfig)();
235
262
  if (!appConfig.CLIENT_ID || !appConfig.OAUTH_PKCE_SCOPE || !appConfig.OAUTH_PKCE_ENDPOINT) {
236
- throw new Error('OAuth PKCE settings missing in AppConfig');
263
+ throw new Error('CLIENT_ID, OAUTH_PKCE_SCOPE, and OAUTH_PKCE_ENDPOINT are required in AppConfig');
237
264
  }
238
265
 
239
- // Set state and code verifier in local storage for use after code flow redirect.
240
- // These will be sent to the backend to get the actual bearer token.
266
+ // Generate state and code verifier values
241
267
  const state = (0, _uuid.v4)();
242
268
  const codeVerifier = (0, _uuid.v4)();
243
269
  const sha256CodeVerifier = yield (0, _effects.call)(_url.sha256Async, codeVerifier);
244
- const codeChallenge = (0, _url.base64UrlEncode)(sha256CodeVerifier);
245
- oauthPersistenceService.persistState(state);
246
- oauthPersistenceService.persistCodeVerifier(codeVerifier);
247
- const history = _windowService.windowService.getHistory();
248
- const location = _windowService.windowService.getLocation();
270
+ const codeChallenge = yield (0, _effects.call)(_url.base64UrlEncode, sha256CodeVerifier);
271
+
272
+ // Persist state and code verifier in local storage for use after code flow redirect.
273
+ yield (0, _effects.call)(oauthPersistenceService.persistState, state);
274
+ yield (0, _effects.call)(oauthPersistenceService.persistCodeVerifier, codeVerifier);
249
275
 
250
276
  // Redirect to BS code flow auth endpoint (which will redirect back here)
277
+ const location = _windowService.windowService.getLocation();
251
278
  const pkceAuthRedirectURL = `${appConfig.OAUTH_PKCE_ENDPOINT}?${new URLSearchParams({
252
279
  response_type: 'code',
253
280
  client_id: appConfig.CLIENT_ID,
@@ -257,9 +284,7 @@ function* pkceLoginFlow(_) {
257
284
  code_challenge_method: 'S256',
258
285
  redirect_uri: location.origin
259
286
  })}`;
260
- // TODO: refactor to allow testing with windowService
261
- window.location.replace(pkceAuthRedirectURL);
262
- yield (0, _effects.call)(() => {});
287
+ yield (0, _effects.call)(_windowService.windowService.replace, pkceAuthRedirectURL);
263
288
  }
264
289
  function* handleAuthFailure(action) {
265
290
  // This should be unlikely since we normally have a refresh token loop happening
@@ -357,6 +382,8 @@ function authSaga() {
357
382
  } else if (pkceLoginAction) {
358
383
  // oauthToken is not returned here, as this flow will result in a window redirect
359
384
  yield (0, _effects.call)(pkceLoginFlow, pkceLoginAction);
385
+ // break execution
386
+ return;
360
387
  }
361
388
  }
362
389
  if (oauthToken) {
@@ -384,4 +411,4 @@ function authSaga() {
384
411
  } while (true);
385
412
  }();
386
413
  }
387
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZWZmZWN0cyIsInJlcXVpcmUiLCJfdXVpZCIsIl9jb25zdGFudHMiLCJfY29kZVByb3ZpZGVyU2VydmljZSIsIl9vYXV0aFBlcnNpc3RlbmNlU2VydmljZSIsIl90aWNrZXRQcm92aWRlclNlcnZpY2UiLCJfd2luZG93U2VydmljZSIsIl90eXBlcyIsIl9sb2dnZXIiLCJfdXJsIiwiX2FjdGlvbnMiLCJtYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkIiwiYWN0aW9uIiwibW9kZWxOYW1lIiwiaXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uIiwibW9kZWxQYXRoIiwiZXhwb3J0cyIsInRha2VNYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkIiwiaW5jb21pbmdBY3Rpb24iLCJtYXRjaGVzTW9kZWxGZXRjaEZhaWxlZCIsImlzVHJhbnNpZW50TW9kZWxGZXRjaEVycm9yQWN0aW9uIiwidGFrZU1hdGNoZXNNb2RlbEZldGNoRmFpbGVkIiwib2F1dGhUb2tlbiIsIm9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlIiwicmVmcmVzaExvY2siLCJsb2dnZXIiLCJnZXRUb2tlbkZyb21Db2RlIiwiY29kZSIsImFwcENvbmZpZyIsImdldEFwcENvbmZpZyIsImdldFRva2VuTW9kZWxOYW1lIiwiZm9ybUJvZHkiLCJDTElFTlRfSUQiLCJDTElFTlRfU0VDUkVUIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZm9ybUJvZHlTdHJpbmciLCJqb2luIiwicHV0IiwidHlwZSIsIk1PREVMX0ZFVENIX1JFUVVFU1RfQUNUSU9OX1RZUEUiLCJGRVRDSF9SRVFVRVNUIiwiYm9keSIsIm5vU3RvcmUiLCJmZXRjaFJlc3VsdEFjdGlvbiIsImZldGNoRXJyb3JBY3Rpb24iLCJyYWNlIiwidGFrZSIsImRhdGEiLCJnZXRUb2tlbkZyb21Db2RlQW5kU3RhdGUiLCJzdGF0ZSIsImNvZGVWZXJpZmllciIsImdldFBlcnNpc3RlZENvZGVWZXJpZmllciIsInBlcnNpc3RlZFN0YXRlIiwiZ2V0UGVyc2lzdGVkU3RhdGUiLCJFcnJvciIsInBlcnNpc3RTdGF0ZSIsImxvY2F0aW9uIiwid2luZG93U2VydmljZSIsImdldExvY2F0aW9uIiwiT0FVVEhfUEtDRV9TQ09QRSIsIm9yaWdpbiIsInBlcnNpc3RDb2RlVmVyaWZpZXIiLCJnZXRUb2tlbkZyb21SZWZyZXNoVG9rZW4iLCJvYXV0aFRva2VuUGFyYW0iLCJyZWZyZXNoX3Rva2VuIiwiZXJyb3JEYXRhIiwic3RhdHVzIiwiSFRUUF9TVEFUVVNfQ09ERSIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsInBlcmZvcm1Ub2tlblJlZnJlc2giLCJyZWZyZXNoU3VjY2VzcyIsIkFVVEhfVE9LRU5fU1VDQ0VTU19BQ1RJT05fVFlQRSIsIlRPS0VOX1JFRlJFU0hfU1VDQ0VFREVEIiwicmVmcmVzaEZhaWxlZCIsIkFVVEhfQUNUSU9OX1RZUEUiLCJUT0tFTl9SRUZSRVNIX0ZBSUxFRCIsImRlYnVnIiwib3JpZ2luYWxBY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsImNhbGwiLCJwZXJzaXN0VG9rZW4iLCJhbGwiLCJsb2dPdXQiLCJMT0dfT1VUX1JFUVVFU1RFRCIsImxvZ2luRmxvdyIsIm1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uIiwiY3JlZGVudGlhbHNMb2dpbkZsb3ciLCJub1JldHJ5IiwiY2FzVjFMb2dpbkZsb3ciLCJsb2NhbExvZ2luRmxvdyIsImNhc1RpY2tldExvZ2luRmxvdyIsInRpY2tldCIsInNlcnZpY2UiLCJxdWVyeVBhcmFtcyIsInBrY2VMb2dpbkZsb3ciLCJfIiwiT0FVVEhfUEtDRV9FTkRQT0lOVCIsInV1aWR2NCIsInNoYTI1NkNvZGVWZXJpZmllciIsInNoYTI1NkFzeW5jIiwiY29kZUNoYWxsZW5nZSIsImJhc2U2NFVybEVuY29kZSIsImhpc3RvcnkiLCJnZXRIaXN0b3J5IiwicGtjZUF1dGhSZWRpcmVjdFVSTCIsIlVSTFNlYXJjaFBhcmFtcyIsInJlc3BvbnNlX3R5cGUiLCJjbGllbnRfaWQiLCJzY29wZSIsImNvZGVfY2hhbGxlbmdlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwicmVkaXJlY3RfdXJpIiwid2luZG93IiwicmVwbGFjZSIsImhhbmRsZUF1dGhGYWlsdXJlIiwiVU5BVVRIT1JJWkVEIiwiZ2V0T0F1dGhUb2tlbiIsInRoaXJ0eVNlY29uZHNGcm9tTm93IiwiRGF0ZSIsInNldFNlY29uZHMiLCJnZXRTZWNvbmRzIiwiYXV0aFNhZ2EiLCJvYXV0aFBlcnNpc3RlbmNlU2VydmljZVBhcmFtIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiZGVmYXVsdE9BdXRoUGVyc2lzdGVuY2VTZXJ2aWNlIiwidGlja2V0UHJvdmlkZXJTZXJ2aWNlIiwiZGVmYXVsdFRpY2tldFByb3ZpZGVyU2VydmljZSIsImNvZGVQcm92aWRlclNlcnZpY2UiLCJkZWZhdWx0Q29kZVByb3ZpZGVyU2VydmljZSIsImdldExvZ2dlciIsImdldFBlcnNpc3RlZFRva2VuIiwiY2FzVGlja2V0IiwiZ2V0VGlja2V0IiwicmVtb3ZlVGlja2V0IiwiZ2V0QXBwU2VydmljZU5hbWUiLCJnZXRDb2RlIiwiY2xlYXJVc2VyRGF0YSIsIk1PREVMX1JFTU9WRV9LRVlfQUNUSU9OX1RZUEUiLCJjbGVhclBlcnNpc3RlbnRUb2tlbiIsImdldFN0YXRlIiwicmVtb3ZlQ29kZUFuZFN0YXRlIiwiQVVUSF9UT0tFTl9BQ1RJT05fVFlQRSIsIkFVVEhfSU5JVElBTElaRUQiLCJ0YWtlRXZlcnkiLCJNT0RFTF9GRVRDSF9FUlJPUl9BQ1RJT05fVFlQRSIsIlRSWV9GRVRDSF9GQUlMRUQiLCJjYXNWMUFjdGlvbiIsImxvY2FsTG9naW5BY3Rpb24iLCJwa2NlTG9naW5BY3Rpb24iLCJBVVRIX0NBU19WMV9MT0dJTl9SRVFVRVNUX0FDVElPTl9UWVBFIiwiQ0FTX1YxX0xPR0lOX1JFUVVFU1QiLCJBVVRIX0xPQ0FMX0xPR0lOX1JFUVVFU1RfQUNUSU9OX1RZUEUiLCJMT0NBTF9MT0dJTl9SRVFVRVNUIiwiQVVUSF9QS0NFX0xPR0lOX1JFUVVFU1RfQUNUSU9OX1RZUEUiLCJQS0NFX0xPR0lOX1JFUVVFU1QiLCJMT0dJTl9SRVFVRVNURUQiLCJsb2dpblN1Y2Nlc3MiLCJHRVRfVE9LRU5fU1VDQ0VFREVEIiwiTE9HSU5fRkFJTEVEIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlZHV4L3NhZ2FzL2F1dGhTYWdhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhZ2FJdGVyYXRvciB9IGZyb20gJ0ByZWR1eC1zYWdhL2NvcmUnXG5pbXBvcnQgeyBBbnlBY3Rpb24gfSBmcm9tICdyZWR1eCdcbmltcG9ydCB7IGFsbCwgY2FsbCwgcHV0LCByYWNlLCB0YWtlLCB0YWtlRXZlcnkgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgZ2V0QXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgY29kZVByb3ZpZGVyU2VydmljZSBhcyBkZWZhdWx0Q29kZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvZGVQcm92aWRlclNlcnZpY2UnXG5pbXBvcnQgeyBvYXV0aFBlcnNpc3RlbmNlU2VydmljZSBhcyBkZWZhdWx0T0F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vYXV0aFBlcnNpc3RlbmNlU2VydmljZSdcbmltcG9ydCB7IHRpY2tldFByb3ZpZGVyU2VydmljZSBhcyBkZWZhdWx0VGlja2V0UHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGlja2V0UHJvdmlkZXJTZXJ2aWNlJ1xuaW1wb3J0IHsgd2luZG93U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3dpbmRvd1NlcnZpY2UnXG5pbXBvcnQge1xuXHRDb2RlUHJvdmlkZXJTZXJ2aWNlLFxuXHRIVFRQX1NUQVRVU19DT0RFLFxuXHRPQXV0aFBlcnNpc3RlbmNlU2VydmljZSxcblx0T0F1dGhUb2tlbixcblx0T0F1dGhUb2tlbk9yTnVsbCxcblx0VGlja2V0UHJvdmlkZXJTZXJ2aWNlLFxuXHRUb2tlbkFjY2Vzc0Z1bmN0aW9uXG59IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0TG9nZ2VyLCBMb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBiYXNlNjRVcmxFbmNvZGUsIHNoYTI1NkFzeW5jIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXJsJ1xuaW1wb3J0IHtcblx0QVVUSF9BQ1RJT05fVFlQRSxcblx0QVVUSF9DQVNfVjFfTE9HSU5fUkVRVUVTVF9BQ1RJT05fVFlQRSxcblx0QVVUSF9MT0NBTF9MT0dJTl9SRVFVRVNUX0FDVElPTl9UWVBFLFxuXHRBVVRIX1BLQ0VfTE9HSU5fUkVRVUVTVF9BQ1RJT05fVFlQRSxcblx0QVVUSF9UT0tFTl9BQ1RJT05fVFlQRSxcblx0QVVUSF9UT0tFTl9TVUNDRVNTX0FDVElPTl9UWVBFLFxuXHRBdXRoQWN0aW9uLFxuXHRBdXRoQ2FzVjFMb2dpblJlcXVlc3RBY3Rpb24sXG5cdEF1dGhMb2NhbExvZ2luUmVxdWVzdEFjdGlvbixcblx0QXV0aFBLQ0VMb2dpblJlcXVlc3RBY3Rpb24sXG5cdEF1dGhUb2tlbkFjdGlvbixcblx0QXV0aFRva2VuU3VjY2Vzc0FjdGlvbixcblx0aXNUcmFuc2llbnRNb2RlbEZldGNoRXJyb3JBY3Rpb24sXG5cdGlzVHJhbnNpZW50TW9kZWxGZXRjaFJlc3VsdEFjdGlvbixcblx0TU9ERUxfRkVUQ0hfRVJST1JfQUNUSU9OX1RZUEUsXG5cdE1PREVMX0ZFVENIX1JFUVVFU1RfQUNUSU9OX1RZUEUsXG5cdE1PREVMX1JFTU9WRV9LRVlfQUNUSU9OX1RZUEUsXG5cdE1vZGVsRmV0Y2hFcnJvckFjdGlvbixcblx0TW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24sXG5cdE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb24sXG5cdE1vZGVsUmVtb3ZlS2V5QWN0aW9uXG59IGZyb20gJy4uL2FjdGlvbnMnXG5cbi8vI3JlZ2lvbiBIZWxwZXJzXG5cbmV4cG9ydCBjb25zdCBtYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkID0gKGFjdGlvbjogQW55QWN0aW9uLCBtb2RlbE5hbWU6IHN0cmluZykgPT5cblx0aXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLm1vZGVsUGF0aCA9PT0gbW9kZWxOYW1lXG5cbmV4cG9ydCBjb25zdCB0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZCA9IChtb2RlbE5hbWU6IHN0cmluZykgPT4gKGluY29taW5nQWN0aW9uOiBBbnlBY3Rpb24pID0+XG5cdG1hdGNoZXNNb2RlbEZldGNoUmVjZWl2ZWQoaW5jb21pbmdBY3Rpb24sIG1vZGVsTmFtZSlcblxuZXhwb3J0IGNvbnN0IG1hdGNoZXNNb2RlbEZldGNoRmFpbGVkID0gKGFjdGlvbjogQW55QWN0aW9uLCBtb2RlbE5hbWU6IHN0cmluZykgPT5cblx0aXNUcmFuc2llbnRNb2RlbEZldGNoRXJyb3JBY3Rpb24oYWN0aW9uKSAmJiBhY3Rpb24ubW9kZWxQYXRoID09PSBtb2RlbE5hbWVcblxuZXhwb3J0IGNvbnN0IHRha2VNYXRjaGVzTW9kZWxGZXRjaEZhaWxlZCA9IChtb2RlbE5hbWU6IHN0cmluZykgPT4gKGluY29taW5nQWN0aW9uOiBBbnlBY3Rpb24pID0+XG5cdG1hdGNoZXNNb2RlbEZldGNoRmFpbGVkKGluY29taW5nQWN0aW9uLCBtb2RlbE5hbWUpXG5cbi8vI2VuZHJlZ2lvbiBIZWxwZXJzXG5cbi8vI3JlZ2lvbiBMb2NhbCBWYXJpYWJsZXNcblxubGV0IG9hdXRoVG9rZW46IE9BdXRoVG9rZW5Pck51bGwgPSBudWxsXG5sZXQgb2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2U6IE9BdXRoUGVyc2lzdGVuY2VTZXJ2aWNlXG5sZXQgcmVmcmVzaExvY2s6IGJvb2xlYW5cbmxldCBsb2dnZXI6IExvZ2dlclxuXG4vLyNlbmRyZWdpb24gTG9jYWwgVmFyaWFibGVzXG5cbmV4cG9ydCBmdW5jdGlvbiogZ2V0VG9rZW5Gcm9tQ29kZShjb2RlOiBzdHJpbmcpOiBTYWdhSXRlcmF0b3Ige1xuXHRjb25zdCBhcHBDb25maWcgPSBnZXRBcHBDb25maWcoKVxuXHRjb25zdCBnZXRUb2tlbk1vZGVsTmFtZSA9ICdnZXRUb2tlbidcblx0Y29uc3QgZm9ybUJvZHkgPSBbXG5cdFx0J2dyYW50X3R5cGU9YXV0aG9yaXphdGlvbl9jb2RlJyxcblx0XHRgY2xpZW50X2lkPSR7YXBwQ29uZmlnLkNMSUVOVF9JRH1gLFxuXHRcdGBjbGllbnRfc2VjcmV0PSR7YXBwQ29uZmlnLkNMSUVOVF9TRUNSRVR9YCxcblx0XHRgY29kZT0ke2VuY29kZVVSSUNvbXBvbmVudChjb2RlKX1gXG5cdF1cblx0Y29uc3QgZm9ybUJvZHlTdHJpbmcgPSBmb3JtQm9keS5qb2luKCcmJylcblx0eWllbGQgcHV0PE1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uPih7XG5cdFx0dHlwZTogTU9ERUxfRkVUQ0hfUkVRVUVTVF9BQ1RJT05fVFlQRS5GRVRDSF9SRVFVRVNULFxuXHRcdG1vZGVsTmFtZTogZ2V0VG9rZW5Nb2RlbE5hbWUsXG5cdFx0Ym9keTogZm9ybUJvZHlTdHJpbmcsXG5cdFx0bm9TdG9yZTogdHJ1ZVxuXHR9KVxuXHRjb25zdCB7XG5cdFx0ZmV0Y2hSZXN1bHRBY3Rpb24sXG5cdFx0ZmV0Y2hFcnJvckFjdGlvblxuXHR9OiB7IGZldGNoUmVzdWx0QWN0aW9uPzogTW9kZWxGZXRjaFJlc3VsdEFjdGlvbjsgZmV0Y2hFcnJvckFjdGlvbj86IE1vZGVsRmV0Y2hFcnJvckFjdGlvbiB9ID0geWllbGQgcmFjZSh7XG5cdFx0ZmV0Y2hSZXN1bHRBY3Rpb246IHRha2UodGFrZU1hdGNoZXNNb2RlbEZldGNoUmVjZWl2ZWQoZ2V0VG9rZW5Nb2RlbE5hbWUpKSxcblx0XHRmZXRjaEVycm9yQWN0aW9uOiB0YWtlKHRha2VNYXRjaGVzTW9kZWxGZXRjaEZhaWxlZChnZXRUb2tlbk1vZGVsTmFtZSkpXG5cdH0pXG5cdGlmIChmZXRjaEVycm9yQWN0aW9uIHx8ICFmZXRjaFJlc3VsdEFjdGlvbj8uZGF0YSkge1xuXHRcdHJldHVybiBudWxsXG5cdH1cblx0cmV0dXJuIGZldGNoUmVzdWx0QWN0aW9uLmRhdGFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZXRUb2tlbkZyb21Db2RlQW5kU3RhdGUoY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogU2FnYUl0ZXJhdG9yIHtcblx0Y29uc3QgYXBwQ29uZmlnID0gZ2V0QXBwQ29uZmlnKClcblxuXHQvLyBjb21wYXJlIHN0YXRlIHRvIHBlcnNpc3RlZCB2YWx1ZVxuXHRjb25zdCBjb2RlVmVyaWZpZXIgPSBvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5nZXRQZXJzaXN0ZWRDb2RlVmVyaWZpZXIoKVxuXHRjb25zdCBwZXJzaXN0ZWRTdGF0ZSA9IG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLmdldFBlcnNpc3RlZFN0YXRlKClcblx0aWYgKHBlcnNpc3RlZFN0YXRlICE9PSBzdGF0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpXG5cdH1cblx0Ly8gY2xlYXIgcGVyc2lzdGVkIHN0YXRlXG5cdG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RTdGF0ZShudWxsKVxuXG5cdC8vIGRpc3BhdGNoIHJlcXVlc3Rcblx0Y29uc3QgbG9jYXRpb24gPSB3aW5kb3dTZXJ2aWNlLmdldExvY2F0aW9uKClcblx0Y29uc3QgZ2V0VG9rZW5Nb2RlbE5hbWUgPSAnZ2V0VG9rZW4nXG5cdGNvbnN0IGZvcm1Cb2R5ID0gW1xuXHRcdGBjb2RlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvZGUpfWAsXG5cdFx0YHNjb3BlPSR7YXBwQ29uZmlnLk9BVVRIX1BLQ0VfU0NPUEV9YCxcblx0XHRgY29kZV92ZXJpZmllcj0ke2NvZGVWZXJpZmllcn1gLFxuXHRcdGByZWRpcmVjdF91cmk9JHtsb2NhdGlvbi5vcmlnaW59YFxuXHRdXG5cdGNvbnN0IGZvcm1Cb2R5U3RyaW5nID0gZm9ybUJvZHkuam9pbignJicpXG5cdHlpZWxkIHB1dDxNb2RlbEZldGNoUmVxdWVzdEFjdGlvbj4oe1xuXHRcdHR5cGU6IE1PREVMX0ZFVENIX1JFUVVFU1RfQUNUSU9OX1RZUEUuRkVUQ0hfUkVRVUVTVCxcblx0XHRtb2RlbE5hbWU6IGdldFRva2VuTW9kZWxOYW1lLFxuXHRcdGJvZHk6IGZvcm1Cb2R5U3RyaW5nLFxuXHRcdG5vU3RvcmU6IHRydWVcblx0fSlcblx0Y29uc3Qge1xuXHRcdGZldGNoUmVzdWx0QWN0aW9uLFxuXHRcdGZldGNoRXJyb3JBY3Rpb25cblx0fTogeyBmZXRjaFJlc3VsdEFjdGlvbj86IE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb247IGZldGNoRXJyb3JBY3Rpb24/OiBNb2RlbEZldGNoRXJyb3JBY3Rpb24gfSA9IHlpZWxkIHJhY2Uoe1xuXHRcdGZldGNoUmVzdWx0QWN0aW9uOiB0YWtlKHRha2VNYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkKGdldFRva2VuTW9kZWxOYW1lKSksXG5cdFx0ZmV0Y2hFcnJvckFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hGYWlsZWQoZ2V0VG9rZW5Nb2RlbE5hbWUpKVxuXHR9KVxuXHRpZiAoZmV0Y2hFcnJvckFjdGlvbiB8fCAhZmV0Y2hSZXN1bHRBY3Rpb24/LmRhdGEpIHtcblx0XHRyZXR1cm4gbnVsbFxuXHR9XG5cdC8vIGNsZWFyIHBlcnNpc3RlZCBjb2RlVmVyaWZpZXIgb24gc3VjY2Vzc1xuXHRvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5wZXJzaXN0Q29kZVZlcmlmaWVyKG51bGwpXG5cdHJldHVybiBmZXRjaFJlc3VsdEFjdGlvbi5kYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogZ2V0VG9rZW5Gcm9tUmVmcmVzaFRva2VuKG9hdXRoVG9rZW5QYXJhbTogT0F1dGhUb2tlbik6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGNvbnN0IGdldFRva2VuTW9kZWxOYW1lID0gJ2dldFRva2VuJ1xuXHQvLyBjcmVhdGUgdGhlIGZvcm0gYm9keSBiYXNlZCBvbiBpZiB1c2luZyBhIGNsaWVudF9zZWNyZXQ6IHRyYWRpdGlvbmFsIE9BdXRoIHZzLiBQS0NFIGZsb3dcblx0Y29uc3QgZm9ybUJvZHkgPSBhcHBDb25maWcuQ0xJRU5UX1NFQ1JFVFxuXHRcdD8gW1xuXHRcdFx0XHQnZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuJyxcblx0XHRcdFx0YGNsaWVudF9pZD0ke2FwcENvbmZpZy5DTElFTlRfSUR9YCxcblx0XHRcdFx0YGNsaWVudF9zZWNyZXQ9JHthcHBDb25maWcuQ0xJRU5UX1NFQ1JFVH1gLFxuXHRcdFx0XHRgcmVmcmVzaF90b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudChvYXV0aFRva2VuUGFyYW0ucmVmcmVzaF90b2tlbil9YFxuXHRcdFx0XVxuXHRcdDogW2ByZWZyZXNoX3Rva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9hdXRoVG9rZW5QYXJhbS5yZWZyZXNoX3Rva2VuKX1gXVxuXHRjb25zdCBmb3JtQm9keVN0cmluZyA9IGZvcm1Cb2R5LmpvaW4oJyYnKVxuXHR5aWVsZCBwdXQ8TW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24+KHtcblx0XHR0eXBlOiBNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFLkZFVENIX1JFUVVFU1QsXG5cdFx0bW9kZWxOYW1lOiBnZXRUb2tlbk1vZGVsTmFtZSxcblx0XHRib2R5OiBmb3JtQm9keVN0cmluZyxcblx0XHRub1N0b3JlOiB0cnVlXG5cdH0pXG5cdGNvbnN0IHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbixcblx0XHRmZXRjaEVycm9yQWN0aW9uXG5cdH06IHsgZmV0Y2hSZXN1bHRBY3Rpb24/OiBNb2RlbEZldGNoUmVzdWx0QWN0aW9uOyBmZXRjaEVycm9yQWN0aW9uPzogTW9kZWxGZXRjaEVycm9yQWN0aW9uIH0gPSB5aWVsZCByYWNlKHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZChnZXRUb2tlbk1vZGVsTmFtZSkpLFxuXHRcdGZldGNoRXJyb3JBY3Rpb246IHRha2UodGFrZU1hdGNoZXNNb2RlbEZldGNoRmFpbGVkKGdldFRva2VuTW9kZWxOYW1lKSlcblx0fSlcblx0Ly8gYW55IGVycm9yIHJlc3BvbnNlXG5cdGlmIChmZXRjaEVycm9yQWN0aW9uKSB7XG5cdFx0Ly8gaWdub3JlIHNlcnZlciBlcnJvcnNcblx0XHRpZiAoXG5cdFx0XHRmZXRjaEVycm9yQWN0aW9uLmVycm9yRGF0YT8uc3RhdHVzICYmXG5cdFx0XHRmZXRjaEVycm9yQWN0aW9uLmVycm9yRGF0YS5zdGF0dXMgPj0gSFRUUF9TVEFUVVNfQ09ERS5JTlRFUk5BTF9TRVJWRVJfRVJST1Jcblx0XHQpIHtcblx0XHRcdHJldHVybiBvYXV0aFRva2VuUGFyYW1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXHQvLyBmb3Igc29tZSByZWFzb24gdGhlIHJlc3BvbnNlIGhhZCBubyBib2R5XG5cdGlmICghZmV0Y2hSZXN1bHRBY3Rpb24/LmRhdGEpIHtcblx0XHRyZXR1cm4gbnVsbFxuXHR9XG5cdHJldHVybiBmZXRjaFJlc3VsdEFjdGlvbi5kYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogcGVyZm9ybVRva2VuUmVmcmVzaCgpOiBTYWdhSXRlcmF0b3Ige1xuXHRpZiAocmVmcmVzaExvY2sgfHwgIW9hdXRoVG9rZW4pIHtcblx0XHQvLyBhbHJlYWR5IHJlZnJlc2hpbmcuIHdhaXQgZm9yIHRoZSBjdXJyZW50IHJlZnJlc2ggdG8gc3VjY2VlZCBvciBmYWlsLlxuXHRcdHlpZWxkIHJhY2Uoe1xuXHRcdFx0cmVmcmVzaFN1Y2Nlc3M6IHRha2UoQVVUSF9UT0tFTl9TVUNDRVNTX0FDVElPTl9UWVBFLlRPS0VOX1JFRlJFU0hfU1VDQ0VFREVEKSxcblx0XHRcdHJlZnJlc2hGYWlsZWQ6IHRha2UoQVVUSF9BQ1RJT05fVFlQRS5UT0tFTl9SRUZSRVNIX0ZBSUxFRClcblx0XHR9KVxuXHRcdHJldHVyblxuXHR9XG5cdGxvZ2dlci5kZWJ1ZygnUmVmcmVzaGluZyBPQXV0aCB0b2tlbicpXG5cdHJlZnJlc2hMb2NrID0gdHJ1ZVxuXHQvLyBvYXV0aFRva2VuIHdpbGwgYmUgc2V0IHRvOlxuXHQvLyAxLiBuZXcgdG9rZW4gKHN1Y2Nlc3MpXG5cdC8vIDIuIHNhbWUgdG9rZW4gKGZhaWxlZCBmcm9tIHRpbWVvdXQgb3Igc2VydmVyIGVycm9yKVxuXHQvLyAzLiBudWxsIChmYWlsKVxuXHRjb25zdCBvcmlnaW5hbEFjY2Vzc1Rva2VuID0gb2F1dGhUb2tlbi5hY2Nlc3NfdG9rZW5cblx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwoZ2V0VG9rZW5Gcm9tUmVmcmVzaFRva2VuLCBvYXV0aFRva2VuKVxuXHRpZiAoISFvYXV0aFRva2VuICYmIG9hdXRoVG9rZW4uYWNjZXNzX3Rva2VuICE9PSBvcmlnaW5hbEFjY2Vzc1Rva2VuKSB7XG5cdFx0bG9nZ2VyLmRlYnVnKCdPQXV0aCB0b2tlbiByZWZyZXNoZWQnKVxuXHRcdHlpZWxkIGNhbGwob2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UucGVyc2lzdFRva2VuLCBvYXV0aFRva2VuKVxuXHRcdHlpZWxkIHB1dDxBdXRoVG9rZW5TdWNjZXNzQWN0aW9uPih7IHR5cGU6IEFVVEhfVE9LRU5fU1VDQ0VTU19BQ1RJT05fVFlQRS5UT0tFTl9SRUZSRVNIX1NVQ0NFRURFRCwgb2F1dGhUb2tlbiB9KVxuXHR9IGVsc2UgaWYgKG9hdXRoVG9rZW4gPT09IG51bGwpIHtcblx0XHRsb2dnZXIuZGVidWcoJ09BdXRoIHRva2VuIGZhaWxlZCB0byByZWZyZXNoJylcblx0XHQvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb3V0c2lkZSBvZiB0aGUgdG9rZW4gaGF2aW5nIGJlZW4gcmV2b2tlZCBvbiB0aGUgc2VydmVyIHNpZGVcblx0XHR5aWVsZCBhbGwoe1xuXHRcdFx0cmVmcmVzaEZhaWxlZDogcHV0PEF1dGhBY3Rpb24+KHsgdHlwZTogQVVUSF9BQ1RJT05fVFlQRS5UT0tFTl9SRUZSRVNIX0ZBSUxFRCB9KSxcblx0XHRcdGxvZ091dDogcHV0PEF1dGhBY3Rpb24+KHsgdHlwZTogQVVUSF9BQ1RJT05fVFlQRS5MT0dfT1VUX1JFUVVFU1RFRCB9KVxuXHRcdH0pXG5cdH1cblx0cmVmcmVzaExvY2sgPSBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGxvZ2luRmxvdyhtb2RlbEZldGNoUmVxdWVzdEFjdGlvbjogTW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24pOiBTYWdhSXRlcmF0b3Ige1xuXHR5aWVsZCBwdXQobW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24pXG5cdGNvbnN0IHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbixcblx0XHRmZXRjaEVycm9yQWN0aW9uXG5cdH06IHsgZmV0Y2hSZXN1bHRBY3Rpb24/OiBNb2RlbEZldGNoUmVzdWx0QWN0aW9uOyBmZXRjaEVycm9yQWN0aW9uPzogTW9kZWxGZXRjaEVycm9yQWN0aW9uIH0gPSB5aWVsZCByYWNlKHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZChtb2RlbEZldGNoUmVxdWVzdEFjdGlvbi5tb2RlbE5hbWUpKSxcblx0XHRmZXRjaEVycm9yQWN0aW9uOiB0YWtlKHRha2VNYXRjaGVzTW9kZWxGZXRjaEZhaWxlZChtb2RlbEZldGNoUmVxdWVzdEFjdGlvbi5tb2RlbE5hbWUpKVxuXHR9KVxuXHRpZiAoZmV0Y2hFcnJvckFjdGlvbikge1xuXHRcdHJldHVybiBudWxsXG5cdH1cblx0Y29uc3QgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmV0Y2hSZXN1bHRBY3Rpb24/LmRhdGE/LmNvZGVcblx0aWYgKCFjb2RlKSB7XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXHRyZXR1cm4geWllbGQgY2FsbChnZXRUb2tlbkZyb21Db2RlLCBjb2RlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGNyZWRlbnRpYWxzTG9naW5GbG93KFxuXHRhY3Rpb246IEF1dGhDYXNWMUxvZ2luUmVxdWVzdEFjdGlvbiB8IEF1dGhMb2NhbExvZ2luUmVxdWVzdEFjdGlvbixcblx0bW9kZWxOYW1lOiBzdHJpbmdcbik6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IG1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uOiBNb2RlbEZldGNoUmVxdWVzdEFjdGlvbiA9IHtcblx0XHQvLyBzZXQgcmVxdWlyZWQgZGVmYXVsdHNcblx0XHR0eXBlOiBNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFLkZFVENIX1JFUVVFU1QsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG5vU3RvcmU6IHRydWUsXG5cdFx0Ly8gZm9yY2Ugbm8gcmV0cnlcblx0XHRub1JldHJ5OiB0cnVlLFxuXHRcdC8vIHBhc3MgdGhydSBib2R5XG5cdFx0Ym9keTogYWN0aW9uLmJvZHlcblx0fVxuXHRyZXR1cm4geWllbGQgY2FsbChsb2dpbkZsb3csIG1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uKVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGNhc1YxTG9naW5GbG93KGFjdGlvbjogQXV0aENhc1YxTG9naW5SZXF1ZXN0QWN0aW9uKTogU2FnYUl0ZXJhdG9yIHtcblx0cmV0dXJuIHlpZWxkIGNhbGwoY3JlZGVudGlhbHNMb2dpbkZsb3csIGFjdGlvbiwgJ2NvZGVGcm9tQ2FzVjEnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGxvY2FsTG9naW5GbG93KGFjdGlvbjogQXV0aExvY2FsTG9naW5SZXF1ZXN0QWN0aW9uKTogU2FnYUl0ZXJhdG9yIHtcblx0cmV0dXJuIHlpZWxkIGNhbGwoY3JlZGVudGlhbHNMb2dpbkZsb3csIGFjdGlvbiwgJ2NvZGVGcm9tTG9jYWxDcmVkZW50aWFscycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogY2FzVGlja2V0TG9naW5GbG93KHRpY2tldDogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcpOiBTYWdhSXRlcmF0b3Ige1xuXHRjb25zdCBtb2RlbEZldGNoUmVxdWVzdEFjdGlvbjogTW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24gPSB7XG5cdFx0dHlwZTogTU9ERUxfRkVUQ0hfUkVRVUVTVF9BQ1RJT05fVFlQRS5GRVRDSF9SRVFVRVNULFxuXHRcdG1vZGVsTmFtZTogJ2NvZGVGcm9tQ2FzVGlja2V0Jyxcblx0XHRub1N0b3JlOiB0cnVlLFxuXHRcdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0XHR0aWNrZXQsXG5cdFx0XHRzZXJ2aWNlXG5cdFx0fVxuXHR9XG5cdHJldHVybiB5aWVsZCBjYWxsKGxvZ2luRmxvdywgbW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogcGtjZUxvZ2luRmxvdyhfOiBBdXRoUEtDRUxvZ2luUmVxdWVzdEFjdGlvbik6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGlmICghYXBwQ29uZmlnLkNMSUVOVF9JRCB8fCAhYXBwQ29uZmlnLk9BVVRIX1BLQ0VfU0NPUEUgfHwgIWFwcENvbmZpZy5PQVVUSF9QS0NFX0VORFBPSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdPQXV0aCBQS0NFIHNldHRpbmdzIG1pc3NpbmcgaW4gQXBwQ29uZmlnJylcblx0fVxuXG5cdC8vIFNldCBzdGF0ZSBhbmQgY29kZSB2ZXJpZmllciBpbiBsb2NhbCBzdG9yYWdlIGZvciB1c2UgYWZ0ZXIgY29kZSBmbG93IHJlZGlyZWN0LlxuXHQvLyBUaGVzZSB3aWxsIGJlIHNlbnQgdG8gdGhlIGJhY2tlbmQgdG8gZ2V0IHRoZSBhY3R1YWwgYmVhcmVyIHRva2VuLlxuXHRjb25zdCBzdGF0ZSA9IHV1aWR2NCgpXG5cdGNvbnN0IGNvZGVWZXJpZmllciA9IHV1aWR2NCgpXG5cdGNvbnN0IHNoYTI1NkNvZGVWZXJpZmllciA9IHlpZWxkIGNhbGwoc2hhMjU2QXN5bmMsIGNvZGVWZXJpZmllcilcblx0Y29uc3QgY29kZUNoYWxsZW5nZSA9IGJhc2U2NFVybEVuY29kZShzaGEyNTZDb2RlVmVyaWZpZXIpXG5cdG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RTdGF0ZShzdGF0ZSlcblx0b2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UucGVyc2lzdENvZGVWZXJpZmllcihjb2RlVmVyaWZpZXIpXG5cblx0Y29uc3QgaGlzdG9yeSA9IHdpbmRvd1NlcnZpY2UuZ2V0SGlzdG9yeSgpXG5cdGNvbnN0IGxvY2F0aW9uID0gd2luZG93U2VydmljZS5nZXRMb2NhdGlvbigpXG5cblx0Ly8gUmVkaXJlY3QgdG8gQlMgY29kZSBmbG93IGF1dGggZW5kcG9pbnQgKHdoaWNoIHdpbGwgcmVkaXJlY3QgYmFjayBoZXJlKVxuXHRjb25zdCBwa2NlQXV0aFJlZGlyZWN0VVJMID0gYCR7YXBwQ29uZmlnLk9BVVRIX1BLQ0VfRU5EUE9JTlR9PyR7bmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0cmVzcG9uc2VfdHlwZTogJ2NvZGUnLFxuXHRcdGNsaWVudF9pZDogYXBwQ29uZmlnLkNMSUVOVF9JRCxcblx0XHRzdGF0ZTogc3RhdGUsXG5cdFx0c2NvcGU6IGFwcENvbmZpZy5PQVVUSF9QS0NFX1NDT1BFLFxuXHRcdGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLFxuXHRcdGNvZGVfY2hhbGxlbmdlX21ldGhvZDogJ1MyNTYnLFxuXHRcdHJlZGlyZWN0X3VyaTogbG9jYXRpb24ub3JpZ2luXG5cdH0pfWBcblx0Ly8gVE9ETzogcmVmYWN0b3IgdG8gYWxsb3cgdGVzdGluZyB3aXRoIHdpbmRvd1NlcnZpY2Vcblx0d2luZG93LmxvY2F0aW9uLnJlcGxhY2UocGtjZUF1dGhSZWRpcmVjdFVSTClcblx0eWllbGQgY2FsbCgoKSA9PiB7fSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBoYW5kbGVBdXRoRmFpbHVyZShhY3Rpb246IE1vZGVsRmV0Y2hFcnJvckFjdGlvbik6IFNhZ2FJdGVyYXRvciB7XG5cdC8vIFRoaXMgc2hvdWxkIGJlIHVubGlrZWx5IHNpbmNlIHdlIG5vcm1hbGx5IGhhdmUgYSByZWZyZXNoIHRva2VuIGxvb3AgaGFwcGVuaW5nXG5cdC8vIGJ1dCBpZiB0aGUgYXBwIGlzIGJhY2tncm91bmRlZCwgdGhlIGxvb3AgbWlnaHQgbm90IGJlIGNhdWdodCB1cCB5ZXRcblx0aWYgKG9hdXRoVG9rZW4gJiYgYWN0aW9uLmVycm9yRGF0YSAmJiBhY3Rpb24uZXJyb3JEYXRhLnN0YXR1cyA9PT0gSFRUUF9TVEFUVVNfQ09ERS5VTkFVVEhPUklaRUQpIHtcblx0XHRsb2dnZXIuZGVidWcoJ3Rva2VuIGV4cGlyZWQgLSByZWZyZXNoaW5nJylcblx0XHR5aWVsZCBjYWxsKHBlcmZvcm1Ub2tlblJlZnJlc2gpXG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldE9BdXRoVG9rZW46IFRva2VuQWNjZXNzRnVuY3Rpb24gPSBmdW5jdGlvbiogKG1vZGVsTmFtZTogc3RyaW5nKSB7XG5cdC8vIERvbid0IHRyeSB0byByZWZyZXNoIHRoZSB0b2tlbiBpZiB3ZSdyZSBhbHJlYWR5IGluIGEgcmVxdWVzdCB0byByZWZyZXNoIHRoZSB0b2tlblxuXHRpZiAobW9kZWxOYW1lID09PSAnZ2V0VG9rZW4nKSB7XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXHRpZiAob2F1dGhUb2tlbiAmJiBvYXV0aFRva2VuWycuZXhwaXJlcyddKSB7XG5cdFx0Y29uc3QgdGhpcnR5U2Vjb25kc0Zyb21Ob3cgPSBuZXcgRGF0ZSgpXG5cdFx0dGhpcnR5U2Vjb25kc0Zyb21Ob3cuc2V0U2Vjb25kcyh0aGlydHlTZWNvbmRzRnJvbU5vdy5nZXRTZWNvbmRzKCkgKyAzMClcblx0XHRpZiAobmV3IERhdGUob2F1dGhUb2tlblsnLmV4cGlyZXMnXSkgPCB0aGlydHlTZWNvbmRzRnJvbU5vdykge1xuXHRcdFx0Ly8gc3RhcnQgYSB0b2tlbiByZWZyZXNoIGFuZCB3YWl0IGZvciB0aGUgc3VjY2VzcyBhY3Rpb24gaW4gY2FzZSBhbm90aGVyIHJlZnJlc2ggaXMgY3VycmVudGx5IGhhcHBlbmluZ1xuXHRcdFx0eWllbGQgY2FsbChwZXJmb3JtVG9rZW5SZWZyZXNoKVxuXHRcdFx0cmV0dXJuIG9hdXRoVG9rZW5cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9hdXRoVG9rZW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qIGF1dGhTYWdhKFxuXHRvYXV0aFBlcnNpc3RlbmNlU2VydmljZVBhcmFtOiBPQXV0aFBlcnNpc3RlbmNlU2VydmljZSA9IGRlZmF1bHRPQXV0aFBlcnNpc3RlbmNlU2VydmljZSxcblx0dGlja2V0UHJvdmlkZXJTZXJ2aWNlOiBUaWNrZXRQcm92aWRlclNlcnZpY2UgPSBkZWZhdWx0VGlja2V0UHJvdmlkZXJTZXJ2aWNlLFxuXHRjb2RlUHJvdmlkZXJTZXJ2aWNlOiBDb2RlUHJvdmlkZXJTZXJ2aWNlID0gZGVmYXVsdENvZGVQcm92aWRlclNlcnZpY2Vcbik6IFNhZ2FJdGVyYXRvciB7XG5cdGxvZ2dlciA9IGdldExvZ2dlcigpXG5cdG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlID0gb2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2VQYXJhbVxuXG5cdC8vIFRyeSB0byBnZXQgcGVyc2lzdGVkIHRva2VuIChub3JtYWxseSBpbiBBc3luY1N0b3JhZ2Ugb3IgTG9jYWxTdG9yYWdlKVxuXHRvYXV0aFRva2VuID0geWllbGQgY2FsbChvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5nZXRQZXJzaXN0ZWRUb2tlbilcblxuXHQvLyBJZiBubyB0b2tlbiwgdHJ5IHRvIGdldCBDQVMgdGlja2V0IChub3JtYWxseSBpbiB0aGUgVVJMKSwgdXNlIGl0IHRvIGdldCBhIHRva2VuXG5cdGlmICghb2F1dGhUb2tlbikge1xuXHRcdGNvbnN0IGNhc1RpY2tldCA9IHRpY2tldFByb3ZpZGVyU2VydmljZS5nZXRUaWNrZXQoKVxuXHRcdHRpY2tldFByb3ZpZGVyU2VydmljZS5yZW1vdmVUaWNrZXQoKVxuXHRcdGNvbnN0IHNlcnZpY2UgPSB0aWNrZXRQcm92aWRlclNlcnZpY2UuZ2V0QXBwU2VydmljZU5hbWUoKVxuXHRcdGlmIChjYXNUaWNrZXQgJiYgc2VydmljZSkge1xuXHRcdFx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwoY2FzVGlja2V0TG9naW5GbG93LCBjYXNUaWNrZXQsIHNlcnZpY2UpXG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgT0F1dGggQ29kZSBleGlzdHMgKG5vcm1hbGx5IGluIHRoZSBVUkwpLCB1c2UgaXQgdG8gZ2V0IGEgdG9rZW5cblx0Y29uc3QgY29kZSA9IGNvZGVQcm92aWRlclNlcnZpY2UuZ2V0Q29kZSgpXG5cdGlmIChjb2RlKSB7XG5cdFx0Ly8gTG9nIG91dCB0aGUgY3VycmVudCB1c2VyIGlmIGEgbmV3IHRva2VuIGlzIGFib3V0IHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBPQXV0aCBDb2RlXG5cdFx0aWYgKG9hdXRoVG9rZW4pIHtcblx0XHRcdHlpZWxkIGFsbCh7XG5cdFx0XHRcdGNsZWFyVXNlckRhdGE6IHB1dDxNb2RlbFJlbW92ZUtleUFjdGlvbj4oeyB0eXBlOiBNT0RFTF9SRU1PVkVfS0VZX0FDVElPTl9UWVBFLCBtb2RlbFBhdGg6ICd1c2VyJyB9KSxcblx0XHRcdFx0Y2xlYXJQZXJzaXN0ZW50VG9rZW46IGNhbGwob2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UucGVyc2lzdFRva2VuLCBudWxsKVxuXHRcdFx0fSlcblx0XHRcdG9hdXRoVG9rZW4gPSBudWxsXG5cdFx0fVxuXG5cdFx0Ly8gSWYgT0F1dGggc3RhdGUgZXhpc3RzIChub3JtYWxseSBpbiB0aGUgVVJMKSwgdXNlIGl0IGluIGFkZGl0aW9uIHRvIHRoZSBjb2RlIGZvciBQS0NFIGxvZ2luIGZsb3dcblx0XHRjb25zdCBzdGF0ZSA9IGNvZGVQcm92aWRlclNlcnZpY2UuZ2V0U3RhdGUoKVxuXHRcdGlmIChzdGF0ZSkge1xuXHRcdFx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwoZ2V0VG9rZW5Gcm9tQ29kZUFuZFN0YXRlLCBjb2RlLCBzdGF0ZSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwoZ2V0VG9rZW5Gcm9tQ29kZSwgY29kZSlcblx0XHR9XG5cdH1cblx0Y29kZVByb3ZpZGVyU2VydmljZS5yZW1vdmVDb2RlQW5kU3RhdGUoKVxuXG5cdHlpZWxkIHB1dDxBdXRoVG9rZW5BY3Rpb24+KHsgdHlwZTogQVVUSF9UT0tFTl9BQ1RJT05fVFlQRS5BVVRIX0lOSVRJQUxJWkVELCBvYXV0aFRva2VuIH0pXG5cblx0eWllbGQgdGFrZUV2ZXJ5KE1PREVMX0ZFVENIX0VSUk9SX0FDVElPTl9UWVBFLlRSWV9GRVRDSF9GQUlMRUQsIGhhbmRsZUF1dGhGYWlsdXJlKVxuXG5cdGRvIHtcblx0XHRpZiAoIW9hdXRoVG9rZW4pIHtcblx0XHRcdGNvbnN0IHtcblx0XHRcdFx0Y2FzVjFBY3Rpb24sXG5cdFx0XHRcdGxvY2FsTG9naW5BY3Rpb24sXG5cdFx0XHRcdHBrY2VMb2dpbkFjdGlvblxuXHRcdFx0fToge1xuXHRcdFx0XHRjYXNWMUFjdGlvbj86IEF1dGhDYXNWMUxvZ2luUmVxdWVzdEFjdGlvblxuXHRcdFx0XHRsb2NhbExvZ2luQWN0aW9uPzogQXV0aExvY2FsTG9naW5SZXF1ZXN0QWN0aW9uXG5cdFx0XHRcdHBrY2VMb2dpbkFjdGlvbj86IEF1dGhQS0NFTG9naW5SZXF1ZXN0QWN0aW9uXG5cdFx0XHR9ID0geWllbGQgcmFjZSh7XG5cdFx0XHRcdGNhc1YxQWN0aW9uOiB0YWtlKEFVVEhfQ0FTX1YxX0xPR0lOX1JFUVVFU1RfQUNUSU9OX1RZUEUuQ0FTX1YxX0xPR0lOX1JFUVVFU1QpLFxuXHRcdFx0XHRsb2NhbExvZ2luQWN0aW9uOiB0YWtlKEFVVEhfTE9DQUxfTE9HSU5fUkVRVUVTVF9BQ1RJT05fVFlQRS5MT0NBTF9MT0dJTl9SRVFVRVNUKSxcblx0XHRcdFx0cGtjZUxvZ2luQWN0aW9uOiB0YWtlKEFVVEhfUEtDRV9MT0dJTl9SRVFVRVNUX0FDVElPTl9UWVBFLlBLQ0VfTE9HSU5fUkVRVUVTVClcblx0XHRcdH0pXG5cblx0XHRcdHlpZWxkIHB1dDxBdXRoQWN0aW9uPih7IHR5cGU6IEFVVEhfQUNUSU9OX1RZUEUuTE9HSU5fUkVRVUVTVEVEIH0pXG5cdFx0XHRpZiAoY2FzVjFBY3Rpb24pIHtcblx0XHRcdFx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwoY2FzVjFMb2dpbkZsb3csIGNhc1YxQWN0aW9uKVxuXHRcdFx0fSBlbHNlIGlmIChsb2NhbExvZ2luQWN0aW9uKSB7XG5cdFx0XHRcdG9hdXRoVG9rZW4gPSB5aWVsZCBjYWxsKGxvY2FsTG9naW5GbG93LCBsb2NhbExvZ2luQWN0aW9uKVxuXHRcdFx0fSBlbHNlIGlmIChwa2NlTG9naW5BY3Rpb24pIHtcblx0XHRcdFx0Ly8gb2F1dGhUb2tlbiBpcyBub3QgcmV0dXJuZWQgaGVyZSwgYXMgdGhpcyBmbG93IHdpbGwgcmVzdWx0IGluIGEgd2luZG93IHJlZGlyZWN0XG5cdFx0XHRcdHlpZWxkIGNhbGwocGtjZUxvZ2luRmxvdywgcGtjZUxvZ2luQWN0aW9uKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChvYXV0aFRva2VuKSB7XG5cdFx0XHR5aWVsZCBjYWxsKG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RUb2tlbiwgb2F1dGhUb2tlbilcblx0XHRcdHlpZWxkIGFsbCh7XG5cdFx0XHRcdGxvZ2luU3VjY2VzczogcHV0PEF1dGhUb2tlblN1Y2Nlc3NBY3Rpb24+KHtcblx0XHRcdFx0XHR0eXBlOiBBVVRIX1RPS0VOX1NVQ0NFU1NfQUNUSU9OX1RZUEUuR0VUX1RPS0VOX1NVQ0NFRURFRCxcblx0XHRcdFx0XHRvYXV0aFRva2VuXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRsb2dPdXQ6IHRha2UoQVVUSF9BQ1RJT05fVFlQRS5MT0dfT1VUX1JFUVVFU1RFRClcblx0XHRcdH0pXG5cdFx0fSBlbHNlIHtcblx0XHRcdHlpZWxkIHB1dDxBdXRoQWN0aW9uPih7IHR5cGU6IEFVVEhfQUNUSU9OX1RZUEUuTE9HSU5fRkFJTEVEIH0pXG5cdFx0fVxuXG5cdFx0eWllbGQgYWxsKHtcblx0XHRcdGNsZWFyVXNlckRhdGE6IHB1dDxNb2RlbFJlbW92ZUtleUFjdGlvbj4oeyB0eXBlOiBNT0RFTF9SRU1PVkVfS0VZX0FDVElPTl9UWVBFLCBtb2RlbFBhdGg6ICd1c2VyJyB9KSxcblx0XHRcdGNsZWFyUGVyc2lzdGVudFRva2VuOiBjYWxsKG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RUb2tlbiwgbnVsbClcblx0XHR9KVxuXHRcdG9hdXRoVG9rZW4gPSBudWxsXG5cdH0gd2hpbGUgKHRydWUpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsb0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxzQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sY0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sTUFBQSxHQUFBUCxPQUFBO0FBU0EsSUFBQVEsT0FBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsSUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsUUFBQSxHQUFBVixPQUFBO0FBd0JBOztBQUVPLE1BQU1XLHlCQUF5QixHQUFHQSxDQUFDQyxNQUFpQixFQUFFQyxTQUFpQixLQUM3RSxJQUFBQywwQ0FBaUMsRUFBQ0YsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ0csU0FBUyxLQUFLRixTQUFTO0FBQUFHLE9BQUEsQ0FBQUwseUJBQUEsR0FBQUEseUJBQUE7QUFFckUsTUFBTU0sNkJBQTZCLEdBQUlKLFNBQWlCLElBQU1LLGNBQXlCLElBQzdGUCx5QkFBeUIsQ0FBQ08sY0FBYyxFQUFFTCxTQUFTLENBQUM7QUFBQUcsT0FBQSxDQUFBQyw2QkFBQSxHQUFBQSw2QkFBQTtBQUU5QyxNQUFNRSx1QkFBdUIsR0FBR0EsQ0FBQ1AsTUFBaUIsRUFBRUMsU0FBaUIsS0FDM0UsSUFBQU8seUNBQWdDLEVBQUNSLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUNHLFNBQVMsS0FBS0YsU0FBUztBQUFBRyxPQUFBLENBQUFHLHVCQUFBLEdBQUFBLHVCQUFBO0FBRXBF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
414
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZWZmZWN0cyIsInJlcXVpcmUiLCJfdXVpZCIsIl9jb25zdGFudHMiLCJfY29kZVByb3ZpZGVyU2VydmljZSIsIl9vYXV0aFBlcnNpc3RlbmNlU2VydmljZSIsIl90aWNrZXRQcm92aWRlclNlcnZpY2UiLCJfd2luZG93U2VydmljZSIsIl90eXBlcyIsIl9sb2dnZXIiLCJfdXJsIiwiX2FjdGlvbnMiLCJtYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkIiwiYWN0aW9uIiwibW9kZWxOYW1lIiwiaXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uIiwibW9kZWxQYXRoIiwiZXhwb3J0cyIsInRha2VNYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkIiwiaW5jb21pbmdBY3Rpb24iLCJtYXRjaGVzTW9kZWxGZXRjaEZhaWxlZCIsImlzVHJhbnNpZW50TW9kZWxGZXRjaEVycm9yQWN0aW9uIiwidGFrZU1hdGNoZXNNb2RlbEZldGNoRmFpbGVkIiwib2F1dGhUb2tlbiIsIm9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlIiwicmVmcmVzaExvY2siLCJsb2dnZXIiLCJnZXRUb2tlbkZyb21Db2RlIiwiY29kZSIsImFwcENvbmZpZyIsImdldEFwcENvbmZpZyIsIkNMSUVOVF9JRCIsIkNMSUVOVF9TRUNSRVQiLCJFcnJvciIsImdldFRva2VuTW9kZWxOYW1lIiwiZm9ybUJvZHkiLCJVUkxTZWFyY2hQYXJhbXMiLCJncmFudF90eXBlIiwiY2xpZW50X2lkIiwiY2xpZW50X3NlY3JldCIsInB1dCIsInR5cGUiLCJNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFIiwiRkVUQ0hfUkVRVUVTVCIsImJvZHkiLCJ0b1N0cmluZyIsIm5vU3RvcmUiLCJmZXRjaFJlc3VsdEFjdGlvbiIsImZldGNoRXJyb3JBY3Rpb24iLCJyYWNlIiwidGFrZSIsImRhdGEiLCJnZXRUb2tlbkZyb21Db2RlQW5kU3RhdGUiLCJzdGF0ZSIsIk9BVVRIX1BLQ0VfU0NPUEUiLCJPQVVUSF9QS0NFX0VORFBPSU5UIiwiY29kZVZlcmlmaWVyIiwiY2FsbCIsImdldFBlcnNpc3RlZENvZGVWZXJpZmllciIsInBlcnNpc3RlZFN0YXRlIiwiZ2V0UGVyc2lzdGVkU3RhdGUiLCJwZXJzaXN0U3RhdGUiLCJwZXJzaXN0Q29kZVZlcmlmaWVyIiwibG9jYXRpb24iLCJ3aW5kb3dTZXJ2aWNlIiwiZ2V0TG9jYXRpb24iLCJzY29wZSIsImNvZGVfdmVyaWZpZXIiLCJyZWRpcmVjdF91cmkiLCJvcmlnaW4iLCJnZXRUb2tlbkZyb21SZWZyZXNoVG9rZW4iLCJvYXV0aFRva2VuUGFyYW0iLCJyZWZyZXNoX3Rva2VuIiwiYXBwZW5kIiwiZXJyb3JEYXRhIiwic3RhdHVzIiwiSFRUUF9TVEFUVVNfQ09ERSIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsInBlcmZvcm1Ub2tlblJlZnJlc2giLCJyZWZyZXNoU3VjY2VzcyIsIkFVVEhfVE9LRU5fU1VDQ0VTU19BQ1RJT05fVFlQRSIsIlRPS0VOX1JFRlJFU0hfU1VDQ0VFREVEIiwicmVmcmVzaEZhaWxlZCIsIkFVVEhfQUNUSU9OX1RZUEUiLCJUT0tFTl9SRUZSRVNIX0ZBSUxFRCIsImRlYnVnIiwib3JpZ2luYWxBY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsInBlcnNpc3RUb2tlbiIsImFsbCIsImxvZ091dCIsIkxPR19PVVRfUkVRVUVTVEVEIiwibG9naW5GbG93IiwibW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24iLCJjcmVkZW50aWFsc0xvZ2luRmxvdyIsIm5vUmV0cnkiLCJjYXNWMUxvZ2luRmxvdyIsImxvY2FsTG9naW5GbG93IiwiY2FzVGlja2V0TG9naW5GbG93IiwidGlja2V0Iiwic2VydmljZSIsInF1ZXJ5UGFyYW1zIiwicGtjZUxvZ2luRmxvdyIsIl8iLCJ1dWlkdjQiLCJzaGEyNTZDb2RlVmVyaWZpZXIiLCJzaGEyNTZBc3luYyIsImNvZGVDaGFsbGVuZ2UiLCJiYXNlNjRVcmxFbmNvZGUiLCJwa2NlQXV0aFJlZGlyZWN0VVJMIiwicmVzcG9uc2VfdHlwZSIsImNvZGVfY2hhbGxlbmdlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwicmVwbGFjZSIsImhhbmRsZUF1dGhGYWlsdXJlIiwiVU5BVVRIT1JJWkVEIiwiZ2V0T0F1dGhUb2tlbiIsInRoaXJ0eVNlY29uZHNGcm9tTm93IiwiRGF0ZSIsInNldFNlY29uZHMiLCJnZXRTZWNvbmRzIiwiYXV0aFNhZ2EiLCJvYXV0aFBlcnNpc3RlbmNlU2VydmljZVBhcmFtIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiZGVmYXVsdE9BdXRoUGVyc2lzdGVuY2VTZXJ2aWNlIiwidGlja2V0UHJvdmlkZXJTZXJ2aWNlIiwiZGVmYXVsdFRpY2tldFByb3ZpZGVyU2VydmljZSIsImNvZGVQcm92aWRlclNlcnZpY2UiLCJkZWZhdWx0Q29kZVByb3ZpZGVyU2VydmljZSIsImdldExvZ2dlciIsImdldFBlcnNpc3RlZFRva2VuIiwiY2FzVGlja2V0IiwiZ2V0VGlja2V0IiwicmVtb3ZlVGlja2V0IiwiZ2V0QXBwU2VydmljZU5hbWUiLCJnZXRDb2RlIiwiY2xlYXJVc2VyRGF0YSIsIk1PREVMX1JFTU9WRV9LRVlfQUNUSU9OX1RZUEUiLCJjbGVhclBlcnNpc3RlbnRUb2tlbiIsImdldFN0YXRlIiwicmVtb3ZlQ29kZUFuZFN0YXRlIiwiQVVUSF9UT0tFTl9BQ1RJT05fVFlQRSIsIkFVVEhfSU5JVElBTElaRUQiLCJ0YWtlRXZlcnkiLCJNT0RFTF9GRVRDSF9FUlJPUl9BQ1RJT05fVFlQRSIsIlRSWV9GRVRDSF9GQUlMRUQiLCJjYXNWMUFjdGlvbiIsImxvY2FsTG9naW5BY3Rpb24iLCJwa2NlTG9naW5BY3Rpb24iLCJBVVRIX0NBU19WMV9MT0dJTl9SRVFVRVNUX0FDVElPTl9UWVBFIiwiQ0FTX1YxX0xPR0lOX1JFUVVFU1QiLCJBVVRIX0xPQ0FMX0xPR0lOX1JFUVVFU1RfQUNUSU9OX1RZUEUiLCJMT0NBTF9MT0dJTl9SRVFVRVNUIiwiQVVUSF9QS0NFX0xPR0lOX1JFUVVFU1RfQUNUSU9OX1RZUEUiLCJQS0NFX0xPR0lOX1JFUVVFU1QiLCJMT0dJTl9SRVFVRVNURUQiLCJsb2dpblN1Y2Nlc3MiLCJHRVRfVE9LRU5fU1VDQ0VFREVEIiwiTE9HSU5fRkFJTEVEIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlZHV4L3NhZ2FzL2F1dGhTYWdhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhZ2FJdGVyYXRvciB9IGZyb20gJ0ByZWR1eC1zYWdhL2NvcmUnXG5pbXBvcnQgeyBBbnlBY3Rpb24gfSBmcm9tICdyZWR1eCdcbmltcG9ydCB7IGFsbCwgY2FsbCwgcHV0LCByYWNlLCB0YWtlLCB0YWtlRXZlcnkgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgZ2V0QXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgY29kZVByb3ZpZGVyU2VydmljZSBhcyBkZWZhdWx0Q29kZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvZGVQcm92aWRlclNlcnZpY2UnXG5pbXBvcnQgeyBvYXV0aFBlcnNpc3RlbmNlU2VydmljZSBhcyBkZWZhdWx0T0F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vYXV0aFBlcnNpc3RlbmNlU2VydmljZSdcbmltcG9ydCB7IHRpY2tldFByb3ZpZGVyU2VydmljZSBhcyBkZWZhdWx0VGlja2V0UHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGlja2V0UHJvdmlkZXJTZXJ2aWNlJ1xuaW1wb3J0IHsgd2luZG93U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3dpbmRvd1NlcnZpY2UnXG5pbXBvcnQge1xuXHRDb2RlUHJvdmlkZXJTZXJ2aWNlLFxuXHRIVFRQX1NUQVRVU19DT0RFLFxuXHRPQXV0aFBlcnNpc3RlbmNlU2VydmljZSxcblx0T0F1dGhUb2tlbixcblx0T0F1dGhUb2tlbk9yTnVsbCxcblx0VGlja2V0UHJvdmlkZXJTZXJ2aWNlLFxuXHRUb2tlbkFjY2Vzc0Z1bmN0aW9uXG59IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0TG9nZ2VyLCBMb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBiYXNlNjRVcmxFbmNvZGUsIHNoYTI1NkFzeW5jIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXJsJ1xuaW1wb3J0IHtcblx0QVVUSF9BQ1RJT05fVFlQRSxcblx0QVVUSF9DQVNfVjFfTE9HSU5fUkVRVUVTVF9BQ1RJT05fVFlQRSxcblx0QVVUSF9MT0NBTF9MT0dJTl9SRVFVRVNUX0FDVElPTl9UWVBFLFxuXHRBVVRIX1BLQ0VfTE9HSU5fUkVRVUVTVF9BQ1RJT05fVFlQRSxcblx0QVVUSF9UT0tFTl9BQ1RJT05fVFlQRSxcblx0QVVUSF9UT0tFTl9TVUNDRVNTX0FDVElPTl9UWVBFLFxuXHRBdXRoQWN0aW9uLFxuXHRBdXRoQ2FzVjFMb2dpblJlcXVlc3RBY3Rpb24sXG5cdEF1dGhMb2NhbExvZ2luUmVxdWVzdEFjdGlvbixcblx0QXV0aFBLQ0VMb2dpblJlcXVlc3RBY3Rpb24sXG5cdEF1dGhUb2tlbkFjdGlvbixcblx0QXV0aFRva2VuU3VjY2Vzc0FjdGlvbixcblx0aXNUcmFuc2llbnRNb2RlbEZldGNoRXJyb3JBY3Rpb24sXG5cdGlzVHJhbnNpZW50TW9kZWxGZXRjaFJlc3VsdEFjdGlvbixcblx0TU9ERUxfRkVUQ0hfRVJST1JfQUNUSU9OX1RZUEUsXG5cdE1PREVMX0ZFVENIX1JFUVVFU1RfQUNUSU9OX1RZUEUsXG5cdE1PREVMX1JFTU9WRV9LRVlfQUNUSU9OX1RZUEUsXG5cdE1vZGVsRmV0Y2hFcnJvckFjdGlvbixcblx0TW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24sXG5cdE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb24sXG5cdE1vZGVsUmVtb3ZlS2V5QWN0aW9uXG59IGZyb20gJy4uL2FjdGlvbnMnXG5cbi8vI3JlZ2lvbiBIZWxwZXJzXG5cbmV4cG9ydCBjb25zdCBtYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkID0gKGFjdGlvbjogQW55QWN0aW9uLCBtb2RlbE5hbWU6IHN0cmluZykgPT5cblx0aXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLm1vZGVsUGF0aCA9PT0gbW9kZWxOYW1lXG5cbmV4cG9ydCBjb25zdCB0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZCA9IChtb2RlbE5hbWU6IHN0cmluZykgPT4gKGluY29taW5nQWN0aW9uOiBBbnlBY3Rpb24pID0+XG5cdG1hdGNoZXNNb2RlbEZldGNoUmVjZWl2ZWQoaW5jb21pbmdBY3Rpb24sIG1vZGVsTmFtZSlcblxuZXhwb3J0IGNvbnN0IG1hdGNoZXNNb2RlbEZldGNoRmFpbGVkID0gKGFjdGlvbjogQW55QWN0aW9uLCBtb2RlbE5hbWU6IHN0cmluZykgPT5cblx0aXNUcmFuc2llbnRNb2RlbEZldGNoRXJyb3JBY3Rpb24oYWN0aW9uKSAmJiBhY3Rpb24ubW9kZWxQYXRoID09PSBtb2RlbE5hbWVcblxuZXhwb3J0IGNvbnN0IHRha2VNYXRjaGVzTW9kZWxGZXRjaEZhaWxlZCA9IChtb2RlbE5hbWU6IHN0cmluZykgPT4gKGluY29taW5nQWN0aW9uOiBBbnlBY3Rpb24pID0+XG5cdG1hdGNoZXNNb2RlbEZldGNoRmFpbGVkKGluY29taW5nQWN0aW9uLCBtb2RlbE5hbWUpXG5cbi8vI2VuZHJlZ2lvbiBIZWxwZXJzXG5cbi8vI3JlZ2lvbiBMb2NhbCBWYXJpYWJsZXNcblxubGV0IG9hdXRoVG9rZW46IE9BdXRoVG9rZW5Pck51bGwgPSBudWxsXG5sZXQgb2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2U6IE9BdXRoUGVyc2lzdGVuY2VTZXJ2aWNlXG5sZXQgcmVmcmVzaExvY2s6IGJvb2xlYW5cbmxldCBsb2dnZXI6IExvZ2dlclxuXG4vLyNlbmRyZWdpb24gTG9jYWwgVmFyaWFibGVzXG5cbmV4cG9ydCBmdW5jdGlvbiogZ2V0VG9rZW5Gcm9tQ29kZShjb2RlOiBzdHJpbmcpOiBTYWdhSXRlcmF0b3Ige1xuXHRjb25zdCBhcHBDb25maWcgPSBnZXRBcHBDb25maWcoKVxuXHRpZiAoIWFwcENvbmZpZy5DTElFTlRfSUQgfHwgIWFwcENvbmZpZy5DTElFTlRfU0VDUkVUKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDTElFTlRfSUQgYW5kIENMSUVOVF9TRUNSRVQgYXJlIHJlcXVpcmVkIGluIEFwcENvbmZpZycpXG5cdH1cblx0Y29uc3QgZ2V0VG9rZW5Nb2RlbE5hbWUgPSAnZ2V0VG9rZW4nXG5cdGNvbnN0IGZvcm1Cb2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0Z3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG5cdFx0Y2xpZW50X2lkOiBhcHBDb25maWcuQ0xJRU5UX0lELFxuXHRcdGNsaWVudF9zZWNyZXQ6IGFwcENvbmZpZy5DTElFTlRfU0VDUkVULFxuXHRcdGNvZGU6IGNvZGVcblx0fSlcblx0eWllbGQgcHV0PE1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uPih7XG5cdFx0dHlwZTogTU9ERUxfRkVUQ0hfUkVRVUVTVF9BQ1RJT05fVFlQRS5GRVRDSF9SRVFVRVNULFxuXHRcdG1vZGVsTmFtZTogZ2V0VG9rZW5Nb2RlbE5hbWUsXG5cdFx0Ym9keTogZm9ybUJvZHkudG9TdHJpbmcoKSxcblx0XHRub1N0b3JlOiB0cnVlXG5cdH0pXG5cdGNvbnN0IHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbixcblx0XHRmZXRjaEVycm9yQWN0aW9uXG5cdH06IHsgZmV0Y2hSZXN1bHRBY3Rpb24/OiBNb2RlbEZldGNoUmVzdWx0QWN0aW9uOyBmZXRjaEVycm9yQWN0aW9uPzogTW9kZWxGZXRjaEVycm9yQWN0aW9uIH0gPSB5aWVsZCByYWNlKHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZChnZXRUb2tlbk1vZGVsTmFtZSkpLFxuXHRcdGZldGNoRXJyb3JBY3Rpb246IHRha2UodGFrZU1hdGNoZXNNb2RlbEZldGNoRmFpbGVkKGdldFRva2VuTW9kZWxOYW1lKSlcblx0fSlcblx0aWYgKGZldGNoRXJyb3JBY3Rpb24gfHwgIWZldGNoUmVzdWx0QWN0aW9uPy5kYXRhKSB7XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXHRyZXR1cm4gZmV0Y2hSZXN1bHRBY3Rpb24uZGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGdldFRva2VuRnJvbUNvZGVBbmRTdGF0ZShjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBTYWdhSXRlcmF0b3Ige1xuXHRjb25zdCBhcHBDb25maWcgPSBnZXRBcHBDb25maWcoKVxuXHRpZiAoIWFwcENvbmZpZy5DTElFTlRfSUQgfHwgIWFwcENvbmZpZy5PQVVUSF9QS0NFX1NDT1BFIHx8ICFhcHBDb25maWcuT0FVVEhfUEtDRV9FTkRQT0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ0xJRU5UX0lELCBPQVVUSF9QS0NFX1NDT1BFLCBhbmQgT0FVVEhfUEtDRV9FTkRQT0lOVCBhcmUgcmVxdWlyZWQgaW4gQXBwQ29uZmlnJylcblx0fVxuXG5cdC8vIHZhbGlkYXRlIHBlcnNpc3RlZCB2YWx1ZXNcblx0Y29uc3QgY29kZVZlcmlmaWVyID0geWllbGQgY2FsbChvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5nZXRQZXJzaXN0ZWRDb2RlVmVyaWZpZXIpXG5cdGlmICghY29kZVZlcmlmaWVyKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNvZGVfdmVyaWZpZXInKVxuXHR9XG5cdGNvbnN0IHBlcnNpc3RlZFN0YXRlID0geWllbGQgY2FsbChvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5nZXRQZXJzaXN0ZWRTdGF0ZSlcblx0aWYgKHBlcnNpc3RlZFN0YXRlICE9PSBzdGF0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZScpXG5cdH1cblx0Ly8gY2xlYXIgcGVyc2lzdGVkIHZhbHVlc1xuXHR5aWVsZCBjYWxsKG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RTdGF0ZSwgbnVsbClcblx0eWllbGQgY2FsbChvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5wZXJzaXN0Q29kZVZlcmlmaWVyLCBudWxsKVxuXG5cdC8vIGRpc3BhdGNoIHJlcXVlc3Rcblx0Y29uc3QgZ2V0VG9rZW5Nb2RlbE5hbWUgPSAnZ2V0VG9rZW4nXG5cdGNvbnN0IGxvY2F0aW9uID0gd2luZG93U2VydmljZS5nZXRMb2NhdGlvbigpXG5cdGNvbnN0IGZvcm1Cb2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0Z3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG5cdFx0Y2xpZW50X2lkOiBhcHBDb25maWcuQ0xJRU5UX0lELFxuXHRcdHNjb3BlOiBhcHBDb25maWcuT0FVVEhfUEtDRV9TQ09QRSxcblx0XHRjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXG5cdFx0cmVkaXJlY3RfdXJpOiBsb2NhdGlvbi5vcmlnaW4sXG5cdFx0Y29kZTogY29kZVxuXHR9KVxuXHR5aWVsZCBwdXQ8TW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24+KHtcblx0XHR0eXBlOiBNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFLkZFVENIX1JFUVVFU1QsXG5cdFx0bW9kZWxOYW1lOiBnZXRUb2tlbk1vZGVsTmFtZSxcblx0XHRib2R5OiBmb3JtQm9keS50b1N0cmluZygpLFxuXHRcdG5vU3RvcmU6IHRydWVcblx0fSlcblx0Y29uc3Qge1xuXHRcdGZldGNoUmVzdWx0QWN0aW9uLFxuXHRcdGZldGNoRXJyb3JBY3Rpb25cblx0fTogeyBmZXRjaFJlc3VsdEFjdGlvbj86IE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb247IGZldGNoRXJyb3JBY3Rpb24/OiBNb2RlbEZldGNoRXJyb3JBY3Rpb24gfSA9IHlpZWxkIHJhY2Uoe1xuXHRcdGZldGNoUmVzdWx0QWN0aW9uOiB0YWtlKHRha2VNYXRjaGVzTW9kZWxGZXRjaFJlY2VpdmVkKGdldFRva2VuTW9kZWxOYW1lKSksXG5cdFx0ZmV0Y2hFcnJvckFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hGYWlsZWQoZ2V0VG9rZW5Nb2RlbE5hbWUpKVxuXHR9KVxuXHRpZiAoZmV0Y2hFcnJvckFjdGlvbiB8fCAhZmV0Y2hSZXN1bHRBY3Rpb24/LmRhdGEpIHtcblx0XHRyZXR1cm4gbnVsbFxuXHR9XG5cdHJldHVybiBmZXRjaFJlc3VsdEFjdGlvbi5kYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogZ2V0VG9rZW5Gcm9tUmVmcmVzaFRva2VuKG9hdXRoVG9rZW5QYXJhbTogT0F1dGhUb2tlbik6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGlmICghYXBwQ29uZmlnLkNMSUVOVF9JRCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ0xJRU5UX0lELCBpcyByZXF1aXJlZCBpbiBBcHBDb25maWcnKVxuXHR9XG5cblx0Y29uc3QgZ2V0VG9rZW5Nb2RlbE5hbWUgPSAnZ2V0VG9rZW4nXG5cdGNvbnN0IGZvcm1Cb2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0Z3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuXHRcdGNsaWVudF9pZDogYXBwQ29uZmlnLkNMSUVOVF9JRCxcblx0XHRyZWZyZXNoX3Rva2VuOiBvYXV0aFRva2VuUGFyYW0ucmVmcmVzaF90b2tlblxuXHR9KVxuXHQvLyBjcmVhdGUgdGhlIGZvcm0gYm9keSBiYXNlZCBvbiBpZiB1c2luZyBhIGNsaWVudF9zZWNyZXQ6IHRyYWRpdGlvbmFsIE9BdXRoIHZzLiBQS0NFIGZsb3dcblx0aWYgKGFwcENvbmZpZy5DTElFTlRfU0VDUkVUKSB7XG5cdFx0Zm9ybUJvZHkuYXBwZW5kKCdjbGllbnRfc2VjcmV0JywgYXBwQ29uZmlnLkNMSUVOVF9TRUNSRVQpXG5cdH1cblx0eWllbGQgcHV0PE1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uPih7XG5cdFx0dHlwZTogTU9ERUxfRkVUQ0hfUkVRVUVTVF9BQ1RJT05fVFlQRS5GRVRDSF9SRVFVRVNULFxuXHRcdG1vZGVsTmFtZTogZ2V0VG9rZW5Nb2RlbE5hbWUsXG5cdFx0Ym9keTogZm9ybUJvZHkudG9TdHJpbmcoKSxcblx0XHRub1N0b3JlOiB0cnVlXG5cdH0pXG5cdGNvbnN0IHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbixcblx0XHRmZXRjaEVycm9yQWN0aW9uXG5cdH06IHsgZmV0Y2hSZXN1bHRBY3Rpb24/OiBNb2RlbEZldGNoUmVzdWx0QWN0aW9uOyBmZXRjaEVycm9yQWN0aW9uPzogTW9kZWxGZXRjaEVycm9yQWN0aW9uIH0gPSB5aWVsZCByYWNlKHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZChnZXRUb2tlbk1vZGVsTmFtZSkpLFxuXHRcdGZldGNoRXJyb3JBY3Rpb246IHRha2UodGFrZU1hdGNoZXNNb2RlbEZldGNoRmFpbGVkKGdldFRva2VuTW9kZWxOYW1lKSlcblx0fSlcblx0Ly8gYW55IGVycm9yIHJlc3BvbnNlXG5cdGlmIChmZXRjaEVycm9yQWN0aW9uKSB7XG5cdFx0Ly8gaWdub3JlIHNlcnZlciBlcnJvcnNcblx0XHRpZiAoXG5cdFx0XHRmZXRjaEVycm9yQWN0aW9uLmVycm9yRGF0YT8uc3RhdHVzICYmXG5cdFx0XHRmZXRjaEVycm9yQWN0aW9uLmVycm9yRGF0YS5zdGF0dXMgPj0gSFRUUF9TVEFUVVNfQ09ERS5JTlRFUk5BTF9TRVJWRVJfRVJST1Jcblx0XHQpIHtcblx0XHRcdHJldHVybiBvYXV0aFRva2VuUGFyYW1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXHQvLyBmb3Igc29tZSByZWFzb24gdGhlIHJlc3BvbnNlIGhhZCBubyBib2R5XG5cdGlmICghZmV0Y2hSZXN1bHRBY3Rpb24/LmRhdGEpIHtcblx0XHRyZXR1cm4gbnVsbFxuXHR9XG5cdHJldHVybiBmZXRjaFJlc3VsdEFjdGlvbi5kYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogcGVyZm9ybVRva2VuUmVmcmVzaCgpOiBTYWdhSXRlcmF0b3Ige1xuXHRpZiAocmVmcmVzaExvY2sgfHwgIW9hdXRoVG9rZW4pIHtcblx0XHQvLyBhbHJlYWR5IHJlZnJlc2hpbmcuIHdhaXQgZm9yIHRoZSBjdXJyZW50IHJlZnJlc2ggdG8gc3VjY2VlZCBvciBmYWlsLlxuXHRcdHlpZWxkIHJhY2Uoe1xuXHRcdFx0cmVmcmVzaFN1Y2Nlc3M6IHRha2UoQVVUSF9UT0tFTl9TVUNDRVNTX0FDVElPTl9UWVBFLlRPS0VOX1JFRlJFU0hfU1VDQ0VFREVEKSxcblx0XHRcdHJlZnJlc2hGYWlsZWQ6IHRha2UoQVVUSF9BQ1RJT05fVFlQRS5UT0tFTl9SRUZSRVNIX0ZBSUxFRClcblx0XHR9KVxuXHRcdHJldHVyblxuXHR9XG5cdGxvZ2dlci5kZWJ1ZygnUmVmcmVzaGluZyBPQXV0aCB0b2tlbicpXG5cdHJlZnJlc2hMb2NrID0gdHJ1ZVxuXHQvLyBvYXV0aFRva2VuIHdpbGwgYmUgc2V0IHRvOlxuXHQvLyAxLiBuZXcgdG9rZW4gKHN1Y2Nlc3MpXG5cdC8vIDIuIHNhbWUgdG9rZW4gKGZhaWxlZCBmcm9tIHRpbWVvdXQgb3Igc2VydmVyIGVycm9yKVxuXHQvLyAzLiBudWxsIChmYWlsKVxuXHRjb25zdCBvcmlnaW5hbEFjY2Vzc1Rva2VuID0gb2F1dGhUb2tlbi5hY2Nlc3NfdG9rZW5cblx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwoZ2V0VG9rZW5Gcm9tUmVmcmVzaFRva2VuLCBvYXV0aFRva2VuKVxuXHRpZiAoISFvYXV0aFRva2VuICYmIG9hdXRoVG9rZW4uYWNjZXNzX3Rva2VuICE9PSBvcmlnaW5hbEFjY2Vzc1Rva2VuKSB7XG5cdFx0bG9nZ2VyLmRlYnVnKCdPQXV0aCB0b2tlbiByZWZyZXNoZWQnKVxuXHRcdHlpZWxkIGNhbGwob2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UucGVyc2lzdFRva2VuLCBvYXV0aFRva2VuKVxuXHRcdHlpZWxkIHB1dDxBdXRoVG9rZW5TdWNjZXNzQWN0aW9uPih7IHR5cGU6IEFVVEhfVE9LRU5fU1VDQ0VTU19BQ1RJT05fVFlQRS5UT0tFTl9SRUZSRVNIX1NVQ0NFRURFRCwgb2F1dGhUb2tlbiB9KVxuXHR9IGVsc2UgaWYgKG9hdXRoVG9rZW4gPT09IG51bGwpIHtcblx0XHRsb2dnZXIuZGVidWcoJ09BdXRoIHRva2VuIGZhaWxlZCB0byByZWZyZXNoJylcblx0XHQvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb3V0c2lkZSBvZiB0aGUgdG9rZW4gaGF2aW5nIGJlZW4gcmV2b2tlZCBvbiB0aGUgc2VydmVyIHNpZGVcblx0XHR5aWVsZCBhbGwoe1xuXHRcdFx0cmVmcmVzaEZhaWxlZDogcHV0PEF1dGhBY3Rpb24+KHsgdHlwZTogQVVUSF9BQ1RJT05fVFlQRS5UT0tFTl9SRUZSRVNIX0ZBSUxFRCB9KSxcblx0XHRcdGxvZ091dDogcHV0PEF1dGhBY3Rpb24+KHsgdHlwZTogQVVUSF9BQ1RJT05fVFlQRS5MT0dfT1VUX1JFUVVFU1RFRCB9KVxuXHRcdH0pXG5cdH1cblx0cmVmcmVzaExvY2sgPSBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGxvZ2luRmxvdyhtb2RlbEZldGNoUmVxdWVzdEFjdGlvbjogTW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24pOiBTYWdhSXRlcmF0b3Ige1xuXHR5aWVsZCBwdXQobW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24pXG5cdGNvbnN0IHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbixcblx0XHRmZXRjaEVycm9yQWN0aW9uXG5cdH06IHsgZmV0Y2hSZXN1bHRBY3Rpb24/OiBNb2RlbEZldGNoUmVzdWx0QWN0aW9uOyBmZXRjaEVycm9yQWN0aW9uPzogTW9kZWxGZXRjaEVycm9yQWN0aW9uIH0gPSB5aWVsZCByYWNlKHtcblx0XHRmZXRjaFJlc3VsdEFjdGlvbjogdGFrZSh0YWtlTWF0Y2hlc01vZGVsRmV0Y2hSZWNlaXZlZChtb2RlbEZldGNoUmVxdWVzdEFjdGlvbi5tb2RlbE5hbWUpKSxcblx0XHRmZXRjaEVycm9yQWN0aW9uOiB0YWtlKHRha2VNYXRjaGVzTW9kZWxGZXRjaEZhaWxlZChtb2RlbEZldGNoUmVxdWVzdEFjdGlvbi5tb2RlbE5hbWUpKVxuXHR9KVxuXHRpZiAoZmV0Y2hFcnJvckFjdGlvbikge1xuXHRcdHJldHVybiBudWxsXG5cdH1cblx0Y29uc3QgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmV0Y2hSZXN1bHRBY3Rpb24/LmRhdGE/LmNvZGVcblx0aWYgKCFjb2RlKSB7XG5cdFx0cmV0dXJuIG51bGxcblx0fVxuXHRyZXR1cm4geWllbGQgY2FsbChnZXRUb2tlbkZyb21Db2RlLCBjb2RlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGNyZWRlbnRpYWxzTG9naW5GbG93KFxuXHRhY3Rpb246IEF1dGhDYXNWMUxvZ2luUmVxdWVzdEFjdGlvbiB8IEF1dGhMb2NhbExvZ2luUmVxdWVzdEFjdGlvbixcblx0bW9kZWxOYW1lOiBzdHJpbmdcbik6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IG1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uOiBNb2RlbEZldGNoUmVxdWVzdEFjdGlvbiA9IHtcblx0XHQvLyBzZXQgcmVxdWlyZWQgZGVmYXVsdHNcblx0XHR0eXBlOiBNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFLkZFVENIX1JFUVVFU1QsXG5cdFx0bW9kZWxOYW1lLFxuXHRcdG5vU3RvcmU6IHRydWUsXG5cdFx0Ly8gZm9yY2Ugbm8gcmV0cnlcblx0XHRub1JldHJ5OiB0cnVlLFxuXHRcdC8vIHBhc3MgdGhydSBib2R5XG5cdFx0Ym9keTogYWN0aW9uLmJvZHlcblx0fVxuXHRyZXR1cm4geWllbGQgY2FsbChsb2dpbkZsb3csIG1vZGVsRmV0Y2hSZXF1ZXN0QWN0aW9uKVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGNhc1YxTG9naW5GbG93KGFjdGlvbjogQXV0aENhc1YxTG9naW5SZXF1ZXN0QWN0aW9uKTogU2FnYUl0ZXJhdG9yIHtcblx0cmV0dXJuIHlpZWxkIGNhbGwoY3JlZGVudGlhbHNMb2dpbkZsb3csIGFjdGlvbiwgJ2NvZGVGcm9tQ2FzVjEnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGxvY2FsTG9naW5GbG93KGFjdGlvbjogQXV0aExvY2FsTG9naW5SZXF1ZXN0QWN0aW9uKTogU2FnYUl0ZXJhdG9yIHtcblx0cmV0dXJuIHlpZWxkIGNhbGwoY3JlZGVudGlhbHNMb2dpbkZsb3csIGFjdGlvbiwgJ2NvZGVGcm9tTG9jYWxDcmVkZW50aWFscycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogY2FzVGlja2V0TG9naW5GbG93KHRpY2tldDogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcpOiBTYWdhSXRlcmF0b3Ige1xuXHRjb25zdCBtb2RlbEZldGNoUmVxdWVzdEFjdGlvbjogTW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24gPSB7XG5cdFx0dHlwZTogTU9ERUxfRkVUQ0hfUkVRVUVTVF9BQ1RJT05fVFlQRS5GRVRDSF9SRVFVRVNULFxuXHRcdG1vZGVsTmFtZTogJ2NvZGVGcm9tQ2FzVGlja2V0Jyxcblx0XHRub1N0b3JlOiB0cnVlLFxuXHRcdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0XHR0aWNrZXQsXG5cdFx0XHRzZXJ2aWNlXG5cdFx0fVxuXHR9XG5cdHJldHVybiB5aWVsZCBjYWxsKGxvZ2luRmxvdywgbW9kZWxGZXRjaFJlcXVlc3RBY3Rpb24pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogcGtjZUxvZ2luRmxvdyhfOiBBdXRoUEtDRUxvZ2luUmVxdWVzdEFjdGlvbik6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGlmICghYXBwQ29uZmlnLkNMSUVOVF9JRCB8fCAhYXBwQ29uZmlnLk9BVVRIX1BLQ0VfU0NPUEUgfHwgIWFwcENvbmZpZy5PQVVUSF9QS0NFX0VORFBPSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDTElFTlRfSUQsIE9BVVRIX1BLQ0VfU0NPUEUsIGFuZCBPQVVUSF9QS0NFX0VORFBPSU5UIGFyZSByZXF1aXJlZCBpbiBBcHBDb25maWcnKVxuXHR9XG5cblx0Ly8gR2VuZXJhdGUgc3RhdGUgYW5kIGNvZGUgdmVyaWZpZXIgdmFsdWVzXG5cdGNvbnN0IHN0YXRlID0gdXVpZHY0KClcblx0Y29uc3QgY29kZVZlcmlmaWVyID0gdXVpZHY0KClcblx0Y29uc3Qgc2hhMjU2Q29kZVZlcmlmaWVyID0geWllbGQgY2FsbChzaGEyNTZBc3luYywgY29kZVZlcmlmaWVyKVxuXHRjb25zdCBjb2RlQ2hhbGxlbmdlID0geWllbGQgY2FsbChiYXNlNjRVcmxFbmNvZGUsIHNoYTI1NkNvZGVWZXJpZmllcilcblxuXHQvLyBQZXJzaXN0IHN0YXRlIGFuZCBjb2RlIHZlcmlmaWVyIGluIGxvY2FsIHN0b3JhZ2UgZm9yIHVzZSBhZnRlciBjb2RlIGZsb3cgcmVkaXJlY3QuXG5cdHlpZWxkIGNhbGwob2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UucGVyc2lzdFN0YXRlLCBzdGF0ZSlcblx0eWllbGQgY2FsbChvYXV0aFBlcnNpc3RlbmNlU2VydmljZS5wZXJzaXN0Q29kZVZlcmlmaWVyLCBjb2RlVmVyaWZpZXIpXG5cblx0Ly8gUmVkaXJlY3QgdG8gQlMgY29kZSBmbG93IGF1dGggZW5kcG9pbnQgKHdoaWNoIHdpbGwgcmVkaXJlY3QgYmFjayBoZXJlKVxuXHRjb25zdCBsb2NhdGlvbiA9IHdpbmRvd1NlcnZpY2UuZ2V0TG9jYXRpb24oKVxuXHRjb25zdCBwa2NlQXV0aFJlZGlyZWN0VVJMID0gYCR7YXBwQ29uZmlnLk9BVVRIX1BLQ0VfRU5EUE9JTlR9PyR7bmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0cmVzcG9uc2VfdHlwZTogJ2NvZGUnLFxuXHRcdGNsaWVudF9pZDogYXBwQ29uZmlnLkNMSUVOVF9JRCxcblx0XHRzdGF0ZTogc3RhdGUsXG5cdFx0c2NvcGU6IGFwcENvbmZpZy5PQVVUSF9QS0NFX1NDT1BFLFxuXHRcdGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLFxuXHRcdGNvZGVfY2hhbGxlbmdlX21ldGhvZDogJ1MyNTYnLFxuXHRcdHJlZGlyZWN0X3VyaTogbG9jYXRpb24ub3JpZ2luXG5cdH0pfWBcblx0eWllbGQgY2FsbCh3aW5kb3dTZXJ2aWNlLnJlcGxhY2UsIHBrY2VBdXRoUmVkaXJlY3RVUkwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaGFuZGxlQXV0aEZhaWx1cmUoYWN0aW9uOiBNb2RlbEZldGNoRXJyb3JBY3Rpb24pOiBTYWdhSXRlcmF0b3Ige1xuXHQvLyBUaGlzIHNob3VsZCBiZSB1bmxpa2VseSBzaW5jZSB3ZSBub3JtYWxseSBoYXZlIGEgcmVmcmVzaCB0b2tlbiBsb29wIGhhcHBlbmluZ1xuXHQvLyBidXQgaWYgdGhlIGFwcCBpcyBiYWNrZ3JvdW5kZWQsIHRoZSBsb29wIG1pZ2h0IG5vdCBiZSBjYXVnaHQgdXAgeWV0XG5cdGlmIChvYXV0aFRva2VuICYmIGFjdGlvbi5lcnJvckRhdGEgJiYgYWN0aW9uLmVycm9yRGF0YS5zdGF0dXMgPT09IEhUVFBfU1RBVFVTX0NPREUuVU5BVVRIT1JJWkVEKSB7XG5cdFx0bG9nZ2VyLmRlYnVnKCd0b2tlbiBleHBpcmVkIC0gcmVmcmVzaGluZycpXG5cdFx0eWllbGQgY2FsbChwZXJmb3JtVG9rZW5SZWZyZXNoKVxuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aFRva2VuOiBUb2tlbkFjY2Vzc0Z1bmN0aW9uID0gZnVuY3Rpb24qIChtb2RlbE5hbWU6IHN0cmluZykge1xuXHQvLyBEb24ndCB0cnkgdG8gcmVmcmVzaCB0aGUgdG9rZW4gaWYgd2UncmUgYWxyZWFkeSBpbiBhIHJlcXVlc3QgdG8gcmVmcmVzaCB0aGUgdG9rZW5cblx0aWYgKG1vZGVsTmFtZSA9PT0gJ2dldFRva2VuJykge1xuXHRcdHJldHVybiBudWxsXG5cdH1cblx0aWYgKG9hdXRoVG9rZW4gJiYgb2F1dGhUb2tlblsnLmV4cGlyZXMnXSkge1xuXHRcdGNvbnN0IHRoaXJ0eVNlY29uZHNGcm9tTm93ID0gbmV3IERhdGUoKVxuXHRcdHRoaXJ0eVNlY29uZHNGcm9tTm93LnNldFNlY29uZHModGhpcnR5U2Vjb25kc0Zyb21Ob3cuZ2V0U2Vjb25kcygpICsgMzApXG5cdFx0aWYgKG5ldyBEYXRlKG9hdXRoVG9rZW5bJy5leHBpcmVzJ10pIDwgdGhpcnR5U2Vjb25kc0Zyb21Ob3cpIHtcblx0XHRcdC8vIHN0YXJ0IGEgdG9rZW4gcmVmcmVzaCBhbmQgd2FpdCBmb3IgdGhlIHN1Y2Nlc3MgYWN0aW9uIGluIGNhc2UgYW5vdGhlciByZWZyZXNoIGlzIGN1cnJlbnRseSBoYXBwZW5pbmdcblx0XHRcdHlpZWxkIGNhbGwocGVyZm9ybVRva2VuUmVmcmVzaClcblx0XHRcdHJldHVybiBvYXV0aFRva2VuXG5cdFx0fVxuXHR9XG5cdHJldHVybiBvYXV0aFRva2VuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKiBhdXRoU2FnYShcblx0b2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2VQYXJhbTogT0F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UgPSBkZWZhdWx0T0F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UsXG5cdHRpY2tldFByb3ZpZGVyU2VydmljZTogVGlja2V0UHJvdmlkZXJTZXJ2aWNlID0gZGVmYXVsdFRpY2tldFByb3ZpZGVyU2VydmljZSxcblx0Y29kZVByb3ZpZGVyU2VydmljZTogQ29kZVByb3ZpZGVyU2VydmljZSA9IGRlZmF1bHRDb2RlUHJvdmlkZXJTZXJ2aWNlXG4pOiBTYWdhSXRlcmF0b3Ige1xuXHRsb2dnZXIgPSBnZXRMb2dnZXIoKVxuXHRvYXV0aFBlcnNpc3RlbmNlU2VydmljZSA9IG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlUGFyYW1cblxuXHQvLyBUcnkgdG8gZ2V0IHBlcnNpc3RlZCB0b2tlbiAobm9ybWFsbHkgaW4gQXN5bmNTdG9yYWdlIG9yIExvY2FsU3RvcmFnZSlcblx0b2F1dGhUb2tlbiA9IHlpZWxkIGNhbGwob2F1dGhQZXJzaXN0ZW5jZVNlcnZpY2UuZ2V0UGVyc2lzdGVkVG9rZW4pXG5cblx0Ly8gSWYgbm8gdG9rZW4sIHRyeSB0byBnZXQgQ0FTIHRpY2tldCAobm9ybWFsbHkgaW4gdGhlIFVSTCksIHVzZSBpdCB0byBnZXQgYSB0b2tlblxuXHRpZiAoIW9hdXRoVG9rZW4pIHtcblx0XHRjb25zdCBjYXNUaWNrZXQgPSB0aWNrZXRQcm92aWRlclNlcnZpY2UuZ2V0VGlja2V0KClcblx0XHR0aWNrZXRQcm92aWRlclNlcnZpY2UucmVtb3ZlVGlja2V0KClcblx0XHRjb25zdCBzZXJ2aWNlID0gdGlja2V0UHJvdmlkZXJTZXJ2aWNlLmdldEFwcFNlcnZpY2VOYW1lKClcblx0XHRpZiAoY2FzVGlja2V0ICYmIHNlcnZpY2UpIHtcblx0XHRcdG9hdXRoVG9rZW4gPSB5aWVsZCBjYWxsKGNhc1RpY2tldExvZ2luRmxvdywgY2FzVGlja2V0LCBzZXJ2aWNlKVxuXHRcdH1cblx0fVxuXG5cdC8vIElmIE9BdXRoIENvZGUgZXhpc3RzIChub3JtYWxseSBpbiB0aGUgVVJMKSwgdXNlIGl0IHRvIGdldCBhIHRva2VuXG5cdGNvbnN0IGNvZGUgPSBjb2RlUHJvdmlkZXJTZXJ2aWNlLmdldENvZGUoKVxuXHRpZiAoY29kZSkge1xuXHRcdC8vIExvZyBvdXQgdGhlIGN1cnJlbnQgdXNlciBpZiBhIG5ldyB0b2tlbiBpcyBhYm91dCB0byBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgT0F1dGggQ29kZVxuXHRcdGlmIChvYXV0aFRva2VuKSB7XG5cdFx0XHR5aWVsZCBhbGwoe1xuXHRcdFx0XHRjbGVhclVzZXJEYXRhOiBwdXQ8TW9kZWxSZW1vdmVLZXlBY3Rpb24+KHsgdHlwZTogTU9ERUxfUkVNT1ZFX0tFWV9BQ1RJT05fVFlQRSwgbW9kZWxQYXRoOiAndXNlcicgfSksXG5cdFx0XHRcdGNsZWFyUGVyc2lzdGVudFRva2VuOiBjYWxsKG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RUb2tlbiwgbnVsbClcblx0XHRcdH0pXG5cdFx0XHRvYXV0aFRva2VuID0gbnVsbFxuXHRcdH1cblxuXHRcdC8vIElmIE9BdXRoIHN0YXRlIGV4aXN0cyAobm9ybWFsbHkgaW4gdGhlIFVSTCksIHVzZSBpdCBpbiBhZGRpdGlvbiB0byB0aGUgY29kZSBmb3IgUEtDRSBsb2dpbiBmbG93XG5cdFx0Y29uc3Qgc3RhdGUgPSBjb2RlUHJvdmlkZXJTZXJ2aWNlLmdldFN0YXRlKClcblx0XHRpZiAoc3RhdGUpIHtcblx0XHRcdG9hdXRoVG9rZW4gPSB5aWVsZCBjYWxsKGdldFRva2VuRnJvbUNvZGVBbmRTdGF0ZSwgY29kZSwgc3RhdGUpXG5cdFx0fSBlbHNlIHtcblx0XHRcdG9hdXRoVG9rZW4gPSB5aWVsZCBjYWxsKGdldFRva2VuRnJvbUNvZGUsIGNvZGUpXG5cdFx0fVxuXHR9XG5cdGNvZGVQcm92aWRlclNlcnZpY2UucmVtb3ZlQ29kZUFuZFN0YXRlKClcblxuXHR5aWVsZCBwdXQ8QXV0aFRva2VuQWN0aW9uPih7IHR5cGU6IEFVVEhfVE9LRU5fQUNUSU9OX1RZUEUuQVVUSF9JTklUSUFMSVpFRCwgb2F1dGhUb2tlbiB9KVxuXG5cdHlpZWxkIHRha2VFdmVyeShNT0RFTF9GRVRDSF9FUlJPUl9BQ1RJT05fVFlQRS5UUllfRkVUQ0hfRkFJTEVELCBoYW5kbGVBdXRoRmFpbHVyZSlcblxuXHRkbyB7XG5cdFx0aWYgKCFvYXV0aFRva2VuKSB7XG5cdFx0XHRjb25zdCB7XG5cdFx0XHRcdGNhc1YxQWN0aW9uLFxuXHRcdFx0XHRsb2NhbExvZ2luQWN0aW9uLFxuXHRcdFx0XHRwa2NlTG9naW5BY3Rpb25cblx0XHRcdH06IHtcblx0XHRcdFx0Y2FzVjFBY3Rpb24/OiBBdXRoQ2FzVjFMb2dpblJlcXVlc3RBY3Rpb25cblx0XHRcdFx0bG9jYWxMb2dpbkFjdGlvbj86IEF1dGhMb2NhbExvZ2luUmVxdWVzdEFjdGlvblxuXHRcdFx0XHRwa2NlTG9naW5BY3Rpb24/OiBBdXRoUEtDRUxvZ2luUmVxdWVzdEFjdGlvblxuXHRcdFx0fSA9IHlpZWxkIHJhY2Uoe1xuXHRcdFx0XHRjYXNWMUFjdGlvbjogdGFrZShBVVRIX0NBU19WMV9MT0dJTl9SRVFVRVNUX0FDVElPTl9UWVBFLkNBU19WMV9MT0dJTl9SRVFVRVNUKSxcblx0XHRcdFx0bG9jYWxMb2dpbkFjdGlvbjogdGFrZShBVVRIX0xPQ0FMX0xPR0lOX1JFUVVFU1RfQUNUSU9OX1RZUEUuTE9DQUxfTE9HSU5fUkVRVUVTVCksXG5cdFx0XHRcdHBrY2VMb2dpbkFjdGlvbjogdGFrZShBVVRIX1BLQ0VfTE9HSU5fUkVRVUVTVF9BQ1RJT05fVFlQRS5QS0NFX0xPR0lOX1JFUVVFU1QpXG5cdFx0XHR9KVxuXG5cdFx0XHR5aWVsZCBwdXQ8QXV0aEFjdGlvbj4oeyB0eXBlOiBBVVRIX0FDVElPTl9UWVBFLkxPR0lOX1JFUVVFU1RFRCB9KVxuXHRcdFx0aWYgKGNhc1YxQWN0aW9uKSB7XG5cdFx0XHRcdG9hdXRoVG9rZW4gPSB5aWVsZCBjYWxsKGNhc1YxTG9naW5GbG93LCBjYXNWMUFjdGlvbilcblx0XHRcdH0gZWxzZSBpZiAobG9jYWxMb2dpbkFjdGlvbikge1xuXHRcdFx0XHRvYXV0aFRva2VuID0geWllbGQgY2FsbChsb2NhbExvZ2luRmxvdywgbG9jYWxMb2dpbkFjdGlvbilcblx0XHRcdH0gZWxzZSBpZiAocGtjZUxvZ2luQWN0aW9uKSB7XG5cdFx0XHRcdC8vIG9hdXRoVG9rZW4gaXMgbm90IHJldHVybmVkIGhlcmUsIGFzIHRoaXMgZmxvdyB3aWxsIHJlc3VsdCBpbiBhIHdpbmRvdyByZWRpcmVjdFxuXHRcdFx0XHR5aWVsZCBjYWxsKHBrY2VMb2dpbkZsb3csIHBrY2VMb2dpbkFjdGlvbilcblx0XHRcdFx0Ly8gYnJlYWsgZXhlY3V0aW9uXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChvYXV0aFRva2VuKSB7XG5cdFx0XHR5aWVsZCBjYWxsKG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RUb2tlbiwgb2F1dGhUb2tlbilcblx0XHRcdHlpZWxkIGFsbCh7XG5cdFx0XHRcdGxvZ2luU3VjY2VzczogcHV0PEF1dGhUb2tlblN1Y2Nlc3NBY3Rpb24+KHtcblx0XHRcdFx0XHR0eXBlOiBBVVRIX1RPS0VOX1NVQ0NFU1NfQUNUSU9OX1RZUEUuR0VUX1RPS0VOX1NVQ0NFRURFRCxcblx0XHRcdFx0XHRvYXV0aFRva2VuXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRsb2dPdXQ6IHRha2UoQVVUSF9BQ1RJT05fVFlQRS5MT0dfT1VUX1JFUVVFU1RFRClcblx0XHRcdH0pXG5cdFx0fSBlbHNlIHtcblx0XHRcdHlpZWxkIHB1dDxBdXRoQWN0aW9uPih7IHR5cGU6IEFVVEhfQUNUSU9OX1RZUEUuTE9HSU5fRkFJTEVEIH0pXG5cdFx0fVxuXG5cdFx0eWllbGQgYWxsKHtcblx0XHRcdGNsZWFyVXNlckRhdGE6IHB1dDxNb2RlbFJlbW92ZUtleUFjdGlvbj4oeyB0eXBlOiBNT0RFTF9SRU1PVkVfS0VZX0FDVElPTl9UWVBFLCBtb2RlbFBhdGg6ICd1c2VyJyB9KSxcblx0XHRcdGNsZWFyUGVyc2lzdGVudFRva2VuOiBjYWxsKG9hdXRoUGVyc2lzdGVuY2VTZXJ2aWNlLnBlcnNpc3RUb2tlbiwgbnVsbClcblx0XHR9KVxuXHRcdG9hdXRoVG9rZW4gPSBudWxsXG5cdH0gd2hpbGUgKHRydWUpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsb0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxzQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sY0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sTUFBQSxHQUFBUCxPQUFBO0FBU0EsSUFBQVEsT0FBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsSUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsUUFBQSxHQUFBVixPQUFBO0FBd0JBOztBQUVPLE1BQU1XLHlCQUF5QixHQUFHQSxDQUFDQyxNQUFpQixFQUFFQyxTQUFpQixLQUM3RSxJQUFBQywwQ0FBaUMsRUFBQ0YsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ0cs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
@@ -6,5 +6,6 @@ export interface WindowService {
6
6
  getHistory: () => History;
7
7
  setIsOnline: (isOnline?: boolean) => void;
8
8
  getIsOnline: () => boolean;
9
+ replace: (url: string | URL) => void;
9
10
  }
10
11
  export declare const windowService: WindowService;
@@ -19,6 +19,10 @@ const windowService = exports.windowService = {
19
19
  setIsOnline: value => {
20
20
  isOnline = value;
21
21
  },
22
- getIsOnline: () => typeof isOnline !== 'undefined' ? isOnline : window.navigator.onLine
22
+ getIsOnline: () => typeof isOnline !== 'undefined' ? isOnline : window.navigator.onLine,
23
+ replace: url => {
24
+ if (location) return;
25
+ window.location.replace(url);
26
+ }
23
27
  };
24
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2NhdGlvbiIsImhpc3RvcnkiLCJpc09ubGluZSIsIndpbmRvd1NlcnZpY2UiLCJleHBvcnRzIiwic2V0TG9jYXRpb24iLCJ2YWx1ZSIsImdldExvY2F0aW9uIiwid2luZG93Iiwic2V0SGlzdG9yeSIsImdldEhpc3RvcnkiLCJzZXRJc09ubGluZSIsImdldElzT25saW5lIiwibmF2aWdhdG9yIiwib25MaW5lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3dpbmRvd1NlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2ltcGxlTG9jYXRpb24gfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGludGVyZmFjZSBXaW5kb3dTZXJ2aWNlIHtcblx0c2V0TG9jYXRpb246ICh2YWx1ZT86IFNpbXBsZUxvY2F0aW9uKSA9PiB2b2lkXG5cdGdldExvY2F0aW9uOiAoKSA9PiBTaW1wbGVMb2NhdGlvbiB8IExvY2F0aW9uXG5cdHNldEhpc3Rvcnk6ICh2YWx1ZT86IEhpc3RvcnkpID0+IHZvaWRcblx0Z2V0SGlzdG9yeTogKCkgPT4gSGlzdG9yeVxuXHRzZXRJc09ubGluZTogKGlzT25saW5lPzogYm9vbGVhbikgPT4gdm9pZFxuXHRnZXRJc09ubGluZTogKCkgPT4gYm9vbGVhblxufVxuXG5sZXQgbG9jYXRpb246IFNpbXBsZUxvY2F0aW9uIHwgdW5kZWZpbmVkXG5sZXQgaGlzdG9yeTogSGlzdG9yeSB8IHVuZGVmaW5lZFxubGV0IGlzT25saW5lOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjb25zdCB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlID0ge1xuXHRzZXRMb2NhdGlvbjogKHZhbHVlPzogU2ltcGxlTG9jYXRpb24pID0+IHtcblx0XHRsb2NhdGlvbiA9IHZhbHVlXG5cdH0sXG5cdGdldExvY2F0aW9uOiAoKSA9PiBsb2NhdGlvbiB8fCB3aW5kb3cubG9jYXRpb24sXG5cdHNldEhpc3Rvcnk6ICh2YWx1ZT86IEhpc3RvcnkpID0+IHtcblx0XHRoaXN0b3J5ID0gdmFsdWVcblx0fSxcblx0Z2V0SGlzdG9yeTogKCkgPT4gaGlzdG9yeSB8fCB3aW5kb3cuaGlzdG9yeSxcblx0c2V0SXNPbmxpbmU6ICh2YWx1ZT86IGJvb2xlYW4pID0+IHtcblx0XHRpc09ubGluZSA9IHZhbHVlXG5cdH0sXG5cdGdldElzT25saW5lOiAoKSA9PiAodHlwZW9mIGlzT25saW5lICE9PSAndW5kZWZpbmVkJyA/IGlzT25saW5lIDogd2luZG93Lm5hdmlnYXRvci5vbkxpbmUpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVdBLElBQUlBLFFBQW9DO0FBQ3hDLElBQUlDLE9BQTRCO0FBQ2hDLElBQUlDLFFBQTZCO0FBRTFCLE1BQU1DLGFBQTRCLEdBQUFDLE9BQUEsQ0FBQUQsYUFBQSxHQUFHO0VBQzNDRSxXQUFXLEVBQUdDLEtBQXNCLElBQUs7SUFDeENOLFFBQVEsR0FBR00sS0FBSztFQUNqQixDQUFDO0VBQ0RDLFdBQVcsRUFBRUEsQ0FBQSxLQUFNUCxRQUFRLElBQUlRLE1BQU0sQ0FBQ1IsUUFBUTtFQUM5Q1MsVUFBVSxFQUFHSCxLQUFlLElBQUs7SUFDaENMLE9BQU8sR0FBR0ssS0FBSztFQUNoQixDQUFDO0VBQ0RJLFVBQVUsRUFBRUEsQ0FBQSxLQUFNVCxPQUFPLElBQUlPLE1BQU0sQ0FBQ1AsT0FBTztFQUMzQ1UsV0FBVyxFQUFHTCxLQUFlLElBQUs7SUFDakNKLFFBQVEsR0FBR0ksS0FBSztFQUNqQixDQUFDO0VBQ0RNLFdBQVcsRUFBRUEsQ0FBQSxLQUFPLE9BQU9WLFFBQVEsS0FBSyxXQUFXLEdBQUdBLFFBQVEsR0FBR00sTUFBTSxDQUFDSyxTQUFTLENBQUNDO0FBQ25GLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
28
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2NhdGlvbiIsImhpc3RvcnkiLCJpc09ubGluZSIsIndpbmRvd1NlcnZpY2UiLCJleHBvcnRzIiwic2V0TG9jYXRpb24iLCJ2YWx1ZSIsImdldExvY2F0aW9uIiwid2luZG93Iiwic2V0SGlzdG9yeSIsImdldEhpc3RvcnkiLCJzZXRJc09ubGluZSIsImdldElzT25saW5lIiwibmF2aWdhdG9yIiwib25MaW5lIiwicmVwbGFjZSIsInVybCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy93aW5kb3dTZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpbXBsZUxvY2F0aW9uIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luZG93U2VydmljZSB7XG5cdHNldExvY2F0aW9uOiAodmFsdWU/OiBTaW1wbGVMb2NhdGlvbikgPT4gdm9pZFxuXHRnZXRMb2NhdGlvbjogKCkgPT4gU2ltcGxlTG9jYXRpb24gfCBMb2NhdGlvblxuXHRzZXRIaXN0b3J5OiAodmFsdWU/OiBIaXN0b3J5KSA9PiB2b2lkXG5cdGdldEhpc3Rvcnk6ICgpID0+IEhpc3Rvcnlcblx0c2V0SXNPbmxpbmU6IChpc09ubGluZT86IGJvb2xlYW4pID0+IHZvaWRcblx0Z2V0SXNPbmxpbmU6ICgpID0+IGJvb2xlYW4sXG5cdHJlcGxhY2U6ICh1cmw6IHN0cmluZyB8IFVSTCkgPT4gdm9pZFxufVxuXG5sZXQgbG9jYXRpb246IFNpbXBsZUxvY2F0aW9uIHwgdW5kZWZpbmVkXG5sZXQgaGlzdG9yeTogSGlzdG9yeSB8IHVuZGVmaW5lZFxubGV0IGlzT25saW5lOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjb25zdCB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlID0ge1xuXHRzZXRMb2NhdGlvbjogKHZhbHVlPzogU2ltcGxlTG9jYXRpb24pID0+IHtcblx0XHRsb2NhdGlvbiA9IHZhbHVlXG5cdH0sXG5cdGdldExvY2F0aW9uOiAoKSA9PiBsb2NhdGlvbiB8fCB3aW5kb3cubG9jYXRpb24sXG5cdHNldEhpc3Rvcnk6ICh2YWx1ZT86IEhpc3RvcnkpID0+IHtcblx0XHRoaXN0b3J5ID0gdmFsdWVcblx0fSxcblx0Z2V0SGlzdG9yeTogKCkgPT4gaGlzdG9yeSB8fCB3aW5kb3cuaGlzdG9yeSxcblx0c2V0SXNPbmxpbmU6ICh2YWx1ZT86IGJvb2xlYW4pID0+IHtcblx0XHRpc09ubGluZSA9IHZhbHVlXG5cdH0sXG5cdGdldElzT25saW5lOiAoKSA9PiAodHlwZW9mIGlzT25saW5lICE9PSAndW5kZWZpbmVkJyA/IGlzT25saW5lIDogd2luZG93Lm5hdmlnYXRvci5vbkxpbmUpLFxuXHRyZXBsYWNlOiAodXJsOiBzdHJpbmcgfCBVUkwpID0+IHtcblx0XHRpZiAobG9jYXRpb24pIHJldHVyblxuXHRcdHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVybClcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFZQSxJQUFJQSxRQUFvQztBQUN4QyxJQUFJQyxPQUE0QjtBQUNoQyxJQUFJQyxRQUE2QjtBQUUxQixNQUFNQyxhQUE0QixHQUFBQyxPQUFBLENBQUFELGFBQUEsR0FBRztFQUMzQ0UsV0FBVyxFQUFHQyxLQUFzQixJQUFLO0lBQ3hDTixRQUFRLEdBQUdNLEtBQUs7RUFDakIsQ0FBQztFQUNEQyxXQUFXLEVBQUVBLENBQUEsS0FBTVAsUUFBUSxJQUFJUSxNQUFNLENBQUNSLFFBQVE7RUFDOUNTLFVBQVUsRUFBR0gsS0FBZSxJQUFLO0lBQ2hDTCxPQUFPLEdBQUdLLEtBQUs7RUFDaEIsQ0FBQztFQUNESSxVQUFVLEVBQUVBLENBQUEsS0FBTVQsT0FBTyxJQUFJTyxNQUFNLENBQUNQLE9BQU87RUFDM0NVLFdBQVcsRUFBR0wsS0FBZSxJQUFLO0lBQ2pDSixRQUFRLEdBQUdJLEtBQUs7RUFDakIsQ0FBQztFQUNETSxXQUFXLEVBQUVBLENBQUEsS0FBTyxPQUFPVixRQUFRLEtBQUssV0FBVyxHQUFHQSxRQUFRLEdBQUdNLE1BQU0sQ0FBQ0ssU0FBUyxDQUFDQyxNQUFPO0VBQ3pGQyxPQUFPLEVBQUdDLEdBQWlCLElBQUs7SUFDL0IsSUFBSWhCLFFBQVEsRUFBRTtJQUNkUSxNQUFNLENBQUNSLFFBQVEsQ0FBQ2UsT0FBTyxDQUFDQyxHQUFHLENBQUM7RUFDN0I7QUFDRCxDQUFDIiwiaWdub3JlTGlzdCI6W119
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studiokit-scaffolding-js",
3
- "version": "7.2.0-next.2.5",
3
+ "version": "7.2.0-next.2.7",
4
4
  "description": "Common scaffolding for Studio apps at Purdue",
5
5
  "repository": "https://gitlab.com/purdue-informatics/studiokit/studiokit-scaffolding-js",
6
6
  "license": "MIT",