@wavemaker/app-ng-runtime 11.6.0-next.140456 → 11.6.0-next.140458

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 (71) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +1 -1
  2. app-ng-runtime/build-task/esm2022/data/form/form-field/form-field.build.mjs +3 -3
  3. app-ng-runtime/build-task/fesm2022/index.mjs +1 -1
  4. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  5. app-ng-runtime/components/chart/bundles/index.umd.js +1 -1
  6. app-ng-runtime/components/chart/esm2022/chart.utils.mjs +2 -2
  7. app-ng-runtime/components/chart/fesm2022/index.mjs +1 -1
  8. app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
  9. app-ng-runtime/components/data/form/bundles/index.umd.js +41 -24
  10. app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +31 -22
  11. app-ng-runtime/components/data/form/esm2022/form.component.mjs +22 -10
  12. app-ng-runtime/components/data/form/fesm2022/index.mjs +45 -24
  13. app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
  14. app-ng-runtime/components/data/form/form-field/form-field.directive.d.ts +3 -1
  15. app-ng-runtime/components/data/form/form.component.d.ts +2 -2
  16. app-ng-runtime/components/data/table/bundles/index.umd.js +6 -2
  17. app-ng-runtime/components/data/table/esm2022/table.component.mjs +10 -7
  18. app-ng-runtime/components/data/table/fesm2022/index.mjs +6 -2
  19. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  20. app-ng-runtime/components/data/table/table.component.d.ts +4 -4
  21. app-ng-runtime/components/input/calendar/bundles/index.umd.js +6 -0
  22. app-ng-runtime/components/input/calendar/calendar.component.d.ts +1 -1
  23. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +8 -2
  24. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +6 -0
  25. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  26. app-ng-runtime/components/input/default/bundles/index.umd.js +52 -30
  27. app-ng-runtime/components/input/default/caption-position.directive.d.ts +1 -1
  28. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +2 -2
  29. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +60 -37
  30. app-ng-runtime/components/input/default/fesm2022/index.mjs +53 -31
  31. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  32. app-ng-runtime/components/input/default/select/select.component.d.ts +4 -1
  33. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +11 -11
  34. app-ng-runtime/components/input/epoch/bundles/index.umd.js +112 -87
  35. app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +100 -78
  36. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +5 -5
  37. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +6 -5
  38. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +7 -5
  39. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +112 -87
  40. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  41. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +15 -5
  42. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +14 -6
  43. app-ng-runtime/components/navigation/menu/esm2022/menu.props.mjs +2 -1
  44. app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +3 -3
  45. app-ng-runtime/components/navigation/menu/esm2022/nav/nav.props.mjs +2 -1
  46. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +15 -5
  47. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  48. app-ng-runtime/components/navigation/menu/menu.component.d.ts +3 -0
  49. app-ng-runtime/components/navigation/menu/nav/nav.component.d.ts +1 -0
  50. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +8 -8
  51. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +11 -11
  52. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs +8 -8
  53. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  54. app-ng-runtime/core/bundles/index.umd.js +13 -1
  55. app-ng-runtime/core/esm2022/utils/expression-parser.mjs +13 -2
  56. app-ng-runtime/core/esm2022/utils/utils.mjs +4 -3
  57. app-ng-runtime/core/fesm2022/index.mjs +14 -2
  58. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  59. app-ng-runtime/package.json +1 -1
  60. app-ng-runtime/runtime/base/bundles/index.umd.js +4 -0
  61. app-ng-runtime/runtime/base/components/base-page.component.d.ts +2 -3
  62. app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +7 -4
  63. app-ng-runtime/runtime/base/fesm2022/index.mjs +5 -1
  64. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  65. app-ng-runtime/scripts/@wavemaker/nvd3/build/nv.d3.min.js +1 -1
  66. app-ng-runtime/scripts/datatable/datatable.js +5 -2
  67. app-ng-runtime/variables/bundles/index.umd.js +13 -7
  68. app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +15 -9
  69. app-ng-runtime/variables/fesm2022/index.mjs +13 -7
  70. app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
  71. app-ng-runtime/variables/util/variable/variables.utils.d.ts +1 -1
@@ -1669,7 +1669,7 @@ $.widget('wm.datatable', {
1669
1669
  var rowId = $row.attr('data-row-id');
1670
1670
  var rowData = this.preparedData[rowId];
1671
1671
  var data = this.options.data[rowId];
1672
- this.options.assignSelectedItems(data, e, rowData?._selected);
1672
+ this.options.assignSelectedItems(data, e, {'rowId': rowId, '_selected': rowData?._selected});
1673
1673
  }
1674
1674
  },
1675
1675
 
@@ -2986,7 +2986,10 @@ $.widget('wm.datatable', {
2986
2986
  rowId = $row.attr('data-row-id'),
2987
2987
  rowData = self.options.data[rowId];
2988
2988
  // If we enable multiselect and check header checkbox then updating selecteditem in datatable.
2989
- self.options.assignSelectedItems(rowData, e, self.preparedData[rowId]?._selected);
2989
+ self.options.assignSelectedItems(rowData, e, {
2990
+ 'rowId': rowId,
2991
+ '_selected': self.preparedData[rowId]?._selected
2992
+ });
2990
2993
  self.toggleRowSelection($row, checked, e, true);
2991
2994
  if (checked && _.isFunction(self.options.onRowSelect)) {
2992
2995
  self.options.onRowSelect(rowData, e);
@@ -597,12 +597,12 @@
597
597
  * @param variable: the variable that is called from user action
598
598
  * @param requestParams object consisting the info to construct the XHR request for the service
599
599
  */
600
- const downloadThroughIframe = (requestParams, success) => {
600
+ const downloadThroughIframe = (requestParams, success, dataBinding) => {
601
601
  // Todo: SHubham: URL contains '//' in between which should be handled at the URL formation only
602
602
  if (requestParams.url[1] === '/' && requestParams.url[2] === '/') {
603
603
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
604
604
  }
605
- let iFrameElement, formEl, paramElement, queryParams = '';
605
+ let iFrameElement, formEl, paramElement, queryParams = '', data;
606
606
  const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
607
607
  /* Todo: shubham : define getService method
608
608
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
@@ -617,7 +617,7 @@
617
617
  'target': iFrameElement.attr('name'),
618
618
  'action': url,
619
619
  'method': requestParams.method,
620
- 'enctype': encType
620
+ 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
621
621
  });
622
622
  /* process query params, append a hidden input element in the form against each param */
623
623
  queryParams += url.indexOf('?') !== -1 ? url.substring(url.indexOf('?') + 1) : '';
@@ -626,8 +626,14 @@
626
626
  if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
627
627
  setParamsFromURL(queryParams, params); // Set params for URL query params
628
628
  }
629
- setParamsFromURL(requestParams.data, params); // Set params for request data
630
- _.forEach(params, function (val, key) {
629
+ if (!_.isEmpty(requestParams.data)) {
630
+ setParamsFromURL(requestParams.data, params); // Set params for request data
631
+ data = params;
632
+ }
633
+ else {
634
+ data = dataBinding;
635
+ }
636
+ _.forEach(data, function (val, key) {
631
637
  paramElement = $('<input type="hidden">');
632
638
  paramElement.attr({
633
639
  'name': key,
@@ -900,7 +906,7 @@
900
906
  * @param success success callback
901
907
  * @param error error callback
902
908
  */
903
- const simulateFileDownload = (requestParams, fileName, exportFormat, success, error) => {
909
+ const simulateFileDownload = (requestParams, fileName, exportFormat, success, error, dataBinding) => {
904
910
  /*success and error callbacks are executed incase of downloadThroughAnchor
905
911
  Due to technical limitation cannot be executed incase of iframe*/
906
912
  if (CONSTANTS.hasCordova) {
@@ -914,7 +920,7 @@
914
920
  downloadThroughAnchor(requestParams, success, error);
915
921
  }
916
922
  else {
917
- downloadThroughIframe(requestParams, success);
923
+ downloadThroughIframe(requestParams, success, dataBinding);
918
924
  }
919
925
  };
920
926
  /**
@@ -1,4 +1,4 @@
1
- import { extractType, DataType, DEFAULT_FORMATS, $parseEvent, $watch, findValueOf, getBlob, getClonedObject, stringStartsWith, triggerFn } from '@wm/core';
1
+ import { $parseEvent, $watch, DataType, DEFAULT_FORMATS, extractType, findValueOf, getBlob, getClonedObject, stringStartsWith, triggerFn } from '@wm/core';
2
2
  import { CONSTANTS, VARIABLE_CONSTANTS, WS_CONSTANTS } from '../../constants/variables.constants';
3
3
  const exportTypesMap = { 'EXCEL': '.xlsx', 'CSV': '.csv' };
4
4
  export let appManager;
@@ -263,12 +263,12 @@ const setParamsFromURL = (queryParams, params) => {
263
263
  * @param variable: the variable that is called from user action
264
264
  * @param requestParams object consisting the info to construct the XHR request for the service
265
265
  */
266
- const downloadThroughIframe = (requestParams, success) => {
266
+ const downloadThroughIframe = (requestParams, success, dataBinding) => {
267
267
  // Todo: SHubham: URL contains '//' in between which should be handled at the URL formation only
268
268
  if (requestParams.url[1] === '/' && requestParams.url[2] === '/') {
269
269
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
270
270
  }
271
- let iFrameElement, formEl, paramElement, queryParams = '';
271
+ let iFrameElement, formEl, paramElement, queryParams = '', data;
272
272
  const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
273
273
  /* Todo: shubham : define getService method
274
274
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
@@ -283,7 +283,7 @@ const downloadThroughIframe = (requestParams, success) => {
283
283
  'target': iFrameElement.attr('name'),
284
284
  'action': url,
285
285
  'method': requestParams.method,
286
- 'enctype': encType
286
+ 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
287
287
  });
288
288
  /* process query params, append a hidden input element in the form against each param */
289
289
  queryParams += url.indexOf('?') !== -1 ? url.substring(url.indexOf('?') + 1) : '';
@@ -292,8 +292,14 @@ const downloadThroughIframe = (requestParams, success) => {
292
292
  if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
293
293
  setParamsFromURL(queryParams, params); // Set params for URL query params
294
294
  }
295
- setParamsFromURL(requestParams.data, params); // Set params for request data
296
- _.forEach(params, function (val, key) {
295
+ if (!_.isEmpty(requestParams.data)) {
296
+ setParamsFromURL(requestParams.data, params); // Set params for request data
297
+ data = params;
298
+ }
299
+ else {
300
+ data = dataBinding;
301
+ }
302
+ _.forEach(data, function (val, key) {
297
303
  paramElement = $('<input type="hidden">');
298
304
  paramElement.attr({
299
305
  'name': key,
@@ -589,7 +595,7 @@ export const processBinding = (variable, context, bindSource, bindTarget) => {
589
595
  * @param success success callback
590
596
  * @param error error callback
591
597
  */
592
- export const simulateFileDownload = (requestParams, fileName, exportFormat, success, error) => {
598
+ export const simulateFileDownload = (requestParams, fileName, exportFormat, success, error, dataBinding) => {
593
599
  /*success and error callbacks are executed incase of downloadThroughAnchor
594
600
  Due to technical limitation cannot be executed incase of iframe*/
595
601
  if (CONSTANTS.hasCordova) {
@@ -603,7 +609,7 @@ export const simulateFileDownload = (requestParams, fileName, exportFormat, succ
603
609
  downloadThroughAnchor(requestParams, success, error);
604
610
  }
605
611
  else {
606
- downloadThroughIframe(requestParams, success);
612
+ downloadThroughIframe(requestParams, success, dataBinding);
607
613
  }
608
614
  };
609
615
  /**
@@ -787,4 +793,4 @@ export const decodeData = (responseContent) => {
787
793
  function htmlDecode(input) {
788
794
  return he.unescape(input);
789
795
  }
790
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFM0osT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUlsRyxNQUFNLGNBQWMsR0FBSyxFQUFFLE9BQU8sRUFBRyxPQUFPLEVBQUUsS0FBSyxFQUFHLE1BQU0sRUFBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUN0QixNQUFNLENBQUMsSUFBSSxXQUFXLENBQUM7QUFDdkIsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDO0FBQzdCLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUN6QixNQUFNLENBQUMsSUFBSSxjQUFjLENBQUM7QUFDMUIsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBSSxhQUFhLENBQUM7QUFFekIsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLEVBQ3pDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLEVBQ2hDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXZCLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzdCLElBQUksV0FBVyxFQUNYLFFBQVEsR0FBRyxDQUFDLENB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QWUsQ0FBQztLQUMxQjtBQUNMLENBQUMsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDckIsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0VHlwZSwgRGF0YVR5cGUsIERFRkFVTFRfRk9STUFUUywgJHBhcnNlRXZlbnQsICR3YXRjaCwgZmluZFZhbHVlT2YsIGdldEJsb2IsIGdldENsb25lZE9iamVjdCwgc3RyaW5nU3RhcnRzV2l0aCwgdHJpZ2dlckZuIH0gZnJvbSAnQHdtL2NvcmUnO1xuXG5pbXBvcnQgeyBDT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdywgXywgJCwgbW9tZW50LCBoZTtcblxuY29uc3QgZXhwb3J0VHlwZXNNYXAgICA9IHsgJ0VYQ0VMJyA6ICcueGxzeCcsICdDU1YnIDogJy5jc3YnfTtcblxuZXhwb3J0IGxldCBhcHBNYW5hZ2VyO1xuZXhwb3J0IGxldCBodHRwU2VydmljZTtcbmV4cG9ydCBsZXQgbWV0YWRhdGFTZXJ2aWNlO1xuZXhwb3J0IGxldCBuYXZpZ2F0aW9uU2VydmljZTtcbmV4cG9ydCBsZXQgcm91dGVyU2VydmljZTtcbmV4cG9ydCBsZXQgdG9hc3RlclNlcnZpY2U7XG5leHBvcnQgbGV0IG9hdXRoU2VydmljZTtcbmV4cG9ydCBsZXQgc2VjdXJpdHlTZXJ2aWNlO1xuZXhwb3J0IGxldCBkaWFsb2dTZXJ2aWNlO1xuXG5jb25zdCBET1RfRVhQUl9SRVggPSAvXlxcWyhcInwnKVtcXHdcXFddKihcXDEpXFxdJC8sXG4gICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAgPSBuZXcgTWFwKCksXG4gICAgdGltZXJzID0gbmV3IE1hcCgpO1xuXG5jb25zdCBfaW52b2tlID0gKHZhcmlhYmxlLCBvcCkgPT4ge1xuICAgIGxldCBkZWJvdW5jZWRGbixcbiAgICAgICAgY2FuY2VsRm4gPSBfLm5vb3AsXG4gICAgICAgIHJldFZhbDtcbiAgICBpZiAodGltZXJzLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgY2FuY2VsRm4gPSB0aW1lcnMuZ2V0KHZhcmlhYmxlKS5jYW5jZWw7XG4gICAgfVxuICAgIGNhbmNlbEZuKCk7XG4gICAgZGVib3VuY2VkRm4gPSBfLmRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0VmFsID0gdmFyaWFibGVbb3BdKCk7XG4gICAgICAgIC8vIGhhbmRsZSBwcm9taXNlcyB0byBhdm9pZCB1bmNhdWdodCBwcm9taXNlIGVycm9ycyBpbiBjb25zb2xlXG4gICAgICAgIGlmIChyZXRWYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXRWYWwuY2F0Y2goXy5ub29wKTtcbiAgICAgICAgfVxuICAgIH0sIDEwMCk7XG4gICAgdGltZXJzLnNldCh2YXJpYWJsZSwgZGVib3VuY2VkRm4pO1xuICAgIGRlYm91bmNlZEZuKCk7XG59O1xuXG5jb25zdCBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSA9IChub2RlTmFtZSwgbm9kZVZhbCwgbm9kZVR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSkgPT4ge1xuICAgIHN3aXRjaCAodmFyaWFibGUuY2F0ZWdvcnkpIHtcbiAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuQ0FURUdPUlkuTElWRTpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZVZhbCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5maWx0ZXJGaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBub2RlVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogbm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGUubGlzdFJlY29yZHMpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCAnbGlzdFJlY29yZHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkcyA9IG5vZGVWYWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuaW5wdXRGaWVsZHNbbm9kZU5hbWVdID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGVbdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCddKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5DUlVEOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvblR5cGUgPT09ICdsaXN0JyAmJiB2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5TRVJWSUNFOlxuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MT0dJTjpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5ERVZJQ0U6XG4gICAgICAgICAgICB2YXJpYWJsZVtub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIV8uaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgXy5pc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldERlcGVuZGVuY3kgPSAodHlwZTogc3RyaW5nLCByZWY6IGFueSkgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdhcHBNYW5hZ2VyJzpcbiAgICAgICAgICAgIGFwcE1hbmFnZXIgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHR0cCc6XG4gICAgICAgICAgICBodHRwU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICBtZXRhZGF0YVNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmF2aWdhdGlvblNlcnZpY2UnOlxuICAgICAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncm91dGVyJzpcbiAgICAgICAgICAgIHJvdXRlclNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9hc3Rlcic6XG4gICAgICAgICAgICB0b2FzdGVyU2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb0F1dGgnOlxuICAgICAgICAgICAgb2F1dGhTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWN1cml0eSc6XG4gICAgICAgICAgICBzZWN1cml0eVNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICAgICAgICBkaWFsb2dTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYXRlQ2FsbGJhY2sgPSAodHlwZTogc3RyaW5nLCB2YXJpYWJsZTogYW55LCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnksIHNraXBEZWZhdWx0Tm90aWZpY2F0aW9uPzogYm9vbGVhbikgPT4ge1xuXG4gICAgLypjaGVja2luZyBpZiBldmVudCBpcyBhdmFpbGFibGUgYW5kIHZhcmlhYmxlIGhhcyBldmVudCBwcm9wZXJ0eSBhbmQgdmFyaWFibGUgZXZlbnQgcHJvcGVydHkgYm91bmQgdG8gZnVuY3Rpb24qL1xuICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdmFyaWFibGVbdHlwZV0sXG4gICAgICAgIGNhbGxCYWNrU2NvcGUgPSB2YXJpYWJsZS5fY29udGV4dDtcbiAgICBsZXQgZXJyb3JWYXJpYWJsZTtcbiAgICAvKipcbiAgICAgKiBGb3IgZXJyb3IgZXZlbnQ6XG4gICAgICogdHJpZ2dlciBhcHAgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICAgKiBpZiBubyBldmVudCBpcyBhc3NpZ25lZCwgdHJpZ2dlciBkZWZhdWx0IGFwcE5vdGlmaWNhdGlvbiB2YXJpYWJsZS5cbiAgICAgKi9cbiAgIGlmICh0eXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlQuRVJST1IgJiYgIXNraXBEZWZhdWx0Tm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGlmICghZXZlbnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIGlmIG5vIGV2ZW50IGFzc2lnbmVkLCBoYW5kbGUgdGhyb3VnaCBkZWZhdWx0IG5vdGlmaWNhdGlvbiB2YXJpYWJsZSAqL1xuICAgICAgICAgICAgZXJyb3JWYXJpYWJsZSA9IGNhbGxCYWNrU2NvcGUuQWN0aW9uc1tWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OXTtcbiAgICAgICAgICAgIGlmIChlcnJvclZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVycm9yVmFyaWFibGUuZ2V0TWVzc2FnZSgpIHx8IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IF8uaXNTdHJpbmcoZGF0YSkgPyBkYXRhIDogJ0FuIGVycm9yIGhhcyBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGFwcCBsb2dzLic7XG4gICAgICAgICAgICAgICAgZXJyb3JWYXJpYWJsZS5pbnZva2UoeyAnbWVzc2FnZScgOiBkYXRhfSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRlbWl0KFwiaW52b2tlLXNlcnZpY2VcIiwgVkFSSUFCTEVfQ09OU1RBTlRTLkRFRkFVTFRfVkFSLk5PVElGSUNBVElPTiwge3Njb3BlOiBjYWxsQmFja1Njb3BlLCBtZXNzYWdlOiByZXNwb25zZX0pO1xuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE86IFtWaWJodV0sIGNoZWNrIHdoZXRoZXIgdG8gc3VwcG9ydCBsZWdhY3kgZXZlbnQgY2FsbGluZyBtZWNoYW5pc20gKGlkZWFsbHksIGl0IHNob3VsZCBoYXZlIGJlZW4gbWlncmF0ZWQpXG4gICAgY29uc3QgZm4gPSAkcGFyc2VFdmVudCh2YXJpYWJsZVt0eXBlXSk7XG4gICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5CRUZPUkVfVVBEQVRFKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLkxpdmVWYXJpYWJsZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YUZpbHRlcjogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBpbnB1dERhdGE6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgIH1cbn07XG5cbmNvbnN0IHRyaWdnZXJPblRpbWVvdXQgPSAoc3VjY2VzcykgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0cmlnZ2VyRm4oc3VjY2Vzcyk7IH0sIDUwMCk7XG59O1xuXG5jb25zdCBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UgPSAocmVzcG9uc2UsIGhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcbiAgICBsZXQgZmlsZW5hbWUgPSAnJyxcbiAgICAgICAgZmlsZW5hbWVSZWdleCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYmxvYixcbiAgICAgICAgVVJMLFxuICAgICAgICBkb3dubG9hZFVybCxcbiAgICAgICAgcG9wdXA7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xuICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XG4gICAgICAgIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcbiAgICAgICAgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XG4gICAgICAgIGlmIChtYXRjaGVzICE9PSBudWxsICYmIG1hdGNoZXNbMV0pIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIGJsb2IgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6IHR5cGUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJGbihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBVUkwgICAgICAgICA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcbiAgICAgICAgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXG4gICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGV0IHJlYWRlcjtcbiAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IHRyaWdnZXJPblRpbWVvdXQuYmluZCh1bmRlZmluZWQsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXAgPSB3aW5kb3cub3Blbihkb3dubG9hZFVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXG4gICAgfVxufTtcblxuY29uc3QgZ2V0U2VydmljZSA9IChzZXJ2aWNlTmFtZSkgPT4ge1xuICAgIGlmICghc2VydmljZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmljZU5hbWU7XG4gICAgLy8gVG9kbzogU2h1YmhhbSwgdW5jb21tZW50IGJlbG93IGNvZGVcbiAgICAvKiAvISogZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHdoZXJlIG5nLWFwcCBpcyBkZWZpbmVkICohL1xuICAgICBsZXQgYXBwRWwgPSBXTS5lbGVtZW50KCdbaWQ9bmctYXBwXScpLCBpbmplY3RvcjtcbiAgICAgaWYgKGFwcEVsKSB7XG4gICAgIHRyeSB7XG4gICAgIGluamVjdG9yID0gYXBwRWwuaW5qZWN0b3IoKTsgLy8gZ2V0IHRoZSBhbmd1bGFyIGluamVjdG9yXG4gICAgIGlmIChpbmplY3Rvcikge1xuICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lKTsgLy8gcmV0dXJuIHRoZSBzZXJ2aWNlXG4gICAgIH1cbiAgICAgfSBjYXRjaCAoZSkge1xuICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICB9XG4gICAgIH0qL1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgdGhlIGZvcm0gZGF0YSBwYXJhbXMgZnJvbSB0aGUgVVJMXG4gKiBAcGFyYW0gcXVlcnlQYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqL1xuY29uc3Qgc2V0UGFyYW1zRnJvbVVSTCA9IChxdWVyeVBhcmFtcywgcGFyYW1zKSA9PiB7XG4gICAgcXVlcnlQYXJhbXMgPSBfLnNwbGl0KHF1ZXJ5UGFyYW1zLCAnJicpO1xuICAgIF8uZm9yRWFjaChxdWVyeVBhcmFtcywgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIHBhcmFtID0gXy5zcGxpdChwYXJhbSwgJz0nKTtcbiAgICAgICAgcGFyYW1zW3BhcmFtWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChfLmpvaW4oXy5zbGljZShwYXJhbSwgMSksICc9JykpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBbVG9kbzogU2h1YmhhbV0sIEltcGxlbWVudCBEb3dubG9hZCB0aHJvdWdoIEkgZnJhbWVcbiAqIFNpbXVsYXRlcyBmaWxlIGRvd25sb2FkIGluIGFuIGFwcCB0aHJvdWdoIGNyZWF0aW5nIGFuZCBzdWJtaXR0aW5nIGEgaGlkZGVuIGZvcm0gaW4gRE9NLlxuICogVGhlIGFjdGlvbiB3aWxsIGJlIGluaXRpYXRlZCB0aHJvdWdoIGEgU2VydmljZSBWYXJpYWJsZVxuICpcbiAqIFF1ZXJ5IFBhcmFtc1xuICogVGhlIHJlcXVlc3QgcGFyYW1zIGxpa2UgcXVlcnkgcGFyYW1zIGFyZSBhZGRlZCBhcyBoaWRkZW4gaW5wdXQgZWxlbWVudHNcbiAqXG4gKiBIZWFkZXIgUGFyYW1zXG4gKiBUaGUgaGVhZGVyIHBhcmFtcyBmb3IgYSByZXF1ZXN0IGFyZSBhbHNvIGFkZGVkIGFsb25nIHdpdGggaGlkZGVuIGlucHV0IGVsZW1lbnRzLlxuICogVGhpcyBpcyBkb25lIGFzIGhlYWRlcnMgY2FuIG5vdCBiZSBzZXQgZm9yIGEgZm9ybSBQT1NUIGNhbGwgZnJvbSBKYXZhU2NyaXB0XG4gKlxuICogRmluYWxseSwgcmVxdWVzdCBwYXJhbWV0ZXJzIGFyZSBzZW50IGFzIGZvbGxvd3M6XG4gKiBGb3IgYSBHRVQgcmVxdWVzdCwgdGhlIHJlcXVlc3QgZGF0YSBpcyBzZW50IGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtcy5cbiAqIEZvciBQT1NULCBpdCBpcyBzZW50IGFzIHJlcXVlc3QgYm9keS5cbiAqXG4gKiBAcGFyYW0gdmFyaWFibGU6IHRoZSB2YXJpYWJsZSB0aGF0IGlzIGNhbGxlZCBmcm9tIHVzZXIgYWN0aW9uXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyBvYmplY3QgY29uc2lzdGluZyB0aGUgaW5mbyB0byBjb25zdHJ1Y3QgdGhlIFhIUiByZXF1ZXN0IGZvciB0aGUgc2VydmljZVxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hJZnJhbWUgPSAocmVxdWVzdFBhcmFtcywgc3VjY2VzcykgPT4ge1xuICAgIC8vIFRvZG86IFNIdWJoYW06IFVSTCBjb250YWlucyAnLy8nIGluIGJldHdlZW4gd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYXQgdGhlIFVSTCBmb3JtYXRpb24gb25seVxuICAgIGlmIChyZXF1ZXN0UGFyYW1zLnVybFsxXSA9PT0gJy8nICYmIHJlcXVlc3RQYXJhbXMudXJsWzJdID09PSAnLycpIHtcbiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgwLCAxKSArIHJlcXVlc3RQYXJhbXMudXJsLnNsaWNlKDIpO1xuICAgIH1cbiAgICBsZXQgaUZyYW1lRWxlbWVudCxcbiAgICAgICAgZm9ybUVsLFxuICAgICAgICBwYXJhbUVsZW1lbnQsXG4gICAgICAgIHF1ZXJ5UGFyYW1zICAgICA9ICcnO1xuICAgIGNvbnN0IElGUkFNRV9OQU1FICAgICA9ICdmaWxlRG93bmxvYWRJRnJhbWUnLFxuICAgICAgICBGT1JNX05BTUUgICAgICAgPSAnZmlsZURvd25sb2FkRm9ybScsXG4gICAgICAgIENPTlRFTlRfVFlQRSAgICA9ICdDb250ZW50LVR5cGUnLFxuICAgICAgICB1cmwgICAgICAgICAgICAgPSByZXF1ZXN0UGFyYW1zLnVybCxcbiAgICAgICAgZW5jVHlwZSAgICAgICAgID0gXy5nZXQocmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBDT05URU5UX1RZUEUpLFxuICAgICAgICBwYXJhbXMgICAgICAgICAgPSBfLnBpY2tCeShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge3JldHVybiBrZXkgIT09IENPTlRFTlRfVFlQRTsgfSk7XG4gICAgLyogVG9kbzogc2h1YmhhbSA6IGRlZmluZSBnZXRTZXJ2aWNlIG1ldGhvZFxuICAgICBXU19DT05TVEFOVFMgICAgPSBnZXRTZXJ2aWNlKCdXU19DT05TVEFOVFMnKTsqL1xuXG4gICAgLyogbG9vayBmb3IgZXhpc3RpbmcgaWZyYW1lLiBJZiBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdCAqL1xuICAgIGlGcmFtZUVsZW1lbnQgPSAkKCcjJyArIElGUkFNRV9OQU1FKTtcbiAgICBpZiAoaUZyYW1lRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5maXJzdCgpLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpRnJhbWVFbGVtZW50ID0gJCgnPGlmcmFtZSBpZD1cIicgKyBJRlJBTUVfTkFNRSArICdcIiBuYW1lPVwiJyArIElGUkFNRV9OQU1FICsgJ1wiIGNsYXNzPVwibmctaGlkZVwiPjwvaWZyYW1lPicpO1xuICAgIGZvcm1FbCAgICAgICAgPSAkKCc8Zm9ybSBpZD1cIicgKyBGT1JNX05BTUUgKyAnXCIgbmFtZT1cIicgKyBGT1JNX05BTUUgKyAnXCI+PC9mb3JtPicpO1xuICAgIGZvcm1FbC5hdHRyKHtcbiAgICAgICAgJ3RhcmdldCcgIDogaUZyYW1lRWxlbWVudC5hdHRyKCduYW1lJyksXG4gICAgICAgICdhY3Rpb24nICA6IHVybCxcbiAgICAgICAgJ21ldGhvZCcgIDogcmVxdWVzdFBhcmFtcy5tZXRob2QsXG4gICAgICAgICdlbmN0eXBlJyA6IGVuY1R5cGVcbiAgICB9KTtcblxuICAgIC8qIHByb2Nlc3MgcXVlcnkgcGFyYW1zLCBhcHBlbmQgYSBoaWRkZW4gaW5wdXQgZWxlbWVudCBpbiB0aGUgZm9ybSBhZ2FpbnN0IGVhY2ggcGFyYW0gKi9cbiAgICBxdWVyeVBhcmFtcyArPSB1cmwuaW5kZXhPZignPycpICE9PSAtMSA/IHVybC5zdWJzdHJpbmcodXJsLmluZGV4T2YoJz8nKSArIDEpIDogJyc7XG4gICAgcXVlcnlQYXJhbXMgKz0gZW5jVHlwZSA9PT0gV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRCA/ICgocXVlcnlQYXJhbXMgPyAnJicgOiAnJykgKyByZXF1ZXN0UGFyYW1zLmRhdGFQYXJhbXMpIDogJyc7XG5cbiAgICAvLyBGb3IgTm9uIGJvZHkgbWV0aG9kcyBvbmx5LCBzZXQgdGhlIGlucHV0IGZpZWxkcyBmcm9tIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAoXy5pbmNsdWRlcyhXU19DT05TVEFOVFMuTk9OX0JPRFlfSFRUUF9NRVRIT0RTLCBfLnRvVXBwZXIocmVxdWVzdFBhcmFtcy5tZXRob2QpKSkge1xuICAgICAgICBzZXRQYXJhbXNGcm9tVVJMKHF1ZXJ5UGFyYW1zLCBwYXJhbXMpOyAvLyBTZXQgcGFyYW1zIGZvciBVUkwgcXVlcnkgcGFyYW1zXG4gICAgfVxuICAgIHNldFBhcmFtc0Zyb21VUkwocmVxdWVzdFBhcmFtcy5kYXRhLCBwYXJhbXMpOyAvLyBTZXQgcGFyYW1zIGZvciByZXF1ZXN0IGRhdGFcbiAgICBfLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgcGFyYW1FbGVtZW50ID0gJCgnPGlucHV0IHR5cGU9XCJoaWRkZW5cIj4nKTtcbiAgICAgICAgcGFyYW1FbGVtZW50LmF0dHIoe1xuICAgICAgICAgICAgJ25hbWUnICA6IGtleSxcbiAgICAgICAgICAgICd2YWx1ZScgOiB2YWxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvcm1FbC5hcHBlbmQocGFyYW1FbGVtZW50KTtcbiAgICB9KTtcblxuICAgIC8qIGFwcGVuZCBmb3JtIHRvIGlGcmFtZSBhbmQgaUZyYW1lIHRvIHRoZSBkb2N1bWVudCBhbmQgc3VibWl0IHRoZSBmb3JtICovXG4gICAgJCgnYm9keScpLmFwcGVuZChpRnJhbWVFbGVtZW50KTtcblxuICAgIC8vIHRpbWVvdXQgZm9yIElFIDEwLCBpZnJhbWVFbGVtZW50LmNvbnRlbnRzKCkgaXMgZW1wdHkgaW4gSUUgMTAgd2l0aG91dCB0aW1lb3V0XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQuY29udGVudHMoKS5maW5kKCdib2R5JykuYXBwZW5kKGZvcm1FbCk7XG4gICAgICAgIGZvcm1FbC5zdWJtaXQoKTtcbiAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MpO1xuICAgIH0sIDEwMCk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGFuIFhIUiBjYWxsIGFnYWluc3QgdGhlIGNvbmZpZ1xuICogdGhlIHJlc3BvbnNlIGlzIGNvbnZlcnRlZCBpbnRvIGEgYmxvYiB1cmwsIHdoaWNoIGlzIGFzc2lnbmVkIHRvIHRoZSBzcmMgYXR0cmlidXRlIG9mIGFuIGFuY2hvciBlbGVtZW50IHdpdGggZG93bmxvYWQ9dHJ1ZVxuICogYSBjbGljayBpcyBzaW11bGF0ZWQgb24gdGhlIGFuY2hvciB0byBkb3dubG9hZCB0aGUgZmlsZVxuICogQHBhcmFtIGNvbmZpZ1xuICogQHBhcmFtIHN1Y2Nlc3NcbiAqIEBwYXJhbSBlcnJvclxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hBbmNob3IgPSAoY29uZmlnLCBzdWNjZXNzLCBlcnJvcikgPT4ge1xuICAgIGNvbnN0IHVybCAgICAgPSBjb25maWcudXJsLFxuICAgICAgICBtZXRob2QgID0gY29uZmlnLm1ldGhvZCxcbiAgICAgICAgZGF0YSAgICA9IGNvbmZpZy5kYXRhUGFyYW1zIHx8IGNvbmZpZy5kYXRhLFxuICAgICAgICBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnM7XG5cbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xuXG4gICAgLy8gVG9kbzogUmVwbGFjZSBodHRwIHdpdGggZ2V0U2VydmljZVxuICAgIGh0dHBTZXJ2aWNlLnNlbmQoe1xuICAgICAgICAndGFyZ2V0JyA6ICdXZWJTZXJ2aWNlJyxcbiAgICAgICAgJ2FjdGlvbicgOiAnaW52b2tlUnVudGltZVJlc3RDYWxsJyxcbiAgICAgICAgJ21ldGhvZCcgOiBtZXRob2QsXG4gICAgICAgICd1cmwnICAgIDogdXJsLFxuICAgICAgICAnaGVhZGVycyc6IGhlYWRlcnMsXG4gICAgICAgICdkYXRhJyAgIDogZGF0YSxcbiAgICAgICAgJ3Jlc3BvbnNlVHlwZSc6ICdhcnJheWJ1ZmZlcidcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZWZyb21SZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZS5oZWFkZXJzLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgICAgIH0sIDkwMCk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0cmlnZ2VyRm4oZXJyb3IsIGVycik7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIGFwcGVuZHMgYSB0aW1lc3RhbXAgb24gdGhlIHBhc3NlZCBmaWxlbmFtZSB0byBwcmV2ZW50IGNhY2hpbmdcbiAqIHJldHVybnMgdGhlIG1vZGlmaWVkIGZpbGUgbmFtZVxuICogQHBhcmFtIGZpbGVOYW1lXG4gKiBAcGFyYW0gZXhwb3J0Rm9ybWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRNb2RpZmllZEZpbGVOYW1lID0gKGZpbGVOYW1lLCBleHBvcnRGb3JtYXQpID0+IHtcbiAgICBsZXQgZmlsZUV4dGVuc2lvbjtcbiAgICBjb25zdCBjdXJyZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9IGV4cG9ydFR5cGVzTWFwW2V4cG9ydEZvcm1hdF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9ICcuJyArIF8ubGFzdChfLnNwbGl0KGZpbGVOYW1lLCAnLicpKTtcbiAgICAgICAgZmlsZU5hbWUgPSBfLnJlcGxhY2UoZmlsZU5hbWUsIGZpbGVFeHRlbnNpb24sICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVOYW1lICsgJ18nICsgY3VycmVudFRpbWVzdGFtcCArIGZpbGVFeHRlbnNpb247XG59O1xuXG5jb25zdCBnZXRDb29raWVCeU5hbWUgPSAobmFtZSkgPT4ge1xuICAgIC8vIFRvZG86IFNodWJoYW0gSW1wbGVtZW50IGNvb2tpZSBuYXRpdmUganNcbiAgICByZXR1cm4gJ2Nvb2tpZSc7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29va2llVmFsdWUgaWYgeHNyZiBpcyBlbmFibGVkLlxuICogSW4gZGV2aWNlLCB4c3JmIGNvb2tpZSBpcyBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICogQHJldHVybnMgeHNyZiBjb29raWUgdmFsdWVcbiAqL1xuY29uc3QgaXNYc3JmRW5hYmxlZCA9ICgpID0+IHtcbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKENPTlNUQU5UUy5YU1JGX0NPT0tJRV9OQU1FKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgbm9kZSBmb3IgYSBiaW5kIG9iamVjdCwgd2hlcmUgdGhlIHZhbHVlIGhhcyB0byBiZSB1cGRhdGVkXG4gKiBvYmoudGFyZ2V0ID0gXCJhXCJcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXRPYmogPSAob2JqLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0ID0gb2JqLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0T2JqO1xuICAgIGNvbnN0IHJvb3ROb2RlID0gdmFyaWFibGVbcm9vdF07XG4gICAgaWYgKERPVF9FWFBSX1JFWC50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnN1YnN0cigwLCB0YXJnZXQubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIGlmIChvYmoudGFyZ2V0ID09PSByb290KSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSB2YXJpYWJsZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IGZpbmRWYWx1ZU9mKHJvb3ROb2RlLCB0YXJnZXQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE9iajtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IGZvciB0aGUgdGFyZ2V0IG9iamVjdFxuICogdGhlIGNvbXB1dGVkIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCBhZ2FpbnN0IHRoaXMga2V5IGluIHRoZSB0YXJnZXRPYmplY3QoY29tcHV0ZWQgYnkgZ2V0VGFyZ2V0T2JqKCkpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcmVnZXhcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXROb2RlS2V5ID0gKHRhcmdldCkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0Tm9kZUtleTtcbiAgICBpZiAoRE9UX0VYUFJfUkVYLnRlc3QodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnJlcGxhY2UoL14oXFxbW1wiJ10pfChbXCInXVxcXSkkL2csICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnNwbGl0KCcuJykucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXROb2RlS2V5O1xufTtcblxuY29uc3Qgc2V0VmFsdWVUb05vZGUgPSAodGFyZ2V0LCBvYmosIHJvb3QsIHZhcmlhYmxlLCB2YWx1ZSwgbm9VcGRhdGU/KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgdGFyZ2V0T2JqID0gZ2V0VGFyZ2V0T2JqKG9iaiwgcm9vdCwgdmFyaWFibGUpO1xuICAgIHZhbHVlID0gIV8uaXNVbmRlZmluZWQodmFsdWUpID8gdmFsdWUgOiBvYmoudmFsdWU7XG4gICAgLyogc2FuaXR5IGNoZWNrLCB1c2VyIGNhbiBiaW5kIHBhcmVudCBub2RlcyB0byBub24tb2JqZWN0IHZhbHVlcywgc28gY2hpbGQgbm9kZSBiaW5kaW5ncyBtYXkgZmFpbCAqL1xuICAgIGlmICh0YXJnZXRPYmopIHtcbiAgICAgICAgdGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlKHRhcmdldE5vZGVLZXksIHZhbHVlLCBvYmoudHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKTtcbn07XG5cbi8qKlxuICogVGhlIG1vZGVsIGludGVybmFsQm91bmROb2RlTWFwIHN0b3JlcyB0aGUgcmVmZXJlbmNlIHRvIGxhdGVzdCBjb21wdXRlZCB2YWx1ZXMgYWdhaW5zdCBpbnRlcm5hbChuZXN0ZWQpIGJvdW5kIG5vZGVzXG4gKiBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgaW50ZXJuYWwgbm9kZSdzIGNvbXB1dGVkIHZhbHVlIGlzIG5vdCBsb3N0LCBvbmNlIGl0cyBwYXJlbnQgbm9kZSdzIHZhbHVlIGlzIGNvbXB1dGVkIGF0IGEgbGF0ZXIgcG9pbnRcbiAqIEUuZy5cbiAqIFZhcmlhYmxlLmVtcGxveWVlVmFyIGhhcyBmb2xsb3dpbmcgYmluZGluZ3NcbiAqIFwiZGF0YUJpbmRpbmdcIjogW1xuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnQuYnVkZ2V0XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuYnVkZ2V0VmFyLmRhdGFTZXRcIlxuICAgICB9LFxuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnRcIixcbiAgICAgICAgIFwidmFsdWVcIjogXCJiaW5kOlZhcmlhYmxlcy5kZXBhcnRtZW50VmFyLmRhdGFTZXRcIlxuICAgICB9XG4gXVxuICogV2hlbiBkZXBhcnRtZW50LmJ1ZGdldCBpcyBjb21wdXRlZCwgZW1wbG95ZWVWYXIuZGF0YVNldCA9IHtcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcImJ1ZGdldFwiOiB7XCJxMVwiOiAxMTExfVxuICogIH1cbiAqIH1cbiAqXG4gKiBXaGVuIGRlcGFydG1lbnQgaXMgY29tcHV0ZWRcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcIm5hbWVcIjogXCJIUlwiLFxuICogICAgICBcImxvY2F0aW9uXCI6IFwiSHlkZXJhYmFkXCJcbiAqICB9XG4gKiBUaGUgYnVkZ2V0IGZpZWxkIChjb21wdXRlZCBlYXJsaWVyKSBpcyBMT1NULlxuICpcbiAqIFRvIGF2b2lkIHRoaXMsIHRoZSBsYXRlc3QgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwgbm9kZXMgKGluIHRoaXMgY2FzZSBkZXBhcnRtZW50LmJ1ZGdldCkgYXJlIHN0b3JlZCBpbiBhIG1hcFxuICogVGhlc2UgdmFsdWVzIGFyZSBhc3NpZ25lZCBiYWNrIHRvIGludGVybmFsIGZpZWxkcyBpZiB0aGUgcGFyZW50IGlzIGNvbXB1dGVkIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudClcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqL1xuY29uc3QgdXBkYXRlSW50ZXJuYWxOb2RlcyA9ICh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgY29uc3QgYm91bmRJbnRlcm5hbE5vZGVzID0gXy5rZXlzKF8uZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290XSkpLFxuICAgICAgICB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpO1xuICAgIGxldCBpbnRlcm5hbE5vZGVzO1xuICAgIGZ1bmN0aW9uIGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKGJvdW5kSW50ZXJuYWxOb2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXRlciBjb25kaXRpb24gaW4gY2hlY2sgKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgaXMgc3BlY2lmaWNhbGx5IGZvciBsaXZlIHZhcmlhYmxlIG9mIGluc2VydC91cGRhdGUgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiAobm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSAmJiBfLmluY2x1ZGVzKG5vZGUsIHRhcmdldE5vZGVLZXkpKSB8fCAoKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgJiYgbm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcm5hbE5vZGVzID0gZmluZEludGVybmFsTm9kZUJvdW5kKCk7XG4gICAgaWYgKChpbnRlcm5hbE5vZGVzLmxlbmd0aCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZShub2RlLCB7dGFyZ2V0OiBub2RlfSwgcm9vdCwgdmFyaWFibGUsIF8uZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCBub2RlXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIE5ldyBJbXBsZW1lbnRhdGlvbiAoRGF0YUJpbmRpbmcgRmxhdCBTdHJ1Y3R1cmUgd2l0aCB4LXBhdGggdGFyZ2V0cylcbiAqIHByb2Nlc3NlcyBhIGRhdGFCaW5kaW5nIG9iamVjdCwgaWYgYm91bmQgdG8gZXhwcmVzc2lvbiwgd2F0Y2hlcyBvdmVyIGl0LCBlbHNlIGFzc2lnbnMgdmFsdWUgdG8gdGhlIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBvYmogZGF0YUJpbmRpbmcgb2JqZWN0XG4gKiBAcGFyYW0gc2NvcGUgc2NvcGUgb2YgdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gcm9vdCByb290IG5vZGUgc3RyaW5nIChkYXRhQmluZGluZyBmb3IgYWxsIHZhcmlhYmxlcywgZGF0YVNldCBmb3Igc3RhdGljIHZhcmlhYmxlKVxuICogQHBhcmFtIHZhcmlhYmxlIHZhcmlhYmxlIG9iamVjdFxuICovXG5jb25zdCBwcm9jZXNzQmluZE9iamVjdCA9IChvYmosIHNjb3BlLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9iai50YXJnZXQsXG4gICAgICAgIHRhcmdldE9iaiA9IGdldFRhcmdldE9iaihvYmosIHJvb3QsIHZhcmlhYmxlKSxcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgcnVuTW9kZSA9IHRydWU7XG4gICAgY29uc3QgZGVzdHJveUZuID0gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIgPyBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lci5iaW5kKHNjb3BlKSA6IF8ubm9vcDtcblxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoKG9iai52YWx1ZSwgJ2JpbmQ6JykpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICAgICAgICAgIGlmICgobmV3VmFsID09PSBvbGRWYWwgJiYgXy5pc1VuZGVmaW5lZChuZXdWYWwpKSB8fCAoXy5pc1VuZGVmaW5lZChuZXdWYWwpICYmICghXy5pc1VuZGVmaW5lZChvbGRWYWwpIHx8ICFfLmlzVW5kZWZpbmVkKHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2xvbmluZyBmb3IgYmxvYiBjb2x1bW5cbiAgICAgICAgICAgIGlmICghXy5pbmNsdWRlcyhbJ2Jsb2InLCAnZmlsZSddLCBvYmoudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBnZXRDbG9uZWRPYmplY3QobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgbmV3VmFsKTsgLy8gY2xvbmluZyBuZXdWYWwgdG8ga2VlcCB0aGUgc291cmNlIGNsZWFuXG5cbiAgICAgICAgICAgIGlmIChydW5Nb2RlKSB7XG4gICAgICAgICAgICAgICAgLypzZXQgdGhlIGludGVybmFsIGJvdW5kIG5vZGUgbWFwIHdpdGggdGhlIGxhdGVzdCB1cGRhdGVkIHZhbHVlKi9cbiAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsQm91bmROb2RlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF8uc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCB0YXJnZXRdLCBuZXdWYWwpO1xuICAgICAgICAgICAgICAgIC8qdXBkYXRlIHRoZSBpbnRlcm5hbCBub2RlcyBhZnRlciBpbnRlcm5hbCBub2RlIG1hcCBpcyBzZXQqL1xuICAgICAgICAgICAgICAgIGlmIChfLmlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJuYWxOb2Rlcyh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRlc3Ryb3lGbigkd2F0Y2gob2JqLnZhbHVlLnJlcGxhY2UoJ2JpbmQ6JywgJycpLCBzY29wZSwge30sIGxpc3RlbmVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB2YXJpYWJsZS5pc011dGVkKSk7XG4gICAgfSBlbHNlIGlmICghXy5pc1VuZGVmaW5lZChvYmoudmFsdWUpKSB7XG4gICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgb2JqLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHJ1bk1vZGUgJiYgcm9vdCAhPT0gdGFyZ2V0Tm9kZUtleSkge1xuICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfLnNldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgdGFyZ2V0XSwgb2JqLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBVQkxJQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvL1xuXG4vKipcbiAqIEluaXRpYWxpemVzIHdhdGNoZXJzIGZvciBiaW5kaW5nIGV4cHJlc3Npb25zIGNvbmZpZ3VyZWQgaW4gdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEBwYXJhbSBjb250ZXh0LCBzY29wZSBjb250ZXh0IGluIHdoaWNoIHRoZSB2YXJpYWJsZSBleGlzdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5kU291cmNlLCAgdGhlIGZpZWxkIGluIHZhcmlhYmxlIHdoZXJlIHRoZSBkYXRhYmluZGluZ3MgYXJlIGNvbmZpZ3VyZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3QgdmFyaWFibGVzLCBpdCB3aWxsIGJlICdkYXRhQmluZGluZycsIGhlbmNlIGRlZmF1bHQgZmFsbGJhY2sgaXMgdG8gJ2RhdGFCaW5kaW5nJ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc29tZSBpdCBjYW4gYmUgJ2RhdGFTZXQnIGFuZCBoZW5jZSB3aWxsIGJlIHBhc3NlZCBhcyBwYXJhbVxuICogQHBhcmFtIHtzdHJpbmd9IGJpbmRUYXJnZXQsIHRoZSBvYmplY3QgZmllbGQgaW4gdmFyaWFibGUgd2hlcmUgdGhlIGNvbXB1dGVkIGJpbmRpbmdzIHdpbGwgYmUgc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzQmluZGluZyA9ICh2YXJpYWJsZTogYW55LCBjb250ZXh0OiBhbnksIGJpbmRTb3VyY2U/OiBzdHJpbmcsIGJpbmRUYXJnZXQ/OiBzdHJpbmcpID0+IHtcbiAgICBiaW5kU291cmNlID0gYmluZFNvdXJjZSB8fCAnZGF0YUJpbmRpbmcnO1xuICAgIGJpbmRUYXJnZXQgPSBiaW5kVGFyZ2V0IHx8ICdkYXRhQmluZGluZyc7XG5cbiAgICBjb25zdCBiaW5kTWFwID0gdmFyaWFibGVbYmluZFNvdXJjZV07XG4gICAgdmFyaWFibGVbYmluZFNvdXJjZV0gPSB7fTtcbiAgICB2YXJpYWJsZVsnX2JpbmQnICsgYmluZFNvdXJjZV0gPSBiaW5kTWFwO1xuICAgIGlmICghYmluZE1hcCB8fCAhXy5pc0FycmF5KGJpbmRNYXApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmluZE1hcC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIC8qIGZvciBzdGF0aWMgdmFyaWFibGUgY2hhbmdlIHRoZSBiaW5kaW5nIHdpdGggdGFyZ2V0ICdkYXRhQmluZGluZycgdG8gJ2RhdGFTZXQnLCBhcyB0aGUgcmVzdWx0cyBoYXZlIHRvIHJlZmxlY3QgZGlyZWN0bHkgaW4gdGhlIGRhdGFTZXQgKi9cbiAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uVmFyaWFibGUnICYmIG5vZGUudGFyZ2V0ID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICBub2RlLnRhcmdldCA9ICdkYXRhU2V0JztcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQmluZE9iamVjdChub2RlLCBjb250ZXh0LCBiaW5kVGFyZ2V0LCB2YXJpYWJsZSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIERvd25sb2FkcyBhIGZpbGUgaW4gdGhlIGJyb3dzZXIuXG4gKiBUd28gbWV0aG9kcyB0byBkbyBzbywgbmFtZWx5OlxuICogMS4gZG93bmxvYWRUaHJvdWdoQW5jaG9yLCBjYWxsZWQgaWZcbiAqICAgICAgLSBpZiBhIGhlYWRlciBpcyB0byBiZSBwYXNzZWRcbiAqICAgICAgT1JcbiAqICAgICAgLSBpZiBzZWN1cml0eSBpcyBPTiBhbmQgWFNSRiB0b2tlbiBpcyB0byBiZSBzZW50IGFzIHdlbGxcbiAqIE5PVEU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgdmVyc2lvbiAxMC4wIGFuZCBiZWxvd1xuICpcbiAqIDIuIGRvd25sb2FkVGhyb3VnaElmcmFtZVxuICogICAgICAtIHRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBicm93c2VycyBhbmQgdXNlcyBhbiBpZnJhbWUgdG8gZG93bmxhZCB0aGUgZmlsZS5cbiAqIEBwYXJhbSByZXF1ZXN0UGFyYW1zIHJlcXVlc3QgcGFyYW1zIG9iamVjdFxuICogQHBhcmFtIGZpbGVOYW1lIHJlcHJlc2VudHMgdGhlIGZpbGUgbmFtZVxuICogQHBhcmFtIGV4cG9ydEZvcm1hdCBkb3dubG9hZGVkIGZpbGUgZm9ybWF0XG4gKiBAcGFyYW0gc3VjY2VzcyBzdWNjZXNzIGNhbGxiYWNrXG4gKiBAcGFyYW0gZXJyb3IgZXJyb3IgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IHNpbXVsYXRlRmlsZURvd25sb2FkID0gKHJlcXVlc3RQYXJhbXMsIGZpbGVOYW1lLCBleHBvcnRGb3JtYXQsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLypzdWNjZXNzIGFuZCBlcnJvciBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIGluY2FzZSBvZiBkb3dubG9hZFRocm91Z2hBbmNob3JcbiAgICAgRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBpbmNhc2Ugb2YgaWZyYW1lKi9cbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgbGV0IGZpbGVFeHRlbnNpb247XG4gICAgICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpbGVFeHRlbnNpb24gPSBleHBvcnRUeXBlc01hcFtleHBvcnRGb3JtYXRdO1xuICAgICAgICB9XG4gICAgICAgIGFwcE1hbmFnZXIubm90aWZ5KCdkZXZpY2UtZmlsZS1kb3dubG9hZCcsIHsgdXJsOiByZXF1ZXN0UGFyYW1zLnVybCwgbmFtZTogZmlsZU5hbWUsIGV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiwgaGVhZGVyczogcmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBzdWNjZXNzQ2I6IHN1Y2Nlc3MsIGVycm9yQ2I6IGVycm9yfSk7XG4gICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KHJlcXVlc3RQYXJhbXMuaGVhZGVycykgfHwgaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaEFuY2hvcihyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG93bmxvYWRUaHJvdWdoSWZyYW1lKHJlcXVlc3RQYXJhbXMsIHN1Y2Nlc3MpO1xuICAgIH1cbn07XG5cbi8qKlxuICogc2V0cyB0aGUgdmFsdWUgYWdhaW5zdCBwYXNzZWQga2V5IG9uIHRoZSBcImlucHV0RmllbGRzXCIgb2JqZWN0IGluIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHRhcmdldE9iajogdGhlIG9iamVjdCBpbiB3aGljaCB0aGUga2V5LCB2YWx1ZSBpcyB0byBiZSBzZXRcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHBhcmFtIGtleTogY2FuIGJlOlxuICogIC0gYSBzdHJpbmcgZS5nLiBcInVzZXJuYW1lXCJcbiAqICAtIGFuIG9iamVjdCwgZS5nLiB7XCJ1c2VybmFtZVwiOiBcImpvaG5cIiwgXCJzc25cIjogXCIxMTExMVwifVxuICogQHBhcmFtIHZhbFxuICogLSBpZiBrZXkgaXMgc3RyaW5nLCB0aGUgdmFsdWUgYWdhaW5zdCBpdCAoZm9yIHRoYXQgZGF0YSB0eXBlKVxuICogLSBpZiBrZXkgaXMgb2JqZWN0LCBub3QgcmVxdWlyZWRcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgY29uc3Qgc2V0SW5wdXQgPSAodGFyZ2V0T2JqOiBhbnksIGtleTogYW55LCB2YWw6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgdGFyZ2V0T2JqID0gdGFyZ2V0T2JqIHx8IHt9O1xuICAgIGxldCBrZXlzLFxuICAgICAgICBsYXN0S2V5LFxuICAgICAgICBwYXJhbU9iaiA9IHt9O1xuXG4gICAgLy8gY29udGVudCB0eXBlIGNoZWNrXG4gICAgaWYgKF8uaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgICAgIHZhbCA9IGdldEJsb2IodmFsLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsID0gXy5pc051bWJlcih2YWwpID8gdmFsIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXy5pc09iamVjdChrZXkpKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBpdHNlbGZcbiAgICAgICAgcGFyYW1PYmogPSBrZXk7XG4gICAgfSBlbHNlIGlmIChrZXkuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yICcuJyBpbiBrZXkgZS5nLiAnZW1wbG95ZWUuZGVwYXJ0bWVudCdcbiAgICAgICAga2V5cyA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICBsYXN0S2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgLy8gRmluZGluZyB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBrZXlcbiAgICAgICAgdGFyZ2V0T2JqID0gZmluZFZhbHVlT2YodGFyZ2V0T2JqLCBrZXlzLmpvaW4oJy4nKSwgdHJ1ZSk7XG4gICAgICAgIGtleSA9IGxhc3RLZXk7XG4gICAgICAgIHBhcmFtT2JqW2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1PYmpba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICBfLmZvckVhY2gocGFyYW1PYmosIGZ1bmN0aW9uIChwYXJhbVZhbCwgcGFyYW1LZXkpIHtcbiAgICAgICAgdGFyZ2V0T2JqW3BhcmFtS2V5XSA9IHBhcmFtVmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZiBIVE1MNSBGaWxlIEFQSSBpcyBhdmFpbGFibGUgZWxzZSBmYWxzZVxuICogQHJldHVybnMge3twcm90b3R5cGU6IEJsb2I7IG5ldyhibG9iUGFydHM/OiBhbnlbXSwgb3B0aW9ucz86IEJsb2JQcm9wZXJ0eUJhZyk6IEJsb2J9fVxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlVXBsb2FkU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgIHJldHVybiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YXJPcmRlclxuICogQHBhcmFtIG9wdGlvbnNPcmRlclxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV2YWx1YXRlZE9yZGVyQnkgPSAodmFyT3JkZXIsIG9wdGlvbnNPcmRlcikgPT4ge1xuICAgIGxldCBvcHRpb25GaWVsZHMsXG4gICAgICAgIHZhck9yZGVyQnk7XG4gICAgLy8gSWYgb3B0aW9ucyBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHZhcmlhYmxlIG9yZGVyXG4gICAgaWYgKCFvcHRpb25zT3JkZXIgfHwgXy5pc0VtcHR5KG9wdGlvbnNPcmRlcikpIHtcbiAgICAgICAgcmV0dXJuIHZhck9yZGVyO1xuICAgIH1cbiAgICAvLyBJZiB2YXJpYWJsZSBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIG9wdGlvbnMgb3JkZXJcbiAgICBpZiAoIXZhck9yZGVyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zT3JkZXI7XG4gICAgfVxuICAgIC8vIElmIGJvdGggYXJlIHByZXNlbnQsIGNvbWJpbmUgdGhlIG9wdGlvbnMgb3JkZXIgYW5kIHZhcmlhYmxlIG9yZGVyLCB3aXRoIG9wdGlvbnMgb3JkZXIgYXMgcHJlY2VkZW5jZVxuICAgIHZhck9yZGVyICAgICA9IF8uc3BsaXQodmFyT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uc09yZGVyID0gXy5zcGxpdChvcHRpb25zT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uRmllbGRzID0gXy5tYXAob3B0aW9uc09yZGVyLCBmdW5jdGlvbiAob3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIF8uc3BsaXQoXy50cmltKG9yZGVyKSwgJyAnKVswXTtcbiAgICB9KTtcbiAgICAvLyBJZiBhIGZpZWxkIGlzIHByZXNlbnQgaW4gYm90aCBvcHRpb25zIGFuZCB2YXJpYWJsZSwgcmVtb3ZlIHRoZSB2YXJpYWJsZSBvcmRlcmJ5XG4gICAgXy5yZW1vdmUodmFyT3JkZXIsIGZ1bmN0aW9uIChvcmRlckJ5KSB7XG4gICAgICAgIHJldHVybiBfLmluY2x1ZGVzKG9wdGlvbkZpZWxkcywgXy5zcGxpdChfLnRyaW0ob3JkZXJCeSksICcgJylbMF0pO1xuICAgIH0pO1xuICAgIHZhck9yZGVyQnkgPSB2YXJPcmRlci5sZW5ndGggPyAnLCcgKyBfLmpvaW4odmFyT3JkZXIsICcsJykgOiAnJztcbiAgICByZXR1cm4gXy5qb2luKG9wdGlvbnNPcmRlciwgJywnKSArIHZhck9yZGVyQnk7XG59O1xuXG4vKipcbiAqIGZvcm1hdHRpbmcgdGhlIGV4cHJlc3Npb24gYXMgcmVxdWlyZWQgYnkgYmFja2VuZCB3aGljaCB3YXMgZW5jbG9zZWQgYnkgJHs8ZXhwcmVzc2lvbj59LlxuICogQHBhcmFtIGZpZWxkRGVmc1xuICogcmV0dXJucyBmaWVsZERlZnNcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdEV4cG9ydEV4cHJlc3Npb24gPSBmaWVsZERlZnMgPT4ge1xuICAgIF8uZm9yRWFjaChmaWVsZERlZnMsIGZ1bmN0aW9uIChmaWVsZERlZikge1xuICAgICAgICBpZiAoZmllbGREZWYuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgZmllbGREZWYuZXhwcmVzc2lvbiA9ICckeycgKyBmaWVsZERlZi5leHByZXNzaW9uICsgJ30nO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkRGVmcztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZVZhcmlhYmxlQ2FsbCA9IF9pbnZva2U7XG5cbmNvbnN0IGdldERhdGVUaW1lRm9ybWF0Rm9yVHlwZSA9ICh0eXBlKSA9PiB7XG4gICAgcmV0dXJuIERFRkFVTFRfRk9STUFUU1tfLnRvVXBwZXIodHlwZSldO1xufTtcblxuLy8gRm9ybWF0IHZhbHVlIGZvciBkYXRldGltZSB0eXBlc1xuY29uc3QgX2Zvcm1hdERhdGUgPSAoZGF0ZVZhbHVlLCB0eXBlKSA9PiB7XG4gICAgbGV0IGVwb2NoO1xuICAgIGlmIChfLmlzRGF0ZShkYXRlVmFsdWUpKSB7XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWlzTmFOKGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIGRhdGVWYWx1ZSA9IHBhcnNlSW50KGRhdGVWYWx1ZSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlICYmIG1vbWVudChkYXRlVmFsdWUpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGVwb2NoKSAmJiB0eXBlICE9PSBEYXRhVHlwZS5USU1FKSB7XG4gICAgICAgIHJldHVybiBlcG9jaDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IERhdGFUeXBlLlRJTUVTVEFNUCkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FICYmICFlcG9jaCkge1xuICAgICAgICBlcG9jaCA9IG1vbWVudChuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpICsgJyAnICsgZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlVmFsdWUgJiYgYXBwTWFuYWdlci5nZXRQaXBlKCdkYXRlJykudHJhbnNmb3JtKGVwb2NoLCBnZXREYXRlVGltZUZvcm1hdEZvclR5cGUodHlwZSkpO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gY29udmVydCB2YWx1ZXMgb2YgZGF0ZSB0aW1lIHR5cGVzIGludG8gZGVmYXVsdCBmb3JtYXRzXG5leHBvcnQgY29uc3QgZm9ybWF0RGF0ZSA9ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIGlmIChfLmluY2x1ZGVzKHR5cGUsICcuJykpIHtcbiAgICAgICAgdHlwZSA9IF8udG9Mb3dlcihleHRyYWN0VHlwZSh0eXBlKSk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBfLm1hcCh2YWx1ZSwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9mb3JtYXREYXRlKHZhbCwgdHlwZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX2Zvcm1hdERhdGUodmFsdWUsIHR5cGUpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSB2YXJpYWJsZSBkYXRhIHdoaWNoIGlzIGVuY29kZWQgZnJvbSBiYWNrZW5kIGJlZm9yZSBzaG93aW5nIGluIHRoZSB3aWRnZXRzLlxuICogSXQgdGFrZXMgdmFyaWFibGUgcmVzcG9uc2UgY29udGVudCBhcyBpbnB1dCBhbmQgaXRlcmF0ZXMgcmVjdXJzaXZlbHksXG4gKiBpZiB0aGUgdmFsdWUgaXMgc3RyaW5nIHR5cGUgdGhlbiBpdCB3aWxsIGRlY29kZSB0aGUgZGF0YS5cbiAqIEBwYXJhbSByZXNwb25zZUNvbnRlbnQgKEFycmF5IG9mIG9iamVjdHMpXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVEYXRhID0gKHJlc3BvbnNlQ29udGVudCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VDb250ZW50KSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUNvbnRlbnQ7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICBfLmZvckVhY2gocmVzcG9uc2VDb250ZW50LCBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGh0bWxEZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZGF0YSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIF8uaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBodG1sRGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlc3BvbnNlQ29udGVudCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudFtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIHJlc3BvbnNlQ29udGVudCA9IGh0bWxEZWNvZGUocmVzcG9uc2VDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGVudDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBodG1sRGVjb2RlKGlucHV0KSB7XG4gICAgcmV0dXJuIGhlLnVuZXNjYXBlKGlucHV0KTtcbn1cbiJdfQ==
796
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsT0FBTyxFQUNQLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFJaEcsTUFBTSxjQUFjLEdBQUssRUFBRSxPQUFPLEVBQUcsT0FBTyxFQUFFLEtBQUssRUFBRyxNQUFNLEVBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDdEIsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQztBQUM3QixNQUFNLENBQUMsSUFBSSxhQUFhLENBQUM7QUFDekIsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQztBQUN4QixNQUFNLENBQUMsSUFBSSxlQUFlLENBQUM7QUFDM0IsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDO0FBRXpCLE1BQU0sWUFBWSxHQUFHLHdCQUF3QixFQUN6QyxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUNoQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUV2QixNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLFdBQVcsRUFDWCxRQUFRLEdBQUcsQ0FBQyxD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S0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzVCLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckI7UUFDTCxDQUFDLENBQUMsQ0FBQztLQUNOO1NBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ3BDLGVBQWUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUMsT0FBTyxlQUFlLENBQUM7S0FDMUI7QUFDTCxDQUFDLENBQUM7QUFFRixTQUFTLFVBQVUsQ0FBQyxLQUFLO0lBQ3JCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICAkcGFyc2VFdmVudCxcbiAgICAkd2F0Y2gsXG4gICAgRGF0YVR5cGUsXG4gICAgREVGQVVMVF9GT1JNQVRTLFxuICAgIGV4dHJhY3RUeXBlLFxuICAgIGZpbmRWYWx1ZU9mLFxuICAgIGdldEJsb2IsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgdHJpZ2dlckZuXG59IGZyb20gJ0B3bS9jb3JlJztcblxuaW1wb3J0IHtDT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdmFyaWFibGVzLmNvbnN0YW50cyc7XG5cbmRlY2xhcmUgY29uc3Qgd2luZG93LCBfLCAkLCBtb21lbnQsIGhlO1xuXG5jb25zdCBleHBvcnRUeXBlc01hcCAgID0geyAnRVhDRUwnIDogJy54bHN4JywgJ0NTVicgOiAnLmNzdid9O1xuXG5leHBvcnQgbGV0IGFwcE1hbmFnZXI7XG5leHBvcnQgbGV0IGh0dHBTZXJ2aWNlO1xuZXhwb3J0IGxldCBtZXRhZGF0YVNlcnZpY2U7XG5leHBvcnQgbGV0IG5hdmlnYXRpb25TZXJ2aWNlO1xuZXhwb3J0IGxldCByb3V0ZXJTZXJ2aWNlO1xuZXhwb3J0IGxldCB0b2FzdGVyU2VydmljZTtcbmV4cG9ydCBsZXQgb2F1dGhTZXJ2aWNlO1xuZXhwb3J0IGxldCBzZWN1cml0eVNlcnZpY2U7XG5leHBvcnQgbGV0IGRpYWxvZ1NlcnZpY2U7XG5cbmNvbnN0IERPVF9FWFBSX1JFWCA9IC9eXFxbKFwifCcpW1xcd1xcV10qKFxcMSlcXF0kLyxcbiAgICBpbnRlcm5hbEJvdW5kTm9kZU1hcCA9IG5ldyBNYXAoKSxcbiAgICB0aW1lcnMgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IF9pbnZva2UgPSAodmFyaWFibGUsIG9wKSA9PiB7XG4gICAgbGV0IGRlYm91bmNlZEZuLFxuICAgICAgICBjYW5jZWxGbiA9IF8ubm9vcCxcbiAgICAgICAgcmV0VmFsO1xuICAgIGlmICh0aW1lcnMuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICBjYW5jZWxGbiA9IHRpbWVycy5nZXQodmFyaWFibGUpLmNhbmNlbDtcbiAgICB9XG4gICAgY2FuY2VsRm4oKTtcbiAgICBkZWJvdW5jZWRGbiA9IF8uZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXRWYWwgPSB2YXJpYWJsZVtvcF0oKTtcbiAgICAgICAgLy8gaGFuZGxlIHByb21pc2VzIHRvIGF2b2lkIHVuY2F1Z2h0IHByb21pc2UgZXJyb3JzIGluIGNvbnNvbGVcbiAgICAgICAgaWYgKHJldFZhbCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldFZhbC5jYXRjaChfLm5vb3ApO1xuICAgICAgICB9XG4gICAgfSwgMTAwKTtcbiAgICB0aW1lcnMuc2V0KHZhcmlhYmxlLCBkZWJvdW5jZWRGbik7XG4gICAgZGVib3VuY2VkRm4oKTtcbn07XG5cbmNvbnN0IHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlID0gKG5vZGVOYW1lLCBub2RlVmFsLCBub2RlVHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKSA9PiB7XG4gICAgc3dpdGNoICh2YXJpYWJsZS5jYXRlZ29yeSkge1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MSVZFOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvbiA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChub2RlVmFsLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmlsdGVyRmllbGRzW25vZGVOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IG5vZGVWYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgOiBub2RlVHlwZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpZiBhdXRvLXVwZGF0ZSBzZXQgZm9yIHRoZSB2YXJpYWJsZSB3aXRoIHJlYWQgb3BlcmF0aW9uIG9ubHksIGdldCBpdHMgZGF0YSAqL1xuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5saXN0UmVjb3JkcykgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdsaXN0UmVjb3JkcycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmlucHV0RmllbGRzID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkc1tub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpZiBhdXRvLXVwZGF0ZSBzZXQgZm9yIHRoZSB2YXJpYWJsZSB3aXRoIHJlYWQgb3BlcmF0aW9uIG9ubHksIGdldCBpdHMgZGF0YSAqL1xuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZVt2YXJpYWJsZS5vcGVyYXRpb24gKyAnUmVjb3JkJ10pICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCB2YXJpYWJsZS5vcGVyYXRpb24gKyAnUmVjb3JkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLkNSVUQ6XG4gICAgICAgICAgICBpZiAodmFyaWFibGUub3BlcmF0aW9uVHlwZSA9PT0gJ2xpc3QnICYmIHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIV8uaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgXy5pc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLlNFUlZJQ0U6XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLkxPR0lOOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIV8uaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgXy5pc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLkRFVklDRTpcbiAgICAgICAgICAgIHZhcmlhYmxlW25vZGVOYW1lXSA9IG5vZGVWYWw7XG4gICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGUuaW52b2tlKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCAnaW52b2tlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVwZW5kZW5jeSA9ICh0eXBlOiBzdHJpbmcsIHJlZjogYW55KSA9PiB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FwcE1hbmFnZXInOlxuICAgICAgICAgICAgYXBwTWFuYWdlciA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdodHRwJzpcbiAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgICAgICAgIG1ldGFkYXRhU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduYXZpZ2F0aW9uU2VydmljZSc6XG4gICAgICAgICAgICBuYXZpZ2F0aW9uU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyb3V0ZXInOlxuICAgICAgICAgICAgcm91dGVyU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2FzdGVyJzpcbiAgICAgICAgICAgIHRvYXN0ZXJTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvQXV0aCc6XG4gICAgICAgICAgICBvYXV0aFNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlY3VyaXR5JzpcbiAgICAgICAgICAgIHNlY3VyaXR5U2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgICAgICAgIGRpYWxvZ1NlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaW5pdGlhdGVDYWxsYmFjayA9ICh0eXBlOiBzdHJpbmcsIHZhcmlhYmxlOiBhbnksIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSwgc2tpcERlZmF1bHROb3RpZmljYXRpb24/OiBib29sZWFuKSA9PiB7XG5cbiAgICAvKmNoZWNraW5nIGlmIGV2ZW50IGlzIGF2YWlsYWJsZSBhbmQgdmFyaWFibGUgaGFzIGV2ZW50IHByb3BlcnR5IGFuZCB2YXJpYWJsZSBldmVudCBwcm9wZXJ0eSBib3VuZCB0byBmdW5jdGlvbiovXG4gICAgY29uc3QgZXZlbnRWYWx1ZXMgPSB2YXJpYWJsZVt0eXBlXSxcbiAgICAgICAgY2FsbEJhY2tTY29wZSA9IHZhcmlhYmxlLl9jb250ZXh0O1xuICAgIGxldCBlcnJvclZhcmlhYmxlO1xuICAgIC8qKlxuICAgICAqIEZvciBlcnJvciBldmVudDpcbiAgICAgKiB0cmlnZ2VyIGFwcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICAgICAqIGlmIG5vIGV2ZW50IGlzIGFzc2lnbmVkLCB0cmlnZ2VyIGRlZmF1bHQgYXBwTm90aWZpY2F0aW9uIHZhcmlhYmxlLlxuICAgICAqL1xuICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5FUlJPUiAmJiAhc2tpcERlZmF1bHROb3RpZmljYXRpb24pIHtcbiAgICAgICAgaWYgKCFldmVudFZhbHVlcykge1xuICAgICAgICAgICAgLyogaW4gY2FzZSBvZiBlcnJvciwgaWYgbm8gZXZlbnQgYXNzaWduZWQsIGhhbmRsZSB0aHJvdWdoIGRlZmF1bHQgbm90aWZpY2F0aW9uIHZhcmlhYmxlICovXG4gICAgICAgICAgICBlcnJvclZhcmlhYmxlID0gY2FsbEJhY2tTY29wZS5BY3Rpb25zW1ZBUklBQkxFX0NPTlNUQU5UUy5ERUZBVUxUX1ZBUi5OT1RJRklDQVRJT05dO1xuICAgICAgICAgICAgaWYgKGVycm9yVmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZXJyb3JWYXJpYWJsZS5nZXRNZXNzYWdlKCkgfHwgZGF0YTtcbiAgICAgICAgICAgICAgICBkYXRhID0gXy5pc1N0cmluZyhkYXRhKSA/IGRhdGEgOiAnQW4gZXJyb3IgaGFzIG9jY3VyZWQuIFBsZWFzZSBjaGVjayB0aGUgYXBwIGxvZ3MuJztcbiAgICAgICAgICAgICAgICBlcnJvclZhcmlhYmxlLmludm9rZSh7ICdtZXNzYWdlJyA6IGRhdGF9LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgIC8vICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICRyb290U2NvcGUuJGVtaXQoXCJpbnZva2Utc2VydmljZVwiLCBWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OLCB7c2NvcGU6IGNhbGxCYWNrU2NvcGUsIG1lc3NhZ2U6IHJlc3BvbnNlfSk7XG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVE9ETzogW1ZpYmh1XSwgY2hlY2sgd2hldGhlciB0byBzdXBwb3J0IGxlZ2FjeSBldmVudCBjYWxsaW5nIG1lY2hhbmlzbSAoaWRlYWxseSwgaXQgc2hvdWxkIGhhdmUgYmVlbiBtaWdyYXRlZClcbiAgICBjb25zdCBmbiA9ICRwYXJzZUV2ZW50KHZhcmlhYmxlW3R5cGVdKTtcbiAgICBpZiAodHlwZSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLkVWRU5ULkJFRk9SRV9VUERBVEUpIHtcbiAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uTGl2ZVZhcmlhYmxlJyAmJiB2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBkYXRhRmlsdGVyOiBkYXRhLCBvcHRpb25zOiBvcHRpb25zfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFyaWFibGUuX2NvbnRleHQsIHt2YXJpYWJsZTogdmFyaWFibGUsIGlucHV0RGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBkYXRhOiBkYXRhLCBvcHRpb25zOiBvcHRpb25zfSk7XG4gICAgfVxufTtcblxuY29uc3QgdHJpZ2dlck9uVGltZW91dCA9IChzdWNjZXNzKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHRyaWdnZXJGbihzdWNjZXNzKTsgfSwgNTAwKTtcbn07XG5cbmNvbnN0IGRvd25sb2FkRmlsZWZyb21SZXNwb25zZSA9IChyZXNwb25zZSwgaGVhZGVycywgc3VjY2VzcywgZXJyb3IpID0+IHtcbiAgICAvLyBjaGVjayBmb3IgYSBmaWxlbmFtZVxuICAgIGxldCBmaWxlbmFtZSA9ICcnLFxuICAgICAgICBmaWxlbmFtZVJlZ2V4LFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICB0eXBlLFxuICAgICAgICBibG9iLFxuICAgICAgICBVUkwsXG4gICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICBwb3B1cDtcbiAgICBjb25zdCBkaXNwb3NpdGlvbiA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJyk7XG4gICAgaWYgKGRpc3Bvc2l0aW9uICYmIGRpc3Bvc2l0aW9uLmluZGV4T2YoJ2F0dGFjaG1lbnQnKSAhPT0gLTEpIHtcbiAgICAgICAgZmlsZW5hbWVSZWdleCA9IC9maWxlbmFtZVteOz1cXG5dKj0oKFsnXCJdKS4qP1xcMnxbXjtcXG5dKikvO1xuICAgICAgICBtYXRjaGVzID0gZmlsZW5hbWVSZWdleC5leGVjKGRpc3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xuICAgICAgICAgICAgZmlsZW5hbWUgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHR5cGUgPSBoZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgYmxvYiA9IG5ldyBCbG9iKFtyZXNwb25zZV0sIHsgdHlwZTogdHlwZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBJRSB3b3JrYXJvdW5kIGZvciBcIkhUTUw3MDA3OiBPbmUgb3IgbW9yZSBibG9iIFVSTHMgd2VyZSByZXZva2VkIGJ5IGNsb3NpbmcgdGhlIGJsb2IgZm9yIHdoaWNoIHRoZXkgd2VyZSBjcmVhdGVkLiBUaGVzZSBVUkxzIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgYXMgdGhlIGRhdGEgYmFja2luZyB0aGUgVVJMIGhhcyBiZWVuIGZyZWVkLlwiXG4gICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckZuKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIFVSTCAgICAgICAgID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xuICAgICAgICBkb3dubG9hZFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAvLyB1c2UgSFRNTDUgYVtkb3dubG9hZF0gYXR0cmlidXRlIHRvIHNwZWNpZnkgZmlsZW5hbWVcbiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBsZXQgcmVhZGVyO1xuICAgICAgICAgICAgLy8gc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhLmRvd25sb2FkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gcmVhZGVyLnJlc3VsdC5yZXBsYWNlKC9eZGF0YTpbXjtdKjsvLCAnZGF0YTphdHRhY2htZW50L2ZpbGU7Jyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwID0gd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcG9wdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gdHJpZ2dlck9uVGltZW91dC5iaW5kKHVuZGVmaW5lZCwgc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYS5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJPblRpbWVvdXQoc3VjY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKGRvd25sb2FkVXJsLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaWdnZXJPblRpbWVvdXQoc3VjY2Vzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgVVJMLnJldm9rZU9iamVjdFVSTChkb3dubG9hZFVybCk7IH0sIDEwMCk7IC8vIGNsZWFudXBcbiAgICB9XG59O1xuXG5jb25zdCBnZXRTZXJ2aWNlID0gKHNlcnZpY2VOYW1lKSA9PiB7XG4gICAgaWYgKCFzZXJ2aWNlTmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlTmFtZTtcbiAgICAvLyBUb2RvOiBTaHViaGFtLCB1bmNvbW1lbnQgYmVsb3cgY29kZVxuICAgIC8qIC8hKiBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgd2hlcmUgbmctYXBwIGlzIGRlZmluZWQgKiEvXG4gICAgIGxldCBhcHBFbCA9IFdNLmVsZW1lbnQoJ1tpZD1uZy1hcHBdJyksIGluamVjdG9yO1xuICAgICBpZiAoYXBwRWwpIHtcbiAgICAgdHJ5IHtcbiAgICAgaW5qZWN0b3IgPSBhcHBFbC5pbmplY3RvcigpOyAvLyBnZXQgdGhlIGFuZ3VsYXIgaW5qZWN0b3JcbiAgICAgaWYgKGluamVjdG9yKSB7XG4gICAgIHJldHVybiBpbmplY3Rvci5nZXQoc2VydmljZU5hbWUpOyAvLyByZXR1cm4gdGhlIHNlcnZpY2VcbiAgICAgfVxuICAgICB9IGNhdGNoIChlKSB7XG4gICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgIH1cbiAgICAgfSovXG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCB0aGUgZm9ybSBkYXRhIHBhcmFtcyBmcm9tIHRoZSBVUkxcbiAqIEBwYXJhbSBxdWVyeVBhcmFtc1xuICogQHBhcmFtIHBhcmFtc1xuICovXG5jb25zdCBzZXRQYXJhbXNGcm9tVVJMID0gKHF1ZXJ5UGFyYW1zLCBwYXJhbXMpID0+IHtcbiAgICBxdWVyeVBhcmFtcyA9IF8uc3BsaXQocXVlcnlQYXJhbXMsICcmJyk7XG4gICAgXy5mb3JFYWNoKHF1ZXJ5UGFyYW1zLCBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgcGFyYW0gPSBfLnNwbGl0KHBhcmFtLCAnPScpO1xuICAgICAgICBwYXJhbXNbcGFyYW1bMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KF8uam9pbihfLnNsaWNlKHBhcmFtLCAxKSwgJz0nKSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFtUb2RvOiBTaHViaGFtXSwgSW1wbGVtZW50IERvd25sb2FkIHRocm91Z2ggSSBmcmFtZVxuICogU2ltdWxhdGVzIGZpbGUgZG93bmxvYWQgaW4gYW4gYXBwIHRocm91Z2ggY3JlYXRpbmcgYW5kIHN1Ym1pdHRpbmcgYSBoaWRkZW4gZm9ybSBpbiBET00uXG4gKiBUaGUgYWN0aW9uIHdpbGwgYmUgaW5pdGlhdGVkIHRocm91Z2ggYSBTZXJ2aWNlIFZhcmlhYmxlXG4gKlxuICogUXVlcnkgUGFyYW1zXG4gKiBUaGUgcmVxdWVzdCBwYXJhbXMgbGlrZSBxdWVyeSBwYXJhbXMgYXJlIGFkZGVkIGFzIGhpZGRlbiBpbnB1dCBlbGVtZW50c1xuICpcbiAqIEhlYWRlciBQYXJhbXNcbiAqIFRoZSBoZWFkZXIgcGFyYW1zIGZvciBhIHJlcXVlc3QgYXJlIGFsc28gYWRkZWQgYWxvbmcgd2l0aCBoaWRkZW4gaW5wdXQgZWxlbWVudHMuXG4gKiBUaGlzIGlzIGRvbmUgYXMgaGVhZGVycyBjYW4gbm90IGJlIHNldCBmb3IgYSBmb3JtIFBPU1QgY2FsbCBmcm9tIEphdmFTY3JpcHRcbiAqXG4gKiBGaW5hbGx5LCByZXF1ZXN0IHBhcmFtZXRlcnMgYXJlIHNlbnQgYXMgZm9sbG93czpcbiAqIEZvciBhIEdFVCByZXF1ZXN0LCB0aGUgcmVxdWVzdCBkYXRhIGlzIHNlbnQgYWxvbmcgd2l0aCB0aGUgcXVlcnkgcGFyYW1zLlxuICogRm9yIFBPU1QsIGl0IGlzIHNlbnQgYXMgcmVxdWVzdCBib2R5LlxuICpcbiAqIEBwYXJhbSB2YXJpYWJsZTogdGhlIHZhcmlhYmxlIHRoYXQgaXMgY2FsbGVkIGZyb20gdXNlciBhY3Rpb25cbiAqIEBwYXJhbSByZXF1ZXN0UGFyYW1zIG9iamVjdCBjb25zaXN0aW5nIHRoZSBpbmZvIHRvIGNvbnN0cnVjdCB0aGUgWEhSIHJlcXVlc3QgZm9yIHRoZSBzZXJ2aWNlXG4gKi9cbmNvbnN0IGRvd25sb2FkVGhyb3VnaElmcmFtZSA9IChyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBkYXRhQmluZGluZykgPT4ge1xuICAgIC8vIFRvZG86IFNIdWJoYW06IFVSTCBjb250YWlucyAnLy8nIGluIGJldHdlZW4gd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYXQgdGhlIFVSTCBmb3JtYXRpb24gb25seVxuICAgIGlmIChyZXF1ZXN0UGFyYW1zLnVybFsxXSA9PT0gJy8nICYmIHJlcXVlc3RQYXJhbXMudXJsWzJdID09PSAnLycpIHtcbiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgwLCAxKSArIHJlcXVlc3RQYXJhbXMudXJsLnNsaWNlKDIpO1xuICAgIH1cbiAgICBsZXQgaUZyYW1lRWxlbWVudCxcbiAgICAgICAgZm9ybUVsLFxuICAgICAgICBwYXJhbUVsZW1lbnQsXG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gJycsXG4gICAgICAgIGRhdGE7XG4gICAgY29uc3QgSUZSQU1FX05BTUUgICAgID0gJ2ZpbGVEb3dubG9hZElGcmFtZScsXG4gICAgICAgIEZPUk1fTkFNRSAgICAgICA9ICdmaWxlRG93bmxvYWRGb3JtJyxcbiAgICAgICAgQ09OVEVOVF9UWVBFICAgID0gJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgIHVybCAgICAgICAgICAgICA9IHJlcXVlc3RQYXJhbXMudXJsLFxuICAgICAgICBlbmNUeXBlICAgICAgICAgPSBfLmdldChyZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIENPTlRFTlRfVFlQRSksXG4gICAgICAgIHBhcmFtcyAgICAgICAgICA9IF8ucGlja0J5KHJlcXVlc3RQYXJhbXMuaGVhZGVycywgZnVuY3Rpb24gKHZhbCwga2V5KSB7cmV0dXJuIGtleSAhPT0gQ09OVEVOVF9UWVBFOyB9KTtcbiAgICAvKiBUb2RvOiBzaHViaGFtIDogZGVmaW5lIGdldFNlcnZpY2UgbWV0aG9kXG4gICAgIFdTX0NPTlNUQU5UUyAgICA9IGdldFNlcnZpY2UoJ1dTX0NPTlNUQU5UUycpOyovXG5cbiAgICAvKiBsb29rIGZvciBleGlzdGluZyBpZnJhbWUuIElmIGV4aXN0cywgcmVtb3ZlIGl0IGZpcnN0ICovXG4gICAgaUZyYW1lRWxlbWVudCA9ICQoJyMnICsgSUZSQU1FX05BTUUpO1xuICAgIGlmIChpRnJhbWVFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICBpRnJhbWVFbGVtZW50LmZpcnN0KCkucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlGcmFtZUVsZW1lbnQgPSAkKCc8aWZyYW1lIGlkPVwiJyArIElGUkFNRV9OQU1FICsgJ1wiIG5hbWU9XCInICsgSUZSQU1FX05BTUUgKyAnXCIgY2xhc3M9XCJuZy1oaWRlXCI+PC9pZnJhbWU+Jyk7XG4gICAgZm9ybUVsICAgICAgICA9ICQoJzxmb3JtIGlkPVwiJyArIEZPUk1fTkFNRSArICdcIiBuYW1lPVwiJyArIEZPUk1fTkFNRSArICdcIj48L2Zvcm0+Jyk7XG4gICAgZm9ybUVsLmF0dHIoe1xuICAgICAgICAndGFyZ2V0JyAgOiBpRnJhbWVFbGVtZW50LmF0dHIoJ25hbWUnKSxcbiAgICAgICAgJ2FjdGlvbicgIDogdXJsLFxuICAgICAgICAnbWV0aG9kJyAgOiByZXF1ZXN0UGFyYW1zLm1ldGhvZCxcbiAgICAgICAgJ2VuY3R5cGUnOiAhKF8uaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmRhdGEpICYmIF8uaXNFbXB0eShxdWVyeVBhcmFtcykpID8gZW5jVHlwZSA6IFdTX0NPTlNUQU5UUy5DT05URU5UX1RZUEVTLk1VTFRJUEFSVF9GT1JNREFUQVxuICAgIH0pO1xuXG4gICAgLyogcHJvY2VzcyBxdWVyeSBwYXJhbXMsIGFwcGVuZCBhIGhpZGRlbiBpbnB1dCBlbGVtZW50IGluIHRoZSBmb3JtIGFnYWluc3QgZWFjaCBwYXJhbSAqL1xuICAgIHF1ZXJ5UGFyYW1zICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZignPycpICsgMSkgOiAnJztcbiAgICBxdWVyeVBhcmFtcyArPSBlbmNUeXBlID09PSBXU19DT05TVEFOVFMuQ09OVEVOVF9UWVBFUy5GT1JNX1VSTF9FTkNPREVEID8gKChxdWVyeVBhcmFtcyA/ICcmJyA6ICcnKSArIHJlcXVlc3RQYXJhbXMuZGF0YVBhcmFtcykgOiAnJztcblxuICAgIC8vIEZvciBOb24gYm9keSBtZXRob2RzIG9ubHksIHNldCB0aGUgaW5wdXQgZmllbGRzIGZyb20gcXVlcnkgcGFyYW1ldGVyc1xuICAgIGlmIChfLmluY2x1ZGVzKFdTX0NPTlNUQU5UUy5OT05fQk9EWV9IVFRQX01FVEhPRFMsIF8udG9VcHBlcihyZXF1ZXN0UGFyYW1zLm1ldGhvZCkpKSB7XG4gICAgICAgIHNldFBhcmFtc0Zyb21VUkwocXVlcnlQYXJhbXMsIHBhcmFtcyk7IC8vIFNldCBwYXJhbXMgZm9yIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkocmVxdWVzdFBhcmFtcy5kYXRhKSkge1xuICAgICAgICBzZXRQYXJhbXNGcm9tVVJMKHJlcXVlc3RQYXJhbXMuZGF0YSwgcGFyYW1zKTsvLyBTZXQgcGFyYW1zIGZvciByZXF1ZXN0IGRhdGFcbiAgICAgICAgZGF0YSA9IHBhcmFtcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gZGF0YUJpbmRpbmc7XG4gICAgfVxuICAgIF8uZm9yRWFjaChkYXRhLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgcGFyYW1FbGVtZW50ID0gJCgnPGlucHV0IHR5cGU9XCJoaWRkZW5cIj4nKTtcbiAgICAgICAgcGFyYW1FbGVtZW50LmF0dHIoe1xuICAgICAgICAgICAgJ25hbWUnICA6IGtleSxcbiAgICAgICAgICAgICd2YWx1ZScgOiB2YWxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvcm1FbC5hcHBlbmQocGFyYW1FbGVtZW50KTtcbiAgICB9KTtcblxuICAgIC8qIGFwcGVuZCBmb3JtIHRvIGlGcmFtZSBhbmQgaUZyYW1lIHRvIHRoZSBkb2N1bWVudCBhbmQgc3VibWl0IHRoZSBmb3JtICovXG4gICAgJCgnYm9keScpLmFwcGVuZChpRnJhbWVFbGVtZW50KTtcblxuICAgIC8vIHRpbWVvdXQgZm9yIElFIDEwLCBpZnJhbWVFbGVtZW50LmNvbnRlbnRzKCkgaXMgZW1wdHkgaW4gSUUgMTAgd2l0aG91dCB0aW1lb3V0XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQuY29udGVudHMoKS5maW5kKCdib2R5JykuYXBwZW5kKGZvcm1FbCk7XG4gICAgICAgIGZvcm1FbC5zdWJtaXQoKTtcbiAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MpO1xuICAgIH0sIDEwMCk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGFuIFhIUiBjYWxsIGFnYWluc3QgdGhlIGNvbmZpZ1xuICogdGhlIHJlc3BvbnNlIGlzIGNvbnZlcnRlZCBpbnRvIGEgYmxvYiB1cmwsIHdoaWNoIGlzIGFzc2lnbmVkIHRvIHRoZSBzcmMgYXR0cmlidXRlIG9mIGFuIGFuY2hvciBlbGVtZW50IHdpdGggZG93bmxvYWQ9dHJ1ZVxuICogYSBjbGljayBpcyBzaW11bGF0ZWQgb24gdGhlIGFuY2hvciB0byBkb3dubG9hZCB0aGUgZmlsZVxuICogQHBhcmFtIGNvbmZpZ1xuICogQHBhcmFtIHN1Y2Nlc3NcbiAqIEBwYXJhbSBlcnJvclxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hBbmNob3IgPSAoY29uZmlnLCBzdWNjZXNzLCBlcnJvcikgPT4ge1xuICAgIGNvbnN0IHVybCAgICAgPSBjb25maWcudXJsLFxuICAgICAgICBtZXRob2QgID0gY29uZmlnLm1ldGhvZCxcbiAgICAgICAgZGF0YSAgICA9IGNvbmZpZy5kYXRhUGFyYW1zIHx8IGNvbmZpZy5kYXRhLFxuICAgICAgICBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnM7XG5cbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xuXG4gICAgLy8gVG9kbzogUmVwbGFjZSBodHRwIHdpdGggZ2V0U2VydmljZVxuICAgIGh0dHBTZXJ2aWNlLnNlbmQoe1xuICAgICAgICAndGFyZ2V0JyA6ICdXZWJTZXJ2aWNlJyxcbiAgICAgICAgJ2FjdGlvbicgOiAnaW52b2tlUnVudGltZVJlc3RDYWxsJyxcbiAgICAgICAgJ21ldGhvZCcgOiBtZXRob2QsXG4gICAgICAgICd1cmwnICAgIDogdXJsLFxuICAgICAgICAnaGVhZGVycyc6IGhlYWRlcnMsXG4gICAgICAgICdkYXRhJyAgIDogZGF0YSxcbiAgICAgICAgJ3Jlc3BvbnNlVHlwZSc6ICdhcnJheWJ1ZmZlcidcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZWZyb21SZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZS5oZWFkZXJzLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgICAgIH0sIDkwMCk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0cmlnZ2VyRm4oZXJyb3IsIGVycik7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIGFwcGVuZHMgYSB0aW1lc3RhbXAgb24gdGhlIHBhc3NlZCBmaWxlbmFtZSB0byBwcmV2ZW50IGNhY2hpbmdcbiAqIHJldHVybnMgdGhlIG1vZGlmaWVkIGZpbGUgbmFtZVxuICogQHBhcmFtIGZpbGVOYW1lXG4gKiBAcGFyYW0gZXhwb3J0Rm9ybWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRNb2RpZmllZEZpbGVOYW1lID0gKGZpbGVOYW1lLCBleHBvcnRGb3JtYXQpID0+IHtcbiAgICBsZXQgZmlsZUV4dGVuc2lvbjtcbiAgICBjb25zdCBjdXJyZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9IGV4cG9ydFR5cGVzTWFwW2V4cG9ydEZvcm1hdF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9ICcuJyArIF8ubGFzdChfLnNwbGl0KGZpbGVOYW1lLCAnLicpKTtcbiAgICAgICAgZmlsZU5hbWUgPSBfLnJlcGxhY2UoZmlsZU5hbWUsIGZpbGVFeHRlbnNpb24sICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVOYW1lICsgJ18nICsgY3VycmVudFRpbWVzdGFtcCArIGZpbGVFeHRlbnNpb247XG59O1xuXG5jb25zdCBnZXRDb29raWVCeU5hbWUgPSAobmFtZSkgPT4ge1xuICAgIC8vIFRvZG86IFNodWJoYW0gSW1wbGVtZW50IGNvb2tpZSBuYXRpdmUganNcbiAgICByZXR1cm4gJ2Nvb2tpZSc7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29va2llVmFsdWUgaWYgeHNyZiBpcyBlbmFibGVkLlxuICogSW4gZGV2aWNlLCB4c3JmIGNvb2tpZSBpcyBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICogQHJldHVybnMgeHNyZiBjb29raWUgdmFsdWVcbiAqL1xuY29uc3QgaXNYc3JmRW5hYmxlZCA9ICgpID0+IHtcbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKENPTlNUQU5UUy5YU1JGX0NPT0tJRV9OQU1FKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgbm9kZSBmb3IgYSBiaW5kIG9iamVjdCwgd2hlcmUgdGhlIHZhbHVlIGhhcyB0byBiZSB1cGRhdGVkXG4gKiBvYmoudGFyZ2V0ID0gXCJhXCJcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXRPYmogPSAob2JqLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0ID0gb2JqLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0T2JqO1xuICAgIGNvbnN0IHJvb3ROb2RlID0gdmFyaWFibGVbcm9vdF07XG4gICAgaWYgKERPVF9FWFBSX1JFWC50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnN1YnN0cigwLCB0YXJnZXQubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIGlmIChvYmoudGFyZ2V0ID09PSByb290KSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSB2YXJpYWJsZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IGZpbmRWYWx1ZU9mKHJvb3ROb2RlLCB0YXJnZXQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE9iajtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IGZvciB0aGUgdGFyZ2V0IG9iamVjdFxuICogdGhlIGNvbXB1dGVkIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCBhZ2FpbnN0IHRoaXMga2V5IGluIHRoZSB0YXJnZXRPYmplY3QoY29tcHV0ZWQgYnkgZ2V0VGFyZ2V0T2JqKCkpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcmVnZXhcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXROb2RlS2V5ID0gKHRhcmdldCkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0Tm9kZUtleTtcbiAgICBpZiAoRE9UX0VYUFJfUkVYLnRlc3QodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnJlcGxhY2UoL14oXFxbW1wiJ10pfChbXCInXVxcXSkkL2csICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnNwbGl0KCcuJykucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXROb2RlS2V5O1xufTtcblxuY29uc3Qgc2V0VmFsdWVUb05vZGUgPSAodGFyZ2V0LCBvYmosIHJvb3QsIHZhcmlhYmxlLCB2YWx1ZSwgbm9VcGRhdGU/KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgdGFyZ2V0T2JqID0gZ2V0VGFyZ2V0T2JqKG9iaiwgcm9vdCwgdmFyaWFibGUpO1xuICAgIHZhbHVlID0gIV8uaXNVbmRlZmluZWQodmFsdWUpID8gdmFsdWUgOiBvYmoudmFsdWU7XG4gICAgLyogc2FuaXR5IGNoZWNrLCB1c2VyIGNhbiBiaW5kIHBhcmVudCBub2RlcyB0byBub24tb2JqZWN0IHZhbHVlcywgc28gY2hpbGQgbm9kZSBiaW5kaW5ncyBtYXkgZmFpbCAqL1xuICAgIGlmICh0YXJnZXRPYmopIHtcbiAgICAgICAgdGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlKHRhcmdldE5vZGVLZXksIHZhbHVlLCBvYmoudHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKTtcbn07XG5cbi8qKlxuICogVGhlIG1vZGVsIGludGVybmFsQm91bmROb2RlTWFwIHN0b3JlcyB0aGUgcmVmZXJlbmNlIHRvIGxhdGVzdCBjb21wdXRlZCB2YWx1ZXMgYWdhaW5zdCBpbnRlcm5hbChuZXN0ZWQpIGJvdW5kIG5vZGVzXG4gKiBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgaW50ZXJuYWwgbm9kZSdzIGNvbXB1dGVkIHZhbHVlIGlzIG5vdCBsb3N0LCBvbmNlIGl0cyBwYXJlbnQgbm9kZSdzIHZhbHVlIGlzIGNvbXB1dGVkIGF0IGEgbGF0ZXIgcG9pbnRcbiAqIEUuZy5cbiAqIFZhcmlhYmxlLmVtcGxveWVlVmFyIGhhcyBmb2xsb3dpbmcgYmluZGluZ3NcbiAqIFwiZGF0YUJpbmRpbmdcIjogW1xuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnQuYnVkZ2V0XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuYnVkZ2V0VmFyLmRhdGFTZXRcIlxuICAgICB9LFxuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnRcIixcbiAgICAgICAgIFwidmFsdWVcIjogXCJiaW5kOlZhcmlhYmxlcy5kZXBhcnRtZW50VmFyLmRhdGFTZXRcIlxuICAgICB9XG4gXVxuICogV2hlbiBkZXBhcnRtZW50LmJ1ZGdldCBpcyBjb21wdXRlZCwgZW1wbG95ZWVWYXIuZGF0YVNldCA9IHtcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcImJ1ZGdldFwiOiB7XCJxMVwiOiAxMTExfVxuICogIH1cbiAqIH1cbiAqXG4gKiBXaGVuIGRlcGFydG1lbnQgaXMgY29tcHV0ZWRcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcIm5hbWVcIjogXCJIUlwiLFxuICogICAgICBcImxvY2F0aW9uXCI6IFwiSHlkZXJhYmFkXCJcbiAqICB9XG4gKiBUaGUgYnVkZ2V0IGZpZWxkIChjb21wdXRlZCBlYXJsaWVyKSBpcyBMT1NULlxuICpcbiAqIFRvIGF2b2lkIHRoaXMsIHRoZSBsYXRlc3QgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwgbm9kZXMgKGluIHRoaXMgY2FzZSBkZXBhcnRtZW50LmJ1ZGdldCkgYXJlIHN0b3JlZCBpbiBhIG1hcFxuICogVGhlc2UgdmFsdWVzIGFyZSBhc3NpZ25lZCBiYWNrIHRvIGludGVybmFsIGZpZWxkcyBpZiB0aGUgcGFyZW50IGlzIGNvbXB1dGVkIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudClcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqL1xuY29uc3QgdXBkYXRlSW50ZXJuYWxOb2RlcyA9ICh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgY29uc3QgYm91bmRJbnRlcm5hbE5vZGVzID0gXy5rZXlzKF8uZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290XSkpLFxuICAgICAgICB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpO1xuICAgIGxldCBpbnRlcm5hbE5vZGVzO1xuICAgIGZ1bmN0aW9uIGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKGJvdW5kSW50ZXJuYWxOb2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXRlciBjb25kaXRpb24gaW4gY2hlY2sgKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgaXMgc3BlY2lmaWNhbGx5IGZvciBsaXZlIHZhcmlhYmxlIG9mIGluc2VydC91cGRhdGUgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiAobm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSAmJiBfLmluY2x1ZGVzKG5vZGUsIHRhcmdldE5vZGVLZXkpKSB8fCAoKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgJiYgbm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcm5hbE5vZGVzID0gZmluZEludGVybmFsTm9kZUJvdW5kKCk7XG4gICAgaWYgKChpbnRlcm5hbE5vZGVzLmxlbmd0aCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZShub2RlLCB7dGFyZ2V0OiBub2RlfSwgcm9vdCwgdmFyaWFibGUsIF8uZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCBub2RlXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIE5ldyBJbXBsZW1lbnRhdGlvbiAoRGF0YUJpbmRpbmcgRmxhdCBTdHJ1Y3R1cmUgd2l0aCB4LXBhdGggdGFyZ2V0cylcbiAqIHByb2Nlc3NlcyBhIGRhdGFCaW5kaW5nIG9iamVjdCwgaWYgYm91bmQgdG8gZXhwcmVzc2lvbiwgd2F0Y2hlcyBvdmVyIGl0LCBlbHNlIGFzc2lnbnMgdmFsdWUgdG8gdGhlIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBvYmogZGF0YUJpbmRpbmcgb2JqZWN0XG4gKiBAcGFyYW0gc2NvcGUgc2NvcGUgb2YgdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gcm9vdCByb290IG5vZGUgc3RyaW5nIChkYXRhQmluZGluZyBmb3IgYWxsIHZhcmlhYmxlcywgZGF0YVNldCBmb3Igc3RhdGljIHZhcmlhYmxlKVxuICogQHBhcmFtIHZhcmlhYmxlIHZhcmlhYmxlIG9iamVjdFxuICovXG5jb25zdCBwcm9jZXNzQmluZE9iamVjdCA9IChvYmosIHNjb3BlLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9iai50YXJnZXQsXG4gICAgICAgIHRhcmdldE9iaiA9IGdldFRhcmdldE9iaihvYmosIHJvb3QsIHZhcmlhYmxlKSxcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgcnVuTW9kZSA9IHRydWU7XG4gICAgY29uc3QgZGVzdHJveUZuID0gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIgPyBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lci5iaW5kKHNjb3BlKSA6IF8ubm9vcDtcblxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoKG9iai52YWx1ZSwgJ2JpbmQ6JykpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICAgICAgICAgIGlmICgobmV3VmFsID09PSBvbGRWYWwgJiYgXy5pc1VuZGVmaW5lZChuZXdWYWwpKSB8fCAoXy5pc1VuZGVmaW5lZChuZXdWYWwpICYmICghXy5pc1VuZGVmaW5lZChvbGRWYWwpIHx8ICFfLmlzVW5kZWZpbmVkKHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2xvbmluZyBmb3IgYmxvYiBjb2x1bW5cbiAgICAgICAgICAgIGlmICghXy5pbmNsdWRlcyhbJ2Jsb2InLCAnZmlsZSddLCBvYmoudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBnZXRDbG9uZWRPYmplY3QobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgbmV3VmFsKTsgLy8gY2xvbmluZyBuZXdWYWwgdG8ga2VlcCB0aGUgc291cmNlIGNsZWFuXG5cbiAgICAgICAgICAgIGlmIChydW5Nb2RlKSB7XG4gICAgICAgICAgICAgICAgLypzZXQgdGhlIGludGVybmFsIGJvdW5kIG5vZGUgbWFwIHdpdGggdGhlIGxhdGVzdCB1cGRhdGVkIHZhbHVlKi9cbiAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsQm91bmROb2RlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF8uc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCB0YXJnZXRdLCBuZXdWYWwpO1xuICAgICAgICAgICAgICAgIC8qdXBkYXRlIHRoZSBpbnRlcm5hbCBub2RlcyBhZnRlciBpbnRlcm5hbCBub2RlIG1hcCBpcyBzZXQqL1xuICAgICAgICAgICAgICAgIGlmIChfLmlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJuYWxOb2Rlcyh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRlc3Ryb3lGbigkd2F0Y2gob2JqLnZhbHVlLnJlcGxhY2UoJ2JpbmQ6JywgJycpLCBzY29wZSwge30sIGxpc3RlbmVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB2YXJpYWJsZS5pc011dGVkKSk7XG4gICAgfSBlbHNlIGlmICghXy5pc1VuZGVmaW5lZChvYmoudmFsdWUpKSB7XG4gICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgb2JqLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHJ1bk1vZGUgJiYgcm9vdCAhPT0gdGFyZ2V0Tm9kZUtleSkge1xuICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfLnNldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgdGFyZ2V0XSwgb2JqLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBVQkxJQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvL1xuXG4vKipcbiAqIEluaXRpYWxpemVzIHdhdGNoZXJzIGZvciBiaW5kaW5nIGV4cHJlc3Npb25zIGNvbmZpZ3VyZWQgaW4gdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEBwYXJhbSBjb250ZXh0LCBzY29wZSBjb250ZXh0IGluIHdoaWNoIHRoZSB2YXJpYWJsZSBleGlzdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5kU291cmNlLCAgdGhlIGZpZWxkIGluIHZhcmlhYmxlIHdoZXJlIHRoZSBkYXRhYmluZGluZ3MgYXJlIGNvbmZpZ3VyZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3QgdmFyaWFibGVzLCBpdCB3aWxsIGJlICdkYXRhQmluZGluZycsIGhlbmNlIGRlZmF1bHQgZmFsbGJhY2sgaXMgdG8gJ2RhdGFCaW5kaW5nJ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc29tZSBpdCBjYW4gYmUgJ2RhdGFTZXQnIGFuZCBoZW5jZSB3aWxsIGJlIHBhc3NlZCBhcyBwYXJhbVxuICogQHBhcmFtIHtzdHJpbmd9IGJpbmRUYXJnZXQsIHRoZSBvYmplY3QgZmllbGQgaW4gdmFyaWFibGUgd2hlcmUgdGhlIGNvbXB1dGVkIGJpbmRpbmdzIHdpbGwgYmUgc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzQmluZGluZyA9ICh2YXJpYWJsZTogYW55LCBjb250ZXh0OiBhbnksIGJpbmRTb3VyY2U/OiBzdHJpbmcsIGJpbmRUYXJnZXQ/OiBzdHJpbmcpID0+IHtcbiAgICBiaW5kU291cmNlID0gYmluZFNvdXJjZSB8fCAnZGF0YUJpbmRpbmcnO1xuICAgIGJpbmRUYXJnZXQgPSBiaW5kVGFyZ2V0IHx8ICdkYXRhQmluZGluZyc7XG5cbiAgICBjb25zdCBiaW5kTWFwID0gdmFyaWFibGVbYmluZFNvdXJjZV07XG4gICAgdmFyaWFibGVbYmluZFNvdXJjZV0gPSB7fTtcbiAgICB2YXJpYWJsZVsnX2JpbmQnICsgYmluZFNvdXJjZV0gPSBiaW5kTWFwO1xuICAgIGlmICghYmluZE1hcCB8fCAhXy5pc0FycmF5KGJpbmRNYXApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmluZE1hcC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIC8qIGZvciBzdGF0aWMgdmFyaWFibGUgY2hhbmdlIHRoZSBiaW5kaW5nIHdpdGggdGFyZ2V0ICdkYXRhQmluZGluZycgdG8gJ2RhdGFTZXQnLCBhcyB0aGUgcmVzdWx0cyBoYXZlIHRvIHJlZmxlY3QgZGlyZWN0bHkgaW4gdGhlIGRhdGFTZXQgKi9cbiAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uVmFyaWFibGUnICYmIG5vZGUudGFyZ2V0ID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICBub2RlLnRhcmdldCA9ICdkYXRhU2V0JztcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQmluZE9iamVjdChub2RlLCBjb250ZXh0LCBiaW5kVGFyZ2V0LCB2YXJpYWJsZSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIERvd25sb2FkcyBhIGZpbGUgaW4gdGhlIGJyb3dzZXIuXG4gKiBUd28gbWV0aG9kcyB0byBkbyBzbywgbmFtZWx5OlxuICogMS4gZG93bmxvYWRUaHJvdWdoQW5jaG9yLCBjYWxsZWQgaWZcbiAqICAgICAgLSBpZiBhIGhlYWRlciBpcyB0byBiZSBwYXNzZWRcbiAqICAgICAgT1JcbiAqICAgICAgLSBpZiBzZWN1cml0eSBpcyBPTiBhbmQgWFNSRiB0b2tlbiBpcyB0byBiZSBzZW50IGFzIHdlbGxcbiAqIE5PVEU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgdmVyc2lvbiAxMC4wIGFuZCBiZWxvd1xuICpcbiAqIDIuIGRvd25sb2FkVGhyb3VnaElmcmFtZVxuICogICAgICAtIHRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBicm93c2VycyBhbmQgdXNlcyBhbiBpZnJhbWUgdG8gZG93bmxhZCB0aGUgZmlsZS5cbiAqIEBwYXJhbSByZXF1ZXN0UGFyYW1zIHJlcXVlc3QgcGFyYW1zIG9iamVjdFxuICogQHBhcmFtIGZpbGVOYW1lIHJlcHJlc2VudHMgdGhlIGZpbGUgbmFtZVxuICogQHBhcmFtIGV4cG9ydEZvcm1hdCBkb3dubG9hZGVkIGZpbGUgZm9ybWF0XG4gKiBAcGFyYW0gc3VjY2VzcyBzdWNjZXNzIGNhbGxiYWNrXG4gKiBAcGFyYW0gZXJyb3IgZXJyb3IgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IHNpbXVsYXRlRmlsZURvd25sb2FkID0gKHJlcXVlc3RQYXJhbXMsIGZpbGVOYW1lLCBleHBvcnRGb3JtYXQsIHN1Y2Nlc3MsIGVycm9yLCBkYXRhQmluZGluZykgPT4ge1xuICAgIC8qc3VjY2VzcyBhbmQgZXJyb3IgY2FsbGJhY2tzIGFyZSBleGVjdXRlZCBpbmNhc2Ugb2YgZG93bmxvYWRUaHJvdWdoQW5jaG9yXG4gICAgIER1ZSB0byB0ZWNobmljYWwgbGltaXRhdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgaW5jYXNlIG9mIGlmcmFtZSovXG4gICAgaWYgKENPTlNUQU5UUy5oYXNDb3Jkb3ZhKSB7XG4gICAgICAgIGxldCBmaWxlRXh0ZW5zaW9uO1xuICAgICAgICBpZiAoZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICBmaWxlRXh0ZW5zaW9uID0gZXhwb3J0VHlwZXNNYXBbZXhwb3J0Rm9ybWF0XTtcbiAgICAgICAgfVxuICAgICAgICBhcHBNYW5hZ2VyLm5vdGlmeSgnZGV2aWNlLWZpbGUtZG93bmxvYWQnLCB7IHVybDogcmVxdWVzdFBhcmFtcy51cmwsIG5hbWU6IGZpbGVOYW1lLCBleHRlbnNpb246IGZpbGVFeHRlbnNpb24sIGhlYWRlcnM6IHJlcXVlc3RQYXJhbXMuaGVhZGVycywgc3VjY2Vzc0NiOiBzdWNjZXNzLCBlcnJvckNiOiBlcnJvcn0pO1xuICAgIH0gZWxzZSBpZiAoIV8uaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMpIHx8IGlzWHNyZkVuYWJsZWQoKSkge1xuICAgICAgICBkb3dubG9hZFRocm91Z2hBbmNob3IocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaElmcmFtZShyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBkYXRhQmluZGluZyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBzZXRzIHRoZSB2YWx1ZSBhZ2FpbnN0IHBhc3NlZCBrZXkgb24gdGhlIFwiaW5wdXRGaWVsZHNcIiBvYmplY3QgaW4gdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gdGFyZ2V0T2JqOiB0aGUgb2JqZWN0IGluIHdoaWNoIHRoZSBrZXksIHZhbHVlIGlzIHRvIGJlIHNldFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcGFyYW0ga2V5OiBjYW4gYmU6XG4gKiAgLSBhIHN0cmluZyBlLmcuIFwidXNlcm5hbWVcIlxuICogIC0gYW4gb2JqZWN0LCBlLmcuIHtcInVzZXJuYW1lXCI6IFwiam9oblwiLCBcInNzblwiOiBcIjExMTExXCJ9XG4gKiBAcGFyYW0gdmFsXG4gKiAtIGlmIGtleSBpcyBzdHJpbmcsIHRoZSB2YWx1ZSBhZ2FpbnN0IGl0IChmb3IgdGhhdCBkYXRhIHR5cGUpXG4gKiAtIGlmIGtleSBpcyBvYmplY3QsIG5vdCByZXF1aXJlZFxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRJbnB1dCA9ICh0YXJnZXRPYmo6IGFueSwga2V5OiBhbnksIHZhbDogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICB0YXJnZXRPYmogPSB0YXJnZXRPYmogfHwge307XG4gICAgbGV0IGtleXMsXG4gICAgICAgIGxhc3RLZXksXG4gICAgICAgIHBhcmFtT2JqID0ge307XG5cbiAgICAvLyBjb250ZW50IHR5cGUgY2hlY2tcbiAgICBpZiAoXy5pc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICAgICAgdmFsID0gZ2V0QmxvYih2YWwsIG9wdGlvbnMuY29udGVudFR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICB2YWwgPSBfLmlzTnVtYmVyKHZhbCkgPyB2YWwgOiBwYXJzZUludCh2YWwsIDEwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IGl0c2VsZlxuICAgICAgICBwYXJhbU9iaiA9IGtleTtcbiAgICB9IGVsc2UgaWYgKGtleS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICAvLyBjaGVjayBmb3IgJy4nIGluIGtleSBlLmcuICdlbXBsb3llZS5kZXBhcnRtZW50J1xuICAgICAgICBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgIGxhc3RLZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICAvLyBGaW5kaW5nIHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGtleVxuICAgICAgICB0YXJnZXRPYmogPSBmaW5kVmFsdWVPZih0YXJnZXRPYmosIGtleXMuam9pbignLicpLCB0cnVlKTtcbiAgICAgICAga2V5ID0gbGFzdEtleTtcbiAgICAgICAgcGFyYW1PYmpba2V5XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbU9ialtrZXldID0gdmFsO1xuICAgIH1cblxuICAgIF8uZm9yRWFjaChwYXJhbU9iaiwgZnVuY3Rpb24gKHBhcmFtVmFsLCBwYXJhbUtleSkge1xuICAgICAgICB0YXJnZXRPYmpbcGFyYW1LZXldID0gcGFyYW1WYWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldE9iajtcbn07XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmIEhUTUw1IEZpbGUgQVBJIGlzIGF2YWlsYWJsZSBlbHNlIGZhbHNlXG4gKiBAcmV0dXJucyB7e3Byb3RvdHlwZTogQmxvYjsgbmV3KGJsb2JQYXJ0cz86IGFueVtdLCBvcHRpb25zPzogQmxvYlByb3BlcnR5QmFnKTogQmxvYn19XG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVVcGxvYWRTdXBwb3J0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IpO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhck9yZGVyXG4gKiBAcGFyYW0gb3B0aW9uc09yZGVyXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXZhbHVhdGVkT3JkZXJCeSA9ICh2YXJPcmRlciwgb3B0aW9uc09yZGVyKSA9PiB7XG4gICAgbGV0IG9wdGlvbkZpZWxkcyxcbiAgICAgICAgdmFyT3JkZXJCeTtcbiAgICAvLyBJZiBvcHRpb25zIG9yZGVyIGJ5IGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gdmFyaWFibGUgb3JkZXJcbiAgICBpZiAoIW9wdGlvbnNPcmRlciB8fCBfLmlzRW1wdHkob3B0aW9uc09yZGVyKSkge1xuICAgICAgICByZXR1cm4gdmFyT3JkZXI7XG4gICAgfVxuICAgIC8vIElmIHZhcmlhYmxlIG9yZGVyIGJ5IGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gb3B0aW9ucyBvcmRlclxuICAgIGlmICghdmFyT3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnNPcmRlcjtcbiAgICB9XG4gICAgLy8gSWYgYm90aCBhcmUgcHJlc2VudCwgY29tYmluZSB0aGUgb3B0aW9ucyBvcmRlciBhbmQgdmFyaWFibGUgb3JkZXIsIHdpdGggb3B0aW9ucyBvcmRlciBhcyBwcmVjZWRlbmNlXG4gICAgdmFyT3JkZXIgICAgID0gXy5zcGxpdCh2YXJPcmRlciwgJywnKTtcbiAgICBvcHRpb25zT3JkZXIgPSBfLnNwbGl0KG9wdGlvbnNPcmRlciwgJywnKTtcbiAgICBvcHRpb25GaWVsZHMgPSBfLm1hcChvcHRpb25zT3JkZXIsIGZ1bmN0aW9uIChvcmRlcikge1xuICAgICAgICByZXR1cm4gXy5zcGxpdChfLnRyaW0ob3JkZXIpLCAnICcpWzBdO1xuICAgIH0pO1xuICAgIC8vIElmIGEgZmllbGQgaXMgcHJlc2VudCBpbiBib3RoIG9wdGlvbnMgYW5kIHZhcmlhYmxlLCByZW1vdmUgdGhlIHZhcmlhYmxlIG9yZGVyYnlcbiAgICBfLnJlbW92ZSh2YXJPcmRlciwgZnVuY3Rpb24gKG9yZGVyQnkpIHtcbiAgICAgICAgcmV0dXJuIF8uaW5jbHVkZXMob3B0aW9uRmllbGRzLCBfLnNwbGl0KF8udHJpbShvcmRlckJ5KSwgJyAnKVswXSk7XG4gICAgfSk7XG4gICAgdmFyT3JkZXJCeSA9IHZhck9yZGVyLmxlbmd0aCA/ICcsJyArIF8uam9pbih2YXJPcmRlciwgJywnKSA6ICcnO1xuICAgIHJldHVybiBfLmpvaW4ob3B0aW9uc09yZGVyLCAnLCcpICsgdmFyT3JkZXJCeTtcbn07XG5cbi8qKlxuICogZm9ybWF0dGluZyB0aGUgZXhwcmVzc2lvbiBhcyByZXF1aXJlZCBieSBiYWNrZW5kIHdoaWNoIHdhcyBlbmNsb3NlZCBieSAkezxleHByZXNzaW9uPn0uXG4gKiBAcGFyYW0gZmllbGREZWZzXG4gKiByZXR1cm5zIGZpZWxkRGVmc1xuICovXG5leHBvcnQgY29uc3QgZm9ybWF0RXhwb3J0RXhwcmVzc2lvbiA9IGZpZWxkRGVmcyA9PiB7XG4gICAgXy5mb3JFYWNoKGZpZWxkRGVmcywgZnVuY3Rpb24gKGZpZWxkRGVmKSB7XG4gICAgICAgIGlmIChmaWVsZERlZi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBmaWVsZERlZi5leHByZXNzaW9uID0gJyR7JyArIGZpZWxkRGVmLmV4cHJlc3Npb24gKyAnfSc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGREZWZzO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlVmFyaWFibGVDYWxsID0gX2ludm9rZTtcblxuY29uc3QgZ2V0RGF0ZVRpbWVGb3JtYXRGb3JUeXBlID0gKHR5cGUpID0+IHtcbiAgICByZXR1cm4gREVGQVVMVF9GT1JNQVRTW18udG9VcHBlcih0eXBlKV07XG59O1xuXG4vLyBGb3JtYXQgdmFsdWUgZm9yIGRhdGV0aW1lIHR5cGVzXG5jb25zdCBfZm9ybWF0RGF0ZSA9IChkYXRlVmFsdWUsIHR5cGUpID0+IHtcbiAgICBsZXQgZXBvY2g7XG4gICAgaWYgKF8uaXNEYXRlKGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgZXBvY2ggPSBkYXRlVmFsdWUuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaXNOYU4oZGF0ZVZhbHVlKSkge1xuICAgICAgICAgICAgZGF0ZVZhbHVlID0gcGFyc2VJbnQoZGF0ZVZhbHVlLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgZXBvY2ggPSBkYXRlVmFsdWUgJiYgbW9tZW50KGRhdGVWYWx1ZSkudmFsdWVPZigpO1xuICAgIH1cbiAgICBpZiAoaXNOYU4oZXBvY2gpICYmIHR5cGUgIT09IERhdGFUeXBlLlRJTUUpIHtcbiAgICAgICAgcmV0dXJuIGVwb2NoO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRGF0YVR5cGUuVElNRVNUQU1QKSB7XG4gICAgICAgIHJldHVybiBlcG9jaDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IERhdGFUeXBlLlRJTUUgJiYgIWVwb2NoKSB7XG4gICAgICAgIGVwb2NoID0gbW9tZW50KG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCkgKyAnICcgKyBkYXRlVmFsdWUpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVWYWx1ZSAmJiBhcHBNYW5hZ2VyLmdldFBpcGUoJ2RhdGUnKS50cmFuc2Zvcm0oZXBvY2gsIGdldERhdGVUaW1lRm9ybWF0Rm9yVHlwZSh0eXBlKSk7XG59O1xuXG4vLyBGdW5jdGlvbiB0byBjb252ZXJ0IHZhbHVlcyBvZiBkYXRlIHRpbWUgdHlwZXMgaW50byBkZWZhdWx0IGZvcm1hdHNcbmV4cG9ydCBjb25zdCBmb3JtYXREYXRlID0gKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgaWYgKF8uaW5jbHVkZXModHlwZSwgJy4nKSkge1xuICAgICAgICB0eXBlID0gXy50b0xvd2VyKGV4dHJhY3RUeXBlKHR5cGUpKTtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIF8ubWFwKHZhbHVlLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Zvcm1hdERhdGUodmFsLCB0eXBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfZm9ybWF0RGF0ZSh2YWx1ZSwgdHlwZSk7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHZhcmlhYmxlIGRhdGEgd2hpY2ggaXMgZW5jb2RlZCBmcm9tIGJhY2tlbmQgYmVmb3JlIHNob3dpbmcgaW4gdGhlIHdpZGdldHMuXG4gKiBJdCB0YWtlcyB2YXJpYWJsZSByZXNwb25zZSBjb250ZW50IGFzIGlucHV0IGFuZCBpdGVyYXRlcyByZWN1cnNpdmVseSxcbiAqIGlmIHRoZSB2YWx1ZSBpcyBzdHJpbmcgdHlwZSB0aGVuIGl0IHdpbGwgZGVjb2RlIHRoZSBkYXRhLlxuICogQHBhcmFtIHJlc3BvbnNlQ29udGVudCAoQXJyYXkgb2Ygb2JqZWN0cylcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY29kZURhdGEgPSAocmVzcG9uc2VDb250ZW50KSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGVudDtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheShyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIF8uZm9yRWFjaChyZXNwb25zZUNvbnRlbnQsIGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKF8uaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gaHRtbERlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChkYXRhLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgXy5pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IGh0bWxEZWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICBfLmZvckVhY2gocmVzcG9uc2VDb250ZW50LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIF8uaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50W2tleV0gPSBodG1sRGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgcmVzcG9uc2VDb250ZW50ID0gaHRtbERlY29kZShyZXNwb25zZUNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZW50O1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGh0bWxEZWNvZGUoaW5wdXQpIHtcbiAgICByZXR1cm4gaGUudW5lc2NhcGUoaW5wdXQpO1xufVxuIl19
@@ -604,12 +604,12 @@ const setParamsFromURL = (queryParams, params) => {
604
604
  * @param variable: the variable that is called from user action
605
605
  * @param requestParams object consisting the info to construct the XHR request for the service
606
606
  */
607
- const downloadThroughIframe = (requestParams, success) => {
607
+ const downloadThroughIframe = (requestParams, success, dataBinding) => {
608
608
  // Todo: SHubham: URL contains '//' in between which should be handled at the URL formation only
609
609
  if (requestParams.url[1] === '/' && requestParams.url[2] === '/') {
610
610
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
611
611
  }
612
- let iFrameElement, formEl, paramElement, queryParams = '';
612
+ let iFrameElement, formEl, paramElement, queryParams = '', data;
613
613
  const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
614
614
  /* Todo: shubham : define getService method
615
615
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
@@ -624,7 +624,7 @@ const downloadThroughIframe = (requestParams, success) => {
624
624
  'target': iFrameElement.attr('name'),
625
625
  'action': url,
626
626
  'method': requestParams.method,
627
- 'enctype': encType
627
+ 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
628
628
  });
629
629
  /* process query params, append a hidden input element in the form against each param */
630
630
  queryParams += url.indexOf('?') !== -1 ? url.substring(url.indexOf('?') + 1) : '';
@@ -633,8 +633,14 @@ const downloadThroughIframe = (requestParams, success) => {
633
633
  if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
634
634
  setParamsFromURL(queryParams, params); // Set params for URL query params
635
635
  }
636
- setParamsFromURL(requestParams.data, params); // Set params for request data
637
- _.forEach(params, function (val, key) {
636
+ if (!_.isEmpty(requestParams.data)) {
637
+ setParamsFromURL(requestParams.data, params); // Set params for request data
638
+ data = params;
639
+ }
640
+ else {
641
+ data = dataBinding;
642
+ }
643
+ _.forEach(data, function (val, key) {
638
644
  paramElement = $('<input type="hidden">');
639
645
  paramElement.attr({
640
646
  'name': key,
@@ -930,7 +936,7 @@ const processBinding = (variable, context, bindSource, bindTarget) => {
930
936
  * @param success success callback
931
937
  * @param error error callback
932
938
  */
933
- const simulateFileDownload = (requestParams, fileName, exportFormat, success, error) => {
939
+ const simulateFileDownload = (requestParams, fileName, exportFormat, success, error, dataBinding) => {
934
940
  /*success and error callbacks are executed incase of downloadThroughAnchor
935
941
  Due to technical limitation cannot be executed incase of iframe*/
936
942
  if (CONSTANTS.hasCordova) {
@@ -944,7 +950,7 @@ const simulateFileDownload = (requestParams, fileName, exportFormat, success, er
944
950
  downloadThroughAnchor(requestParams, success, error);
945
951
  }
946
952
  else {
947
- downloadThroughIframe(requestParams, success);
953
+ downloadThroughIframe(requestParams, success, dataBinding);
948
954
  }
949
955
  };
950
956
  /**