From 9ba44edf38541b3343609238b96f193bde80a748 Mon Sep 17 00:00:00 2001 From: seanmakesgames Date: Fri, 4 Jun 2021 10:54:27 -0700 Subject: [PATCH] Release 1.5 (#385) * bump release version of code * docs updates * bump types version * Update types library usage * update types consumption instructions to be more clear about the version compat * docs updates * Updates to types library version 1.5.2 * Update package-lock.json with new types version * Update package version to latest Co-authored-by: Chris Shin --- docs/assets/js/search.js | 2 +- docs/enums/tableau.analyticsobjecttype.html | 9 +- docs/enums/tableau.columntype.html | 7 +- docs/enums/tableau.dashboardobjecttype.html | 25 +- docs/enums/tableau.datatype.html | 17 +- docs/enums/tableau.daterangetype.html | 15 +- docs/enums/tableau.encodingtype.html | 31 +- docs/enums/tableau.errorcodes.html | 29 +- docs/enums/tableau.extensioncontext.html | 7 +- docs/enums/tableau.extensionmode.html | 7 +- docs/enums/tableau.fieldaggregationtype.html | 81 +- docs/enums/tableau.fieldroletype.html | 9 +- docs/enums/tableau.filterdomaintype.html | 7 +- docs/enums/tableau.filternulloption.html | 9 +- docs/enums/tableau.filtertype.html | 11 +- docs/enums/tableau.filterupdatetype.html | 11 +- .../tableau.includedatavaluesoption.html | 336 + docs/enums/tableau.marktype.html | 25 +- docs/enums/tableau.parametervaluetype.html | 9 +- docs/enums/tableau.periodtype.html | 19 +- docs/enums/tableau.quicktablecalctype.html | 27 +- docs/enums/tableau.selectionupdatetype.html | 9 +- docs/enums/tableau.sheettype.html | 9 +- docs/enums/tableau.sortdirection.html | 7 +- docs/enums/tableau.tableaueventtype.html | 11 +- docs/enums/tableau.trendlinemodeltype.html | 11 +- docs/enums/tableau.zonevisibilitytype.html | 7 +- docs/globals.html | 8 +- docs/interfaces/categoricaldomain.html | 4 +- docs/interfaces/categoricalfilter.html | 23 +- docs/interfaces/column.html | 39 +- docs/interfaces/connectionsummary.html | 8 +- docs/interfaces/dashboard.html | 27 +- docs/interfaces/dashboardcontent.html | 2 +- docs/interfaces/dashboardobject.html | 18 +- docs/interfaces/datasource.html | 31 +- .../datasourceunderlyingdataoptions.html | 59 +- docs/interfaces/datatable.html | 14 +- docs/interfaces/datavalue.html | 10 +- docs/interfaces/dialogoptions.html | 4 +- docs/interfaces/environment.html | 14 +- docs/interfaces/eventlistenermanager.html | 4 +- docs/interfaces/extensions.html | 12 +- docs/interfaces/field.html | 22 +- docs/interfaces/filter.html | 15 +- docs/interfaces/filterchangedevent.html | 10 +- docs/interfaces/filteroptions.html | 2 +- docs/interfaces/getsummarydataoptions.html | 82 +- docs/interfaces/getunderlyingdataoptions.html | 80 +- docs/interfaces/logicaltable.html | 4 +- docs/interfaces/markinfo.html | 6 +- docs/interfaces/markscollection.html | 2 +- docs/interfaces/marksselectedevent.html | 8 +- docs/interfaces/pageddata.html | 12 +- docs/interfaces/paginationoptions.html | 4 +- docs/interfaces/parameter.html | 16 +- docs/interfaces/parameterchangedevent.html | 4 +- .../parameterdomainrestriction.html | 12 +- docs/interfaces/point.html | 4 +- docs/interfaces/rangedomain.html | 6 +- docs/interfaces/rangefilter.html | 23 +- docs/interfaces/rangefilteroptions.html | 6 +- docs/interfaces/rangevalue.html | 6 +- docs/interfaces/relativedatefilter.html | 23 +- docs/interfaces/selectioncriteria.html | 4 +- docs/interfaces/settings.html | 16 +- docs/interfaces/settingschangedevent.html | 4 +- docs/interfaces/sheet.html | 14 +- docs/interfaces/size.html | 4 +- docs/interfaces/tableauerror.html | 2 +- docs/interfaces/tableauevent.html | 2 +- docs/interfaces/tableausheetevent.html | 4 +- docs/interfaces/tableauworksheetevent.html | 6 +- docs/interfaces/tablesummary.html | 8 +- docs/interfaces/ui.html | 4 +- docs/interfaces/worksheet.html | 129 +- docs/modules/tableau.html | 6 +- docs/trex_typescript.md | 2 +- .../tableau.extensions.1.4.0.js | 0 .../tableau.extensions.1.4.0.min.js | 0 lib/tableau.extensions.1.5.0.js | 12599 +++++++++ lib/tableau.extensions.1.5.0.min.js | 2 + lib/tableau.extensions.1.latest.js | 21146 ++++++++-------- lib/tableau.extensions.1.latest.min.js | 4 +- package-lock.json | 12 +- package.json | 4 +- 86 files changed, 24535 insertions(+), 10808 deletions(-) create mode 100644 docs/enums/tableau.includedatavaluesoption.html rename lib/{ => previous}/tableau.extensions.1.4.0.js (100%) rename lib/{ => previous}/tableau.extensions.1.4.0.min.js (100%) create mode 100644 lib/tableau.extensions.1.5.0.js create mode 100644 lib/tableau.extensions.1.5.0.min.js diff --git a/docs/assets/js/search.js b/docs/assets/js/search.js index d34edc37..025869d0 100644 --- a/docs/assets/js/search.js +++ b/docs/assets/js/search.js @@ -1,3 +1,3 @@ var typedoc = typedoc || {}; typedoc.search = typedoc.search || {}; - typedoc.search.data = {"kinds":{"2":"Module","4":"Enumeration","16":"Enumeration member","32":"Variable","256":"Interface","1024":"Property","2048":"Method","65536":"Type literal","4194304":"Type alias"},"rows":[{"id":0,"kind":256,"name":"MarksCollection","url":"interfaces/markscollection.html","classes":"tsd-kind-interface"},{"id":1,"kind":1024,"name":"data","url":"interfaces/markscollection.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarksCollection"},{"id":2,"kind":256,"name":"MarkInfo","url":"interfaces/markinfo.html","classes":"tsd-kind-interface"},{"id":3,"kind":1024,"name":"type","url":"interfaces/markinfo.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarkInfo"},{"id":4,"kind":1024,"name":"color","url":"interfaces/markinfo.html#color","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarkInfo"},{"id":5,"kind":1024,"name":"tupleId","url":"interfaces/markinfo.html#tupleid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarkInfo"},{"id":6,"kind":256,"name":"SelectionCriteria","url":"interfaces/selectioncriteria.html","classes":"tsd-kind-interface"},{"id":7,"kind":1024,"name":"fieldName","url":"interfaces/selectioncriteria.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SelectionCriteria"},{"id":8,"kind":1024,"name":"value","url":"interfaces/selectioncriteria.html#value","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SelectionCriteria"},{"id":9,"kind":256,"name":"RangeValue","url":"interfaces/rangevalue.html","classes":"tsd-kind-interface"},{"id":10,"kind":1024,"name":"min","url":"interfaces/rangevalue.html#min","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeValue"},{"id":11,"kind":1024,"name":"max","url":"interfaces/rangevalue.html#max","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeValue"},{"id":12,"kind":1024,"name":"nullOption","url":"interfaces/rangevalue.html#nulloption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeValue"},{"id":13,"kind":4194304,"name":"CategoricalValue","url":"globals.html#categoricalvalue","classes":"tsd-kind-type-alias"},{"id":14,"kind":256,"name":"Column","url":"interfaces/column.html","classes":"tsd-kind-interface"},{"id":15,"kind":1024,"name":"fieldName","url":"interfaces/column.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":16,"kind":1024,"name":"dataType","url":"interfaces/column.html#datatype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":17,"kind":1024,"name":"isReferenced","url":"interfaces/column.html#isreferenced","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":18,"kind":1024,"name":"index","url":"interfaces/column.html#index","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":19,"kind":256,"name":"DataTable","url":"interfaces/datatable.html","classes":"tsd-kind-interface"},{"id":20,"kind":1024,"name":"name","url":"interfaces/datatable.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":21,"kind":1024,"name":"data","url":"interfaces/datatable.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":22,"kind":1024,"name":"marksInfo","url":"interfaces/datatable.html#marksinfo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":23,"kind":1024,"name":"columns","url":"interfaces/datatable.html#columns","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":24,"kind":1024,"name":"totalRowCount","url":"interfaces/datatable.html#totalrowcount","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":25,"kind":1024,"name":"isTotalRowCountLimited","url":"interfaces/datatable.html#istotalrowcountlimited","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":26,"kind":1024,"name":"isSummaryData","url":"interfaces/datatable.html#issummarydata","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":27,"kind":256,"name":"DataValue","url":"interfaces/datavalue.html","classes":"tsd-kind-interface"},{"id":28,"kind":1024,"name":"value","url":"interfaces/datavalue.html#value","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataValue"},{"id":29,"kind":1024,"name":"nativeValue","url":"interfaces/datavalue.html#nativevalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataValue"},{"id":30,"kind":1024,"name":"formattedValue","url":"interfaces/datavalue.html#formattedvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataValue"},{"id":31,"kind":256,"name":"GetSummaryDataOptions","url":"interfaces/getsummarydataoptions.html","classes":"tsd-kind-interface"},{"id":32,"kind":1024,"name":"ignoreAliases","url":"interfaces/getsummarydataoptions.html#ignorealiases","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":33,"kind":1024,"name":"ignoreSelection","url":"interfaces/getsummarydataoptions.html#ignoreselection","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":34,"kind":256,"name":"GetUnderlyingDataOptions","url":"interfaces/getunderlyingdataoptions.html","classes":"tsd-kind-interface"},{"id":35,"kind":1024,"name":"includeAllColumns","url":"interfaces/getunderlyingdataoptions.html#includeallcolumns","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetUnderlyingDataOptions"},{"id":36,"kind":1024,"name":"maxRows","url":"interfaces/getunderlyingdataoptions.html#maxrows","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetUnderlyingDataOptions"},{"id":37,"kind":1024,"name":"ignoreAliases","url":"interfaces/getunderlyingdataoptions.html#ignorealiases","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":38,"kind":1024,"name":"ignoreSelection","url":"interfaces/getunderlyingdataoptions.html#ignoreselection","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":39,"kind":256,"name":"PaginationOptions","url":"interfaces/paginationoptions.html","classes":"tsd-kind-interface"},{"id":40,"kind":1024,"name":"pageSize","url":"interfaces/paginationoptions.html#pagesize","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PaginationOptions"},{"id":41,"kind":1024,"name":"pageNumber","url":"interfaces/paginationoptions.html#pagenumber","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PaginationOptions"},{"id":42,"kind":256,"name":"PagedData","url":"interfaces/pageddata.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":43,"kind":1024,"name":"data","url":"interfaces/pageddata.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":44,"kind":1024,"name":"pageSize","url":"interfaces/pageddata.html#pagesize","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":45,"kind":1024,"name":"page","url":"interfaces/pageddata.html#page","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":46,"kind":1024,"name":"total","url":"interfaces/pageddata.html#total","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":47,"kind":1024,"name":"hasMoreData","url":"interfaces/pageddata.html#hasmoredata","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":48,"kind":2048,"name":"getNextPageAsync","url":"interfaces/pageddata.html#getnextpageasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"PagedData"},{"id":49,"kind":256,"name":"Filter","url":"interfaces/filter.html","classes":"tsd-kind-interface"},{"id":50,"kind":1024,"name":"worksheetName","url":"interfaces/filter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":51,"kind":1024,"name":"filterType","url":"interfaces/filter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":52,"kind":1024,"name":"fieldName","url":"interfaces/filter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":53,"kind":1024,"name":"fieldId","url":"interfaces/filter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":54,"kind":2048,"name":"getFieldAsync","url":"interfaces/filter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Filter"},{"id":55,"kind":256,"name":"CategoricalFilter","url":"interfaces/categoricalfilter.html","classes":"tsd-kind-interface"},{"id":56,"kind":1024,"name":"isAllSelected","url":"interfaces/categoricalfilter.html#isallselected","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":57,"kind":1024,"name":"appliedValues","url":"interfaces/categoricalfilter.html#appliedvalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":58,"kind":1024,"name":"isExcludeMode","url":"interfaces/categoricalfilter.html#isexcludemode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":59,"kind":2048,"name":"getDomainAsync","url":"interfaces/categoricalfilter.html#getdomainasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":60,"kind":1024,"name":"worksheetName","url":"interfaces/categoricalfilter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":61,"kind":1024,"name":"filterType","url":"interfaces/categoricalfilter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":62,"kind":1024,"name":"fieldName","url":"interfaces/categoricalfilter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":63,"kind":1024,"name":"fieldId","url":"interfaces/categoricalfilter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":64,"kind":2048,"name":"getFieldAsync","url":"interfaces/categoricalfilter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":65,"kind":256,"name":"RangeFilter","url":"interfaces/rangefilter.html","classes":"tsd-kind-interface"},{"id":66,"kind":1024,"name":"minValue","url":"interfaces/rangefilter.html#minvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilter"},{"id":67,"kind":1024,"name":"maxValue","url":"interfaces/rangefilter.html#maxvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilter"},{"id":68,"kind":1024,"name":"includeNullValues","url":"interfaces/rangefilter.html#includenullvalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilter"},{"id":69,"kind":2048,"name":"getDomainAsync","url":"interfaces/rangefilter.html#getdomainasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"RangeFilter"},{"id":70,"kind":1024,"name":"worksheetName","url":"interfaces/rangefilter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":71,"kind":1024,"name":"filterType","url":"interfaces/rangefilter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":72,"kind":1024,"name":"fieldName","url":"interfaces/rangefilter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":73,"kind":1024,"name":"fieldId","url":"interfaces/rangefilter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":74,"kind":2048,"name":"getFieldAsync","url":"interfaces/rangefilter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":75,"kind":256,"name":"RelativeDateFilter","url":"interfaces/relativedatefilter.html","classes":"tsd-kind-interface"},{"id":76,"kind":1024,"name":"anchorDate","url":"interfaces/relativedatefilter.html#anchordate","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":77,"kind":1024,"name":"periodType","url":"interfaces/relativedatefilter.html#periodtype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":78,"kind":1024,"name":"rangeType","url":"interfaces/relativedatefilter.html#rangetype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":79,"kind":1024,"name":"rangeN","url":"interfaces/relativedatefilter.html#rangen","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":80,"kind":1024,"name":"worksheetName","url":"interfaces/relativedatefilter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":81,"kind":1024,"name":"filterType","url":"interfaces/relativedatefilter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":82,"kind":1024,"name":"fieldName","url":"interfaces/relativedatefilter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":83,"kind":1024,"name":"fieldId","url":"interfaces/relativedatefilter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":84,"kind":2048,"name":"getFieldAsync","url":"interfaces/relativedatefilter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":85,"kind":256,"name":"FilterOptions","url":"interfaces/filteroptions.html","classes":"tsd-kind-interface"},{"id":86,"kind":1024,"name":"isExcludeMode","url":"interfaces/filteroptions.html#isexcludemode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"FilterOptions"},{"id":87,"kind":256,"name":"RangeFilterOptions","url":"interfaces/rangefilteroptions.html","classes":"tsd-kind-interface"},{"id":88,"kind":1024,"name":"min","url":"interfaces/rangefilteroptions.html#min","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilterOptions"},{"id":89,"kind":1024,"name":"max","url":"interfaces/rangefilteroptions.html#max","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilterOptions"},{"id":90,"kind":1024,"name":"nullOption","url":"interfaces/rangefilteroptions.html#nulloption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilterOptions"},{"id":91,"kind":256,"name":"RangeDomain","url":"interfaces/rangedomain.html","classes":"tsd-kind-interface"},{"id":92,"kind":1024,"name":"type","url":"interfaces/rangedomain.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeDomain"},{"id":93,"kind":1024,"name":"min","url":"interfaces/rangedomain.html#min","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeDomain"},{"id":94,"kind":1024,"name":"max","url":"interfaces/rangedomain.html#max","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeDomain"},{"id":95,"kind":256,"name":"CategoricalDomain","url":"interfaces/categoricaldomain.html","classes":"tsd-kind-interface"},{"id":96,"kind":1024,"name":"type","url":"interfaces/categoricaldomain.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalDomain"},{"id":97,"kind":1024,"name":"values","url":"interfaces/categoricaldomain.html#values","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalDomain"},{"id":98,"kind":256,"name":"Parameter","url":"interfaces/parameter.html","classes":"tsd-kind-interface"},{"id":99,"kind":1024,"name":"name","url":"interfaces/parameter.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":100,"kind":1024,"name":"currentValue","url":"interfaces/parameter.html#currentvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":101,"kind":1024,"name":"dataType","url":"interfaces/parameter.html#datatype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":102,"kind":1024,"name":"allowableValues","url":"interfaces/parameter.html#allowablevalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":103,"kind":1024,"name":"id","url":"interfaces/parameter.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":104,"kind":2048,"name":"changeValueAsync","url":"interfaces/parameter.html#changevalueasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Parameter"},{"id":105,"kind":2048,"name":"addEventListener","url":"interfaces/parameter.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Parameter"},{"id":106,"kind":2048,"name":"removeEventListener","url":"interfaces/parameter.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Parameter"},{"id":107,"kind":256,"name":"ParameterDomainRestriction","url":"interfaces/parameterdomainrestriction.html","classes":"tsd-kind-interface"},{"id":108,"kind":1024,"name":"type","url":"interfaces/parameterdomainrestriction.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":109,"kind":1024,"name":"allowableValues","url":"interfaces/parameterdomainrestriction.html#allowablevalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":110,"kind":1024,"name":"minValue","url":"interfaces/parameterdomainrestriction.html#minvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":111,"kind":1024,"name":"maxValue","url":"interfaces/parameterdomainrestriction.html#maxvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":112,"kind":1024,"name":"stepSize","url":"interfaces/parameterdomainrestriction.html#stepsize","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":113,"kind":1024,"name":"dateStepPeriod","url":"interfaces/parameterdomainrestriction.html#datestepperiod","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":114,"kind":256,"name":"TableauEvent","url":"interfaces/tableauevent.html","classes":"tsd-kind-interface"},{"id":115,"kind":1024,"name":"type","url":"interfaces/tableauevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauEvent"},{"id":116,"kind":256,"name":"TableauSheetEvent","url":"interfaces/tableausheetevent.html","classes":"tsd-kind-interface"},{"id":117,"kind":1024,"name":"sheet","url":"interfaces/tableausheetevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauSheetEvent"},{"id":118,"kind":1024,"name":"type","url":"interfaces/tableausheetevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauSheetEvent"},{"id":119,"kind":256,"name":"TableauWorksheetEvent","url":"interfaces/tableauworksheetevent.html","classes":"tsd-kind-interface"},{"id":120,"kind":1024,"name":"worksheet","url":"interfaces/tableauworksheetevent.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauWorksheetEvent"},{"id":121,"kind":1024,"name":"sheet","url":"interfaces/tableauworksheetevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauWorksheetEvent"},{"id":122,"kind":1024,"name":"type","url":"interfaces/tableauworksheetevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauWorksheetEvent"},{"id":123,"kind":256,"name":"MarksSelectedEvent","url":"interfaces/marksselectedevent.html","classes":"tsd-kind-interface"},{"id":124,"kind":2048,"name":"getMarksAsync","url":"interfaces/marksselectedevent.html#getmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"MarksSelectedEvent"},{"id":125,"kind":1024,"name":"worksheet","url":"interfaces/marksselectedevent.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"MarksSelectedEvent"},{"id":126,"kind":1024,"name":"sheet","url":"interfaces/marksselectedevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"MarksSelectedEvent"},{"id":127,"kind":1024,"name":"type","url":"interfaces/marksselectedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"MarksSelectedEvent"},{"id":128,"kind":256,"name":"ParameterChangedEvent","url":"interfaces/parameterchangedevent.html","classes":"tsd-kind-interface"},{"id":129,"kind":2048,"name":"getParameterAsync","url":"interfaces/parameterchangedevent.html#getparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"ParameterChangedEvent"},{"id":130,"kind":1024,"name":"type","url":"interfaces/parameterchangedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"ParameterChangedEvent"},{"id":131,"kind":256,"name":"SettingsChangedEvent","url":"interfaces/settingschangedevent.html","classes":"tsd-kind-interface"},{"id":132,"kind":1024,"name":"newSettings","url":"interfaces/settingschangedevent.html#newsettings","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SettingsChangedEvent"},{"id":133,"kind":65536,"name":"__type","url":"interfaces/settingschangedevent.html#newsettings.__type","classes":"tsd-kind-type-literal tsd-parent-kind-property tsd-is-not-exported","parent":"SettingsChangedEvent.newSettings"},{"id":134,"kind":1024,"name":"type","url":"interfaces/settingschangedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SettingsChangedEvent"},{"id":135,"kind":256,"name":"FilterChangedEvent","url":"interfaces/filterchangedevent.html","classes":"tsd-kind-interface"},{"id":136,"kind":1024,"name":"fieldName","url":"interfaces/filterchangedevent.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"FilterChangedEvent"},{"id":137,"kind":2048,"name":"getFilterAsync","url":"interfaces/filterchangedevent.html#getfilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"FilterChangedEvent"},{"id":138,"kind":1024,"name":"worksheet","url":"interfaces/filterchangedevent.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"FilterChangedEvent"},{"id":139,"kind":1024,"name":"sheet","url":"interfaces/filterchangedevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"FilterChangedEvent"},{"id":140,"kind":1024,"name":"type","url":"interfaces/filterchangedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"FilterChangedEvent"},{"id":141,"kind":256,"name":"EventListenerManager","url":"interfaces/eventlistenermanager.html","classes":"tsd-kind-interface"},{"id":142,"kind":2048,"name":"addEventListener","url":"interfaces/eventlistenermanager.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"EventListenerManager"},{"id":143,"kind":2048,"name":"removeEventListener","url":"interfaces/eventlistenermanager.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"EventListenerManager"},{"id":144,"kind":4194304,"name":"TableauEventHandlerFn","url":"globals.html#tableaueventhandlerfn","classes":"tsd-kind-type-alias"},{"id":145,"kind":65536,"name":"__type","url":"globals.html#tableaueventhandlerfn.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-is-not-exported","parent":"TableauEventHandlerFn"},{"id":146,"kind":4194304,"name":"TableauEventUnregisterFn","url":"globals.html#tableaueventunregisterfn","classes":"tsd-kind-type-alias"},{"id":147,"kind":65536,"name":"__type","url":"globals.html#tableaueventunregisterfn.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-is-not-exported","parent":"TableauEventUnregisterFn"},{"id":148,"kind":256,"name":"Dashboard","url":"interfaces/dashboard.html","classes":"tsd-kind-interface"},{"id":149,"kind":1024,"name":"objects","url":"interfaces/dashboard.html#objects","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Dashboard"},{"id":150,"kind":1024,"name":"worksheets","url":"interfaces/dashboard.html#worksheets","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Dashboard"},{"id":151,"kind":2048,"name":"setZoneVisibilityAsync","url":"interfaces/dashboard.html#setzonevisibilityasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Dashboard"},{"id":152,"kind":1024,"name":"name","url":"interfaces/dashboard.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":153,"kind":1024,"name":"sheetType","url":"interfaces/dashboard.html#sheettype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":154,"kind":2048,"name":"findParameterAsync","url":"interfaces/dashboard.html#findparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":155,"kind":1024,"name":"size","url":"interfaces/dashboard.html#size","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":156,"kind":2048,"name":"getParametersAsync","url":"interfaces/dashboard.html#getparametersasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":157,"kind":2048,"name":"addEventListener","url":"interfaces/dashboard.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":158,"kind":2048,"name":"removeEventListener","url":"interfaces/dashboard.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":159,"kind":256,"name":"DashboardObject","url":"interfaces/dashboardobject.html","classes":"tsd-kind-interface"},{"id":160,"kind":1024,"name":"dashboard","url":"interfaces/dashboardobject.html#dashboard","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":161,"kind":1024,"name":"type","url":"interfaces/dashboardobject.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":162,"kind":1024,"name":"position","url":"interfaces/dashboardobject.html#position","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":163,"kind":1024,"name":"size","url":"interfaces/dashboardobject.html#size","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":164,"kind":1024,"name":"worksheet","url":"interfaces/dashboardobject.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":165,"kind":1024,"name":"name","url":"interfaces/dashboardobject.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":166,"kind":1024,"name":"isFloating","url":"interfaces/dashboardobject.html#isfloating","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":167,"kind":1024,"name":"isVisible","url":"interfaces/dashboardobject.html#isvisible","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":168,"kind":1024,"name":"id","url":"interfaces/dashboardobject.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":169,"kind":256,"name":"Point","url":"interfaces/point.html","classes":"tsd-kind-interface"},{"id":170,"kind":1024,"name":"x","url":"interfaces/point.html#x","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Point"},{"id":171,"kind":1024,"name":"y","url":"interfaces/point.html#y","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Point"},{"id":172,"kind":256,"name":"Sheet","url":"interfaces/sheet.html","classes":"tsd-kind-interface"},{"id":173,"kind":1024,"name":"name","url":"interfaces/sheet.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Sheet"},{"id":174,"kind":1024,"name":"sheetType","url":"interfaces/sheet.html#sheettype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Sheet"},{"id":175,"kind":2048,"name":"findParameterAsync","url":"interfaces/sheet.html#findparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Sheet"},{"id":176,"kind":1024,"name":"size","url":"interfaces/sheet.html#size","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Sheet"},{"id":177,"kind":2048,"name":"getParametersAsync","url":"interfaces/sheet.html#getparametersasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Sheet"},{"id":178,"kind":2048,"name":"addEventListener","url":"interfaces/sheet.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Sheet"},{"id":179,"kind":2048,"name":"removeEventListener","url":"interfaces/sheet.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Sheet"},{"id":180,"kind":256,"name":"Size","url":"interfaces/size.html","classes":"tsd-kind-interface"},{"id":181,"kind":1024,"name":"height","url":"interfaces/size.html#height","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Size"},{"id":182,"kind":1024,"name":"width","url":"interfaces/size.html#width","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Size"},{"id":183,"kind":256,"name":"Worksheet","url":"interfaces/worksheet.html","classes":"tsd-kind-interface"},{"id":184,"kind":1024,"name":"parentDashboard","url":"interfaces/worksheet.html#parentdashboard","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Worksheet"},{"id":185,"kind":2048,"name":"applyFilterAsync","url":"interfaces/worksheet.html#applyfilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":186,"kind":2048,"name":"applyRangeFilterAsync","url":"interfaces/worksheet.html#applyrangefilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":187,"kind":2048,"name":"clearFilterAsync","url":"interfaces/worksheet.html#clearfilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":188,"kind":2048,"name":"getDataSourcesAsync","url":"interfaces/worksheet.html#getdatasourcesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":189,"kind":2048,"name":"getFiltersAsync","url":"interfaces/worksheet.html#getfiltersasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":190,"kind":2048,"name":"getHighlightedMarksAsync","url":"interfaces/worksheet.html#gethighlightedmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":191,"kind":2048,"name":"getSelectedMarksAsync","url":"interfaces/worksheet.html#getselectedmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":192,"kind":2048,"name":"getSummaryDataAsync","url":"interfaces/worksheet.html#getsummarydataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":193,"kind":2048,"name":"getUnderlyingDataAsync","url":"interfaces/worksheet.html#getunderlyingdataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":194,"kind":2048,"name":"getUnderlyingTablesAsync","url":"interfaces/worksheet.html#getunderlyingtablesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":195,"kind":2048,"name":"getUnderlyingTableDataAsync","url":"interfaces/worksheet.html#getunderlyingtabledataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":196,"kind":2048,"name":"selectMarksByValueAsync","url":"interfaces/worksheet.html#selectmarksbyvalueasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":197,"kind":2048,"name":"clearSelectedMarksAsync","url":"interfaces/worksheet.html#clearselectedmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":198,"kind":1024,"name":"name","url":"interfaces/worksheet.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":199,"kind":1024,"name":"sheetType","url":"interfaces/worksheet.html#sheettype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":200,"kind":2048,"name":"findParameterAsync","url":"interfaces/worksheet.html#findparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":201,"kind":1024,"name":"size","url":"interfaces/worksheet.html#size","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":202,"kind":2048,"name":"getParametersAsync","url":"interfaces/worksheet.html#getparametersasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":203,"kind":2048,"name":"addEventListener","url":"interfaces/worksheet.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":204,"kind":2048,"name":"removeEventListener","url":"interfaces/worksheet.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":205,"kind":4194304,"name":"ZoneVisibilityMap","url":"globals.html#zonevisibilitymap","classes":"tsd-kind-type-alias"},{"id":206,"kind":256,"name":"DashboardContent","url":"interfaces/dashboardcontent.html","classes":"tsd-kind-interface"},{"id":207,"kind":1024,"name":"dashboard","url":"interfaces/dashboardcontent.html#dashboard","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardContent"},{"id":208,"kind":256,"name":"Environment","url":"interfaces/environment.html","classes":"tsd-kind-interface"},{"id":209,"kind":1024,"name":"apiVersion","url":"interfaces/environment.html#apiversion","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":210,"kind":1024,"name":"context","url":"interfaces/environment.html#context","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":211,"kind":1024,"name":"language","url":"interfaces/environment.html#language","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":212,"kind":1024,"name":"locale","url":"interfaces/environment.html#locale","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":213,"kind":1024,"name":"mode","url":"interfaces/environment.html#mode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":214,"kind":1024,"name":"operatingSystem","url":"interfaces/environment.html#operatingsystem","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":215,"kind":1024,"name":"tableauVersion","url":"interfaces/environment.html#tableauversion","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":216,"kind":256,"name":"Settings","url":"interfaces/settings.html","classes":"tsd-kind-interface"},{"id":217,"kind":2048,"name":"erase","url":"interfaces/settings.html#erase","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":218,"kind":2048,"name":"get","url":"interfaces/settings.html#get","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":219,"kind":2048,"name":"getAll","url":"interfaces/settings.html#getall","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":220,"kind":1024,"name":"isModified","url":"interfaces/settings.html#ismodified","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Settings"},{"id":221,"kind":2048,"name":"saveAsync","url":"interfaces/settings.html#saveasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":222,"kind":2048,"name":"set","url":"interfaces/settings.html#set","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":223,"kind":2048,"name":"addEventListener","url":"interfaces/settings.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Settings"},{"id":224,"kind":2048,"name":"removeEventListener","url":"interfaces/settings.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Settings"},{"id":225,"kind":256,"name":"UI","url":"interfaces/ui.html","classes":"tsd-kind-interface"},{"id":226,"kind":2048,"name":"displayDialogAsync","url":"interfaces/ui.html#displaydialogasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"UI"},{"id":227,"kind":2048,"name":"closeDialog","url":"interfaces/ui.html#closedialog","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"UI"},{"id":228,"kind":256,"name":"DialogOptions","url":"interfaces/dialogoptions.html","classes":"tsd-kind-interface"},{"id":229,"kind":1024,"name":"width","url":"interfaces/dialogoptions.html#width","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DialogOptions"},{"id":230,"kind":1024,"name":"height","url":"interfaces/dialogoptions.html#height","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DialogOptions"},{"id":231,"kind":256,"name":"Extensions","url":"interfaces/extensions.html","classes":"tsd-kind-interface"},{"id":232,"kind":2048,"name":"initializeAsync","url":"interfaces/extensions.html#initializeasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Extensions"},{"id":233,"kind":2048,"name":"initializeDialogAsync","url":"interfaces/extensions.html#initializedialogasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Extensions"},{"id":234,"kind":1024,"name":"dashboardContent","url":"interfaces/extensions.html#dashboardcontent","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":235,"kind":1024,"name":"environment","url":"interfaces/extensions.html#environment","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":236,"kind":1024,"name":"settings","url":"interfaces/extensions.html#settings","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":237,"kind":1024,"name":"ui","url":"interfaces/extensions.html#ui","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":238,"kind":2,"name":"Tableau","url":"modules/tableau.html","classes":"tsd-kind-module"},{"id":239,"kind":4,"name":"ExtensionContext","url":"enums/tableau.extensioncontext.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":240,"kind":16,"name":"Desktop","url":"enums/tableau.extensioncontext.html#desktop","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionContext"},{"id":241,"kind":16,"name":"Server","url":"enums/tableau.extensioncontext.html#server","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionContext"},{"id":242,"kind":4,"name":"ExtensionMode","url":"enums/tableau.extensionmode.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":243,"kind":16,"name":"Authoring","url":"enums/tableau.extensionmode.html#authoring","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionMode"},{"id":244,"kind":16,"name":"Viewing","url":"enums/tableau.extensionmode.html#viewing","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionMode"},{"id":245,"kind":4,"name":"AnalyticsObjectType","url":"enums/tableau.analyticsobjecttype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":246,"kind":16,"name":"Cluster","url":"enums/tableau.analyticsobjecttype.html#cluster","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.AnalyticsObjectType"},{"id":247,"kind":16,"name":"Forecast","url":"enums/tableau.analyticsobjecttype.html#forecast","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.AnalyticsObjectType"},{"id":248,"kind":16,"name":"TrendLine","url":"enums/tableau.analyticsobjecttype.html#trendline","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.AnalyticsObjectType"},{"id":249,"kind":4,"name":"ColumnType","url":"enums/tableau.columntype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":250,"kind":16,"name":"Discrete","url":"enums/tableau.columntype.html#discrete","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ColumnType"},{"id":251,"kind":16,"name":"Continuous","url":"enums/tableau.columntype.html#continuous","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ColumnType"},{"id":252,"kind":4,"name":"DashboardObjectType","url":"enums/tableau.dashboardobjecttype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":253,"kind":16,"name":"Blank","url":"enums/tableau.dashboardobjecttype.html#blank","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":254,"kind":16,"name":"Worksheet","url":"enums/tableau.dashboardobjecttype.html#worksheet","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":255,"kind":16,"name":"QuickFilter","url":"enums/tableau.dashboardobjecttype.html#quickfilter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":256,"kind":16,"name":"ParameterControl","url":"enums/tableau.dashboardobjecttype.html#parametercontrol","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":257,"kind":16,"name":"PageFilter","url":"enums/tableau.dashboardobjecttype.html#pagefilter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":258,"kind":16,"name":"Legend","url":"enums/tableau.dashboardobjecttype.html#legend","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":259,"kind":16,"name":"Title","url":"enums/tableau.dashboardobjecttype.html#title","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":260,"kind":16,"name":"Text","url":"enums/tableau.dashboardobjecttype.html#text","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":261,"kind":16,"name":"Image","url":"enums/tableau.dashboardobjecttype.html#image","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":262,"kind":16,"name":"WebPage","url":"enums/tableau.dashboardobjecttype.html#webpage","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":263,"kind":16,"name":"Extension","url":"enums/tableau.dashboardobjecttype.html#extension","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":264,"kind":4,"name":"DataType","url":"enums/tableau.datatype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":265,"kind":16,"name":"String","url":"enums/tableau.datatype.html#string","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":266,"kind":16,"name":"Int","url":"enums/tableau.datatype.html#int","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":267,"kind":16,"name":"Float","url":"enums/tableau.datatype.html#float","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":268,"kind":16,"name":"Bool","url":"enums/tableau.datatype.html#bool","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":269,"kind":16,"name":"Date","url":"enums/tableau.datatype.html#date","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":270,"kind":16,"name":"DateTime","url":"enums/tableau.datatype.html#datetime","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":271,"kind":16,"name":"Spatial","url":"enums/tableau.datatype.html#spatial","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":272,"kind":4,"name":"DateRangeType","url":"enums/tableau.daterangetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":273,"kind":16,"name":"Last","url":"enums/tableau.daterangetype.html#last","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":274,"kind":16,"name":"LastN","url":"enums/tableau.daterangetype.html#lastn","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":275,"kind":16,"name":"Next","url":"enums/tableau.daterangetype.html#next","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":276,"kind":16,"name":"NextN","url":"enums/tableau.daterangetype.html#nextn","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":277,"kind":16,"name":"Current","url":"enums/tableau.daterangetype.html#current","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":278,"kind":16,"name":"ToDate","url":"enums/tableau.daterangetype.html#todate","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":279,"kind":4,"name":"EncodingType","url":"enums/tableau.encodingtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":280,"kind":16,"name":"Column","url":"enums/tableau.encodingtype.html#column","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":281,"kind":16,"name":"Row","url":"enums/tableau.encodingtype.html#row","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":282,"kind":16,"name":"Page","url":"enums/tableau.encodingtype.html#page","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":283,"kind":16,"name":"Filter","url":"enums/tableau.encodingtype.html#filter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":284,"kind":16,"name":"MarksType","url":"enums/tableau.encodingtype.html#markstype","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":285,"kind":16,"name":"MeasureValues","url":"enums/tableau.encodingtype.html#measurevalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":286,"kind":16,"name":"Color","url":"enums/tableau.encodingtype.html#color","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":287,"kind":16,"name":"Size","url":"enums/tableau.encodingtype.html#size","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":288,"kind":16,"name":"Label","url":"enums/tableau.encodingtype.html#label","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":289,"kind":16,"name":"Detail","url":"enums/tableau.encodingtype.html#detail","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":290,"kind":16,"name":"Tooltip","url":"enums/tableau.encodingtype.html#tooltip","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":291,"kind":16,"name":"Shape","url":"enums/tableau.encodingtype.html#shape","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":292,"kind":16,"name":"Path","url":"enums/tableau.encodingtype.html#path","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":293,"kind":16,"name":"Angle","url":"enums/tableau.encodingtype.html#angle","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":294,"kind":4,"name":"ErrorCodes","url":"enums/tableau.errorcodes.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":295,"kind":16,"name":"APINotInitialized","url":"enums/tableau.errorcodes.html#apinotinitialized","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":296,"kind":16,"name":"VisibilityError","url":"enums/tableau.errorcodes.html#visibilityerror","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":297,"kind":16,"name":"DialogAlreadyOpen","url":"enums/tableau.errorcodes.html#dialogalreadyopen","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":298,"kind":16,"name":"DialogClosedByUser","url":"enums/tableau.errorcodes.html#dialogclosedbyuser","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":299,"kind":16,"name":"InternalError","url":"enums/tableau.errorcodes.html#internalerror","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":300,"kind":16,"name":"InvalidDomainDialog","url":"enums/tableau.errorcodes.html#invaliddomaindialog","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":301,"kind":16,"name":"InvalidParameter","url":"enums/tableau.errorcodes.html#invalidparameter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":302,"kind":16,"name":"MissingFilter","url":"enums/tableau.errorcodes.html#missingfilter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":303,"kind":16,"name":"MissingParameter","url":"enums/tableau.errorcodes.html#missingparameter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":304,"kind":16,"name":"ServerError","url":"enums/tableau.errorcodes.html#servererror","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":305,"kind":16,"name":"SettingSaveInProgress","url":"enums/tableau.errorcodes.html#settingsaveinprogress","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":306,"kind":16,"name":"UnsupportedEventName","url":"enums/tableau.errorcodes.html#unsupportedeventname","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":307,"kind":16,"name":"UnsupportedMethodForDataSourceType","url":"enums/tableau.errorcodes.html#unsupportedmethodfordatasourcetype","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":308,"kind":4,"name":"FieldAggregationType","url":"enums/tableau.fieldaggregationtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":309,"kind":16,"name":"Sum","url":"enums/tableau.fieldaggregationtype.html#sum","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":310,"kind":16,"name":"Avg","url":"enums/tableau.fieldaggregationtype.html#avg","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":311,"kind":16,"name":"Min","url":"enums/tableau.fieldaggregationtype.html#min","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":312,"kind":16,"name":"Max","url":"enums/tableau.fieldaggregationtype.html#max","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":313,"kind":16,"name":"Stdev","url":"enums/tableau.fieldaggregationtype.html#stdev","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":314,"kind":16,"name":"Stdevp","url":"enums/tableau.fieldaggregationtype.html#stdevp","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":315,"kind":16,"name":"Var","url":"enums/tableau.fieldaggregationtype.html#var","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":316,"kind":16,"name":"Varp","url":"enums/tableau.fieldaggregationtype.html#varp","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":317,"kind":16,"name":"Count","url":"enums/tableau.fieldaggregationtype.html#count","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":318,"kind":16,"name":"Countd","url":"enums/tableau.fieldaggregationtype.html#countd","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":319,"kind":16,"name":"Median","url":"enums/tableau.fieldaggregationtype.html#median","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":320,"kind":16,"name":"Attr","url":"enums/tableau.fieldaggregationtype.html#attr","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":321,"kind":16,"name":"None","url":"enums/tableau.fieldaggregationtype.html#none","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":322,"kind":16,"name":"Year","url":"enums/tableau.fieldaggregationtype.html#year","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":323,"kind":16,"name":"Qtr","url":"enums/tableau.fieldaggregationtype.html#qtr","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":324,"kind":16,"name":"Month","url":"enums/tableau.fieldaggregationtype.html#month","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":325,"kind":16,"name":"Day","url":"enums/tableau.fieldaggregationtype.html#day","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":326,"kind":16,"name":"Hour","url":"enums/tableau.fieldaggregationtype.html#hour","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":327,"kind":16,"name":"Minute","url":"enums/tableau.fieldaggregationtype.html#minute","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":328,"kind":16,"name":"Second","url":"enums/tableau.fieldaggregationtype.html#second","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":329,"kind":16,"name":"Week","url":"enums/tableau.fieldaggregationtype.html#week","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":330,"kind":16,"name":"Weekday","url":"enums/tableau.fieldaggregationtype.html#weekday","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":331,"kind":16,"name":"MonthYear","url":"enums/tableau.fieldaggregationtype.html#monthyear","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":332,"kind":16,"name":"Mdy","url":"enums/tableau.fieldaggregationtype.html#mdy","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":333,"kind":16,"name":"End","url":"enums/tableau.fieldaggregationtype.html#end","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":334,"kind":16,"name":"TruncYear","url":"enums/tableau.fieldaggregationtype.html#truncyear","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":335,"kind":16,"name":"TruncQtr","url":"enums/tableau.fieldaggregationtype.html#truncqtr","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":336,"kind":16,"name":"TruncMonth","url":"enums/tableau.fieldaggregationtype.html#truncmonth","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":337,"kind":16,"name":"TruncWeek","url":"enums/tableau.fieldaggregationtype.html#truncweek","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":338,"kind":16,"name":"TruncDay","url":"enums/tableau.fieldaggregationtype.html#truncday","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":339,"kind":16,"name":"TruncHour","url":"enums/tableau.fieldaggregationtype.html#trunchour","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":340,"kind":16,"name":"TruncMinute","url":"enums/tableau.fieldaggregationtype.html#truncminute","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":341,"kind":16,"name":"TruncSecond","url":"enums/tableau.fieldaggregationtype.html#truncsecond","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":342,"kind":16,"name":"Quart1","url":"enums/tableau.fieldaggregationtype.html#quart1","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":343,"kind":16,"name":"Quart3","url":"enums/tableau.fieldaggregationtype.html#quart3","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":344,"kind":16,"name":"Skewness","url":"enums/tableau.fieldaggregationtype.html#skewness","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":345,"kind":16,"name":"Kurtosis","url":"enums/tableau.fieldaggregationtype.html#kurtosis","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":346,"kind":16,"name":"InOut","url":"enums/tableau.fieldaggregationtype.html#inout","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":347,"kind":16,"name":"User","url":"enums/tableau.fieldaggregationtype.html#user","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":348,"kind":4,"name":"FieldRoleType","url":"enums/tableau.fieldroletype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":349,"kind":16,"name":"Dimension","url":"enums/tableau.fieldroletype.html#dimension","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldRoleType"},{"id":350,"kind":16,"name":"Measure","url":"enums/tableau.fieldroletype.html#measure","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldRoleType"},{"id":351,"kind":16,"name":"Unknown","url":"enums/tableau.fieldroletype.html#unknown","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldRoleType"},{"id":352,"kind":4,"name":"FilterType","url":"enums/tableau.filtertype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":353,"kind":16,"name":"Categorical","url":"enums/tableau.filtertype.html#categorical","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":354,"kind":16,"name":"Range","url":"enums/tableau.filtertype.html#range","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":355,"kind":16,"name":"Hierarchical","url":"enums/tableau.filtertype.html#hierarchical","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":356,"kind":16,"name":"RelativeDate","url":"enums/tableau.filtertype.html#relativedate","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":357,"kind":4,"name":"FilterUpdateType","url":"enums/tableau.filterupdatetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":358,"kind":16,"name":"Add","url":"enums/tableau.filterupdatetype.html#add","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":359,"kind":16,"name":"All","url":"enums/tableau.filterupdatetype.html#all","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":360,"kind":16,"name":"Replace","url":"enums/tableau.filterupdatetype.html#replace","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":361,"kind":16,"name":"Remove","url":"enums/tableau.filterupdatetype.html#remove","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":362,"kind":4,"name":"FilterDomainType","url":"enums/tableau.filterdomaintype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":363,"kind":16,"name":"Relevant","url":"enums/tableau.filterdomaintype.html#relevant","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterDomainType"},{"id":364,"kind":16,"name":"Database","url":"enums/tableau.filterdomaintype.html#database","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterDomainType"},{"id":365,"kind":4,"name":"FilterNullOption","url":"enums/tableau.filternulloption.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":366,"kind":16,"name":"NullValues","url":"enums/tableau.filternulloption.html#nullvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterNullOption"},{"id":367,"kind":16,"name":"NonNullValues","url":"enums/tableau.filternulloption.html#nonnullvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterNullOption"},{"id":368,"kind":16,"name":"AllValues","url":"enums/tableau.filternulloption.html#allvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterNullOption"},{"id":369,"kind":4,"name":"MarkType","url":"enums/tableau.marktype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":370,"kind":16,"name":"Bar","url":"enums/tableau.marktype.html#bar","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":371,"kind":16,"name":"Line","url":"enums/tableau.marktype.html#line","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":372,"kind":16,"name":"Area","url":"enums/tableau.marktype.html#area","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":373,"kind":16,"name":"Square","url":"enums/tableau.marktype.html#square","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":374,"kind":16,"name":"Circle","url":"enums/tableau.marktype.html#circle","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":375,"kind":16,"name":"Shape","url":"enums/tableau.marktype.html#shape","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":376,"kind":16,"name":"Text","url":"enums/tableau.marktype.html#text","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":377,"kind":16,"name":"Map","url":"enums/tableau.marktype.html#map","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":378,"kind":16,"name":"Pie","url":"enums/tableau.marktype.html#pie","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":379,"kind":16,"name":"GanttBar","url":"enums/tableau.marktype.html#ganttbar","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":380,"kind":16,"name":"Polygon","url":"enums/tableau.marktype.html#polygon","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":381,"kind":4,"name":"ParameterValueType","url":"enums/tableau.parametervaluetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":382,"kind":16,"name":"All","url":"enums/tableau.parametervaluetype.html#all","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ParameterValueType"},{"id":383,"kind":16,"name":"List","url":"enums/tableau.parametervaluetype.html#list","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ParameterValueType"},{"id":384,"kind":16,"name":"Range","url":"enums/tableau.parametervaluetype.html#range","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ParameterValueType"},{"id":385,"kind":4,"name":"PeriodType","url":"enums/tableau.periodtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":386,"kind":16,"name":"Years","url":"enums/tableau.periodtype.html#years","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":387,"kind":16,"name":"Quarters","url":"enums/tableau.periodtype.html#quarters","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":388,"kind":16,"name":"Months","url":"enums/tableau.periodtype.html#months","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":389,"kind":16,"name":"Weeks","url":"enums/tableau.periodtype.html#weeks","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":390,"kind":16,"name":"Days","url":"enums/tableau.periodtype.html#days","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":391,"kind":16,"name":"Hours","url":"enums/tableau.periodtype.html#hours","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":392,"kind":16,"name":"Minutes","url":"enums/tableau.periodtype.html#minutes","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":393,"kind":16,"name":"Seconds","url":"enums/tableau.periodtype.html#seconds","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":394,"kind":4,"name":"QuickTableCalcType","url":"enums/tableau.quicktablecalctype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":395,"kind":16,"name":"RunningTotal","url":"enums/tableau.quicktablecalctype.html#runningtotal","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":396,"kind":16,"name":"Difference","url":"enums/tableau.quicktablecalctype.html#difference","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":397,"kind":16,"name":"PercentDifference","url":"enums/tableau.quicktablecalctype.html#percentdifference","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":398,"kind":16,"name":"PercentOfTotal","url":"enums/tableau.quicktablecalctype.html#percentoftotal","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":399,"kind":16,"name":"Rank","url":"enums/tableau.quicktablecalctype.html#rank","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":400,"kind":16,"name":"Percentile","url":"enums/tableau.quicktablecalctype.html#percentile","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":401,"kind":16,"name":"MovingAverage","url":"enums/tableau.quicktablecalctype.html#movingaverage","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":402,"kind":16,"name":"YTDTotal","url":"enums/tableau.quicktablecalctype.html#ytdtotal","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":403,"kind":16,"name":"CompoundGrowthRate","url":"enums/tableau.quicktablecalctype.html#compoundgrowthrate","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":404,"kind":16,"name":"YearOverYearGrowth","url":"enums/tableau.quicktablecalctype.html#yearoveryeargrowth","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":405,"kind":16,"name":"YTDGrowth","url":"enums/tableau.quicktablecalctype.html#ytdgrowth","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":406,"kind":16,"name":"Undefined","url":"enums/tableau.quicktablecalctype.html#undefined","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":407,"kind":4,"name":"SelectionUpdateType","url":"enums/tableau.selectionupdatetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":408,"kind":16,"name":"Replace","url":"enums/tableau.selectionupdatetype.html#replace","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SelectionUpdateType"},{"id":409,"kind":16,"name":"Add","url":"enums/tableau.selectionupdatetype.html#add","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SelectionUpdateType"},{"id":410,"kind":16,"name":"Remove","url":"enums/tableau.selectionupdatetype.html#remove","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SelectionUpdateType"},{"id":411,"kind":4,"name":"SheetType","url":"enums/tableau.sheettype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":412,"kind":16,"name":"Dashboard","url":"enums/tableau.sheettype.html#dashboard","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SheetType"},{"id":413,"kind":16,"name":"Story","url":"enums/tableau.sheettype.html#story","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SheetType"},{"id":414,"kind":16,"name":"Worksheet","url":"enums/tableau.sheettype.html#worksheet","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SheetType"},{"id":415,"kind":4,"name":"SortDirection","url":"enums/tableau.sortdirection.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":416,"kind":16,"name":"Increasing","url":"enums/tableau.sortdirection.html#increasing","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SortDirection"},{"id":417,"kind":16,"name":"Decreasing","url":"enums/tableau.sortdirection.html#decreasing","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SortDirection"},{"id":418,"kind":4,"name":"TableauEventType","url":"enums/tableau.tableaueventtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":419,"kind":16,"name":"FilterChanged","url":"enums/tableau.tableaueventtype.html#filterchanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":420,"kind":16,"name":"MarkSelectionChanged","url":"enums/tableau.tableaueventtype.html#markselectionchanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":421,"kind":16,"name":"ParameterChanged","url":"enums/tableau.tableaueventtype.html#parameterchanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":422,"kind":16,"name":"SettingsChanged","url":"enums/tableau.tableaueventtype.html#settingschanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":423,"kind":4,"name":"TrendLineModelType","url":"enums/tableau.trendlinemodeltype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":424,"kind":16,"name":"Linear","url":"enums/tableau.trendlinemodeltype.html#linear","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":425,"kind":16,"name":"Logarithmic","url":"enums/tableau.trendlinemodeltype.html#logarithmic","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":426,"kind":16,"name":"Exponential","url":"enums/tableau.trendlinemodeltype.html#exponential","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":427,"kind":16,"name":"Polynomial","url":"enums/tableau.trendlinemodeltype.html#polynomial","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":428,"kind":4,"name":"ZoneVisibilityType","url":"enums/tableau.zonevisibilitytype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":429,"kind":16,"name":"Show","url":"enums/tableau.zonevisibilitytype.html#show","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ZoneVisibilityType"},{"id":430,"kind":16,"name":"Hide","url":"enums/tableau.zonevisibilitytype.html#hide","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ZoneVisibilityType"},{"id":431,"kind":32,"name":"extensions","url":"modules/tableau.html#extensions","classes":"tsd-kind-variable tsd-parent-kind-module","parent":"Tableau"},{"id":432,"kind":256,"name":"DataSource","url":"interfaces/datasource.html","classes":"tsd-kind-interface"},{"id":433,"kind":1024,"name":"name","url":"interfaces/datasource.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":434,"kind":1024,"name":"id","url":"interfaces/datasource.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":435,"kind":1024,"name":"fields","url":"interfaces/datasource.html#fields","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":436,"kind":1024,"name":"extractUpdateTime","url":"interfaces/datasource.html#extractupdatetime","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":437,"kind":1024,"name":"isExtract","url":"interfaces/datasource.html#isextract","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":438,"kind":2048,"name":"refreshAsync","url":"interfaces/datasource.html#refreshasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":439,"kind":2048,"name":"getActiveTablesAsync","url":"interfaces/datasource.html#getactivetablesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":440,"kind":2048,"name":"getConnectionSummariesAsync","url":"interfaces/datasource.html#getconnectionsummariesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":441,"kind":2048,"name":"getUnderlyingDataAsync","url":"interfaces/datasource.html#getunderlyingdataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":442,"kind":2048,"name":"getLogicalTablesAsync","url":"interfaces/datasource.html#getlogicaltablesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":443,"kind":2048,"name":"getLogicalTableDataAsync","url":"interfaces/datasource.html#getlogicaltabledataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":444,"kind":256,"name":"Field","url":"interfaces/field.html","classes":"tsd-kind-interface"},{"id":445,"kind":1024,"name":"name","url":"interfaces/field.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":446,"kind":1024,"name":"id","url":"interfaces/field.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":447,"kind":1024,"name":"description","url":"interfaces/field.html#description","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":448,"kind":1024,"name":"dataSource","url":"interfaces/field.html#datasource","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":449,"kind":1024,"name":"role","url":"interfaces/field.html#role","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":450,"kind":1024,"name":"isHidden","url":"interfaces/field.html#ishidden","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":451,"kind":1024,"name":"isGenerated","url":"interfaces/field.html#isgenerated","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":452,"kind":1024,"name":"isCalculatedField","url":"interfaces/field.html#iscalculatedfield","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":453,"kind":1024,"name":"aggregation","url":"interfaces/field.html#aggregation","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":454,"kind":1024,"name":"columnType","url":"interfaces/field.html#columntype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":455,"kind":1024,"name":"isCombinedField","url":"interfaces/field.html#iscombinedfield","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":456,"kind":256,"name":"ConnectionSummary","url":"interfaces/connectionsummary.html","classes":"tsd-kind-interface"},{"id":457,"kind":1024,"name":"name","url":"interfaces/connectionsummary.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":458,"kind":1024,"name":"id","url":"interfaces/connectionsummary.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":459,"kind":1024,"name":"type","url":"interfaces/connectionsummary.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":460,"kind":1024,"name":"serverURI","url":"interfaces/connectionsummary.html#serveruri","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":461,"kind":256,"name":"TableSummary","url":"interfaces/tablesummary.html","classes":"tsd-kind-interface"},{"id":462,"kind":1024,"name":"name","url":"interfaces/tablesummary.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":463,"kind":1024,"name":"id","url":"interfaces/tablesummary.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":464,"kind":1024,"name":"connectionId","url":"interfaces/tablesummary.html#connectionid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":465,"kind":1024,"name":"customSQL","url":"interfaces/tablesummary.html#customsql","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":466,"kind":256,"name":"DataSourceUnderlyingDataOptions","url":"interfaces/datasourceunderlyingdataoptions.html","classes":"tsd-kind-interface"},{"id":467,"kind":1024,"name":"ignoreAliases","url":"interfaces/datasourceunderlyingdataoptions.html#ignorealiases","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":468,"kind":1024,"name":"columnsToInclude","url":"interfaces/datasourceunderlyingdataoptions.html#columnstoinclude","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":469,"kind":1024,"name":"maxRows","url":"interfaces/datasourceunderlyingdataoptions.html#maxrows","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":470,"kind":256,"name":"LogicalTable","url":"interfaces/logicaltable.html","classes":"tsd-kind-interface"},{"id":471,"kind":1024,"name":"id","url":"interfaces/logicaltable.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"LogicalTable"},{"id":472,"kind":1024,"name":"caption","url":"interfaces/logicaltable.html#caption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"LogicalTable"},{"id":473,"kind":256,"name":"TableauError","url":"interfaces/tableauerror.html","classes":"tsd-kind-interface"},{"id":474,"kind":1024,"name":"errorCode","url":"interfaces/tableauerror.html#errorcode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauError"},{"id":475,"kind":1024,"name":"name","url":"interfaces/tableauerror.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauError"},{"id":476,"kind":1024,"name":"message","url":"interfaces/tableauerror.html#message","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauError"},{"id":477,"kind":1024,"name":"stack","url":"interfaces/tableauerror.html#stack","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauError"},{"id":478,"kind":1024,"name":"Error","url":"interfaces/tableauerror.html#error","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauError"}]}; \ No newline at end of file + typedoc.search.data = {"kinds":{"2":"Module","4":"Enumeration","16":"Enumeration member","32":"Variable","256":"Interface","1024":"Property","2048":"Method","65536":"Type literal","4194304":"Type alias"},"rows":[{"id":0,"kind":256,"name":"MarksCollection","url":"interfaces/markscollection.html","classes":"tsd-kind-interface"},{"id":1,"kind":1024,"name":"data","url":"interfaces/markscollection.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarksCollection"},{"id":2,"kind":256,"name":"MarkInfo","url":"interfaces/markinfo.html","classes":"tsd-kind-interface"},{"id":3,"kind":1024,"name":"type","url":"interfaces/markinfo.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarkInfo"},{"id":4,"kind":1024,"name":"color","url":"interfaces/markinfo.html#color","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarkInfo"},{"id":5,"kind":1024,"name":"tupleId","url":"interfaces/markinfo.html#tupleid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"MarkInfo"},{"id":6,"kind":256,"name":"SelectionCriteria","url":"interfaces/selectioncriteria.html","classes":"tsd-kind-interface"},{"id":7,"kind":1024,"name":"fieldName","url":"interfaces/selectioncriteria.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SelectionCriteria"},{"id":8,"kind":1024,"name":"value","url":"interfaces/selectioncriteria.html#value","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SelectionCriteria"},{"id":9,"kind":256,"name":"RangeValue","url":"interfaces/rangevalue.html","classes":"tsd-kind-interface"},{"id":10,"kind":1024,"name":"min","url":"interfaces/rangevalue.html#min","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeValue"},{"id":11,"kind":1024,"name":"max","url":"interfaces/rangevalue.html#max","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeValue"},{"id":12,"kind":1024,"name":"nullOption","url":"interfaces/rangevalue.html#nulloption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeValue"},{"id":13,"kind":4194304,"name":"CategoricalValue","url":"globals.html#categoricalvalue","classes":"tsd-kind-type-alias"},{"id":14,"kind":256,"name":"Column","url":"interfaces/column.html","classes":"tsd-kind-interface"},{"id":15,"kind":1024,"name":"fieldName","url":"interfaces/column.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":16,"kind":1024,"name":"fieldId","url":"interfaces/column.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":17,"kind":1024,"name":"dataType","url":"interfaces/column.html#datatype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":18,"kind":1024,"name":"isReferenced","url":"interfaces/column.html#isreferenced","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":19,"kind":1024,"name":"index","url":"interfaces/column.html#index","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Column"},{"id":20,"kind":256,"name":"DataTable","url":"interfaces/datatable.html","classes":"tsd-kind-interface"},{"id":21,"kind":1024,"name":"name","url":"interfaces/datatable.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":22,"kind":1024,"name":"data","url":"interfaces/datatable.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":23,"kind":1024,"name":"marksInfo","url":"interfaces/datatable.html#marksinfo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":24,"kind":1024,"name":"columns","url":"interfaces/datatable.html#columns","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":25,"kind":1024,"name":"totalRowCount","url":"interfaces/datatable.html#totalrowcount","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":26,"kind":1024,"name":"isTotalRowCountLimited","url":"interfaces/datatable.html#istotalrowcountlimited","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":27,"kind":1024,"name":"isSummaryData","url":"interfaces/datatable.html#issummarydata","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataTable"},{"id":28,"kind":256,"name":"DataValue","url":"interfaces/datavalue.html","classes":"tsd-kind-interface"},{"id":29,"kind":1024,"name":"value","url":"interfaces/datavalue.html#value","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataValue"},{"id":30,"kind":1024,"name":"nativeValue","url":"interfaces/datavalue.html#nativevalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataValue"},{"id":31,"kind":1024,"name":"formattedValue","url":"interfaces/datavalue.html#formattedvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataValue"},{"id":32,"kind":256,"name":"GetSummaryDataOptions","url":"interfaces/getsummarydataoptions.html","classes":"tsd-kind-interface"},{"id":33,"kind":1024,"name":"ignoreAliases","url":"interfaces/getsummarydataoptions.html#ignorealiases","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":34,"kind":1024,"name":"ignoreSelection","url":"interfaces/getsummarydataoptions.html#ignoreselection","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":35,"kind":1024,"name":"columnsToIncludeById","url":"interfaces/getsummarydataoptions.html#columnstoincludebyid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":36,"kind":1024,"name":"maxRows","url":"interfaces/getsummarydataoptions.html#maxrows","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":37,"kind":1024,"name":"includeDataValuesOption","url":"interfaces/getsummarydataoptions.html#includedatavaluesoption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetSummaryDataOptions"},{"id":38,"kind":256,"name":"GetUnderlyingDataOptions","url":"interfaces/getunderlyingdataoptions.html","classes":"tsd-kind-interface"},{"id":39,"kind":1024,"name":"includeAllColumns","url":"interfaces/getunderlyingdataoptions.html#includeallcolumns","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"GetUnderlyingDataOptions"},{"id":40,"kind":1024,"name":"ignoreAliases","url":"interfaces/getunderlyingdataoptions.html#ignorealiases","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":41,"kind":1024,"name":"ignoreSelection","url":"interfaces/getunderlyingdataoptions.html#ignoreselection","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":42,"kind":1024,"name":"columnsToIncludeById","url":"interfaces/getunderlyingdataoptions.html#columnstoincludebyid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":43,"kind":1024,"name":"maxRows","url":"interfaces/getunderlyingdataoptions.html#maxrows","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":44,"kind":1024,"name":"includeDataValuesOption","url":"interfaces/getunderlyingdataoptions.html#includedatavaluesoption","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"GetUnderlyingDataOptions"},{"id":45,"kind":256,"name":"PaginationOptions","url":"interfaces/paginationoptions.html","classes":"tsd-kind-interface"},{"id":46,"kind":1024,"name":"pageSize","url":"interfaces/paginationoptions.html#pagesize","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PaginationOptions"},{"id":47,"kind":1024,"name":"pageNumber","url":"interfaces/paginationoptions.html#pagenumber","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PaginationOptions"},{"id":48,"kind":256,"name":"PagedData","url":"interfaces/pageddata.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":49,"kind":1024,"name":"data","url":"interfaces/pageddata.html#data","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":50,"kind":1024,"name":"pageSize","url":"interfaces/pageddata.html#pagesize","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":51,"kind":1024,"name":"page","url":"interfaces/pageddata.html#page","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":52,"kind":1024,"name":"total","url":"interfaces/pageddata.html#total","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":53,"kind":1024,"name":"hasMoreData","url":"interfaces/pageddata.html#hasmoredata","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PagedData"},{"id":54,"kind":2048,"name":"getNextPageAsync","url":"interfaces/pageddata.html#getnextpageasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"PagedData"},{"id":55,"kind":256,"name":"Filter","url":"interfaces/filter.html","classes":"tsd-kind-interface"},{"id":56,"kind":1024,"name":"worksheetName","url":"interfaces/filter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":57,"kind":1024,"name":"filterType","url":"interfaces/filter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":58,"kind":1024,"name":"fieldName","url":"interfaces/filter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":59,"kind":1024,"name":"fieldId","url":"interfaces/filter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Filter"},{"id":60,"kind":2048,"name":"getFieldAsync","url":"interfaces/filter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Filter"},{"id":61,"kind":256,"name":"CategoricalFilter","url":"interfaces/categoricalfilter.html","classes":"tsd-kind-interface"},{"id":62,"kind":1024,"name":"isAllSelected","url":"interfaces/categoricalfilter.html#isallselected","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":63,"kind":1024,"name":"appliedValues","url":"interfaces/categoricalfilter.html#appliedvalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":64,"kind":1024,"name":"isExcludeMode","url":"interfaces/categoricalfilter.html#isexcludemode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":65,"kind":2048,"name":"getDomainAsync","url":"interfaces/categoricalfilter.html#getdomainasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"CategoricalFilter"},{"id":66,"kind":1024,"name":"worksheetName","url":"interfaces/categoricalfilter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":67,"kind":1024,"name":"filterType","url":"interfaces/categoricalfilter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":68,"kind":1024,"name":"fieldName","url":"interfaces/categoricalfilter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":69,"kind":1024,"name":"fieldId","url":"interfaces/categoricalfilter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":70,"kind":2048,"name":"getFieldAsync","url":"interfaces/categoricalfilter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"CategoricalFilter"},{"id":71,"kind":256,"name":"RangeFilter","url":"interfaces/rangefilter.html","classes":"tsd-kind-interface"},{"id":72,"kind":1024,"name":"minValue","url":"interfaces/rangefilter.html#minvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilter"},{"id":73,"kind":1024,"name":"maxValue","url":"interfaces/rangefilter.html#maxvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilter"},{"id":74,"kind":1024,"name":"includeNullValues","url":"interfaces/rangefilter.html#includenullvalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilter"},{"id":75,"kind":2048,"name":"getDomainAsync","url":"interfaces/rangefilter.html#getdomainasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"RangeFilter"},{"id":76,"kind":1024,"name":"worksheetName","url":"interfaces/rangefilter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":77,"kind":1024,"name":"filterType","url":"interfaces/rangefilter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":78,"kind":1024,"name":"fieldName","url":"interfaces/rangefilter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":79,"kind":1024,"name":"fieldId","url":"interfaces/rangefilter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":80,"kind":2048,"name":"getFieldAsync","url":"interfaces/rangefilter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"RangeFilter"},{"id":81,"kind":256,"name":"RelativeDateFilter","url":"interfaces/relativedatefilter.html","classes":"tsd-kind-interface"},{"id":82,"kind":1024,"name":"anchorDate","url":"interfaces/relativedatefilter.html#anchordate","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":83,"kind":1024,"name":"periodType","url":"interfaces/relativedatefilter.html#periodtype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":84,"kind":1024,"name":"rangeType","url":"interfaces/relativedatefilter.html#rangetype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":85,"kind":1024,"name":"rangeN","url":"interfaces/relativedatefilter.html#rangen","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RelativeDateFilter"},{"id":86,"kind":1024,"name":"worksheetName","url":"interfaces/relativedatefilter.html#worksheetname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":87,"kind":1024,"name":"filterType","url":"interfaces/relativedatefilter.html#filtertype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":88,"kind":1024,"name":"fieldName","url":"interfaces/relativedatefilter.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":89,"kind":1024,"name":"fieldId","url":"interfaces/relativedatefilter.html#fieldid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":90,"kind":2048,"name":"getFieldAsync","url":"interfaces/relativedatefilter.html#getfieldasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"RelativeDateFilter"},{"id":91,"kind":256,"name":"FilterOptions","url":"interfaces/filteroptions.html","classes":"tsd-kind-interface"},{"id":92,"kind":1024,"name":"isExcludeMode","url":"interfaces/filteroptions.html#isexcludemode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"FilterOptions"},{"id":93,"kind":256,"name":"RangeFilterOptions","url":"interfaces/rangefilteroptions.html","classes":"tsd-kind-interface"},{"id":94,"kind":1024,"name":"min","url":"interfaces/rangefilteroptions.html#min","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilterOptions"},{"id":95,"kind":1024,"name":"max","url":"interfaces/rangefilteroptions.html#max","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilterOptions"},{"id":96,"kind":1024,"name":"nullOption","url":"interfaces/rangefilteroptions.html#nulloption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeFilterOptions"},{"id":97,"kind":256,"name":"RangeDomain","url":"interfaces/rangedomain.html","classes":"tsd-kind-interface"},{"id":98,"kind":1024,"name":"type","url":"interfaces/rangedomain.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeDomain"},{"id":99,"kind":1024,"name":"min","url":"interfaces/rangedomain.html#min","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeDomain"},{"id":100,"kind":1024,"name":"max","url":"interfaces/rangedomain.html#max","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"RangeDomain"},{"id":101,"kind":256,"name":"CategoricalDomain","url":"interfaces/categoricaldomain.html","classes":"tsd-kind-interface"},{"id":102,"kind":1024,"name":"type","url":"interfaces/categoricaldomain.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalDomain"},{"id":103,"kind":1024,"name":"values","url":"interfaces/categoricaldomain.html#values","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CategoricalDomain"},{"id":104,"kind":256,"name":"Parameter","url":"interfaces/parameter.html","classes":"tsd-kind-interface"},{"id":105,"kind":1024,"name":"name","url":"interfaces/parameter.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":106,"kind":1024,"name":"currentValue","url":"interfaces/parameter.html#currentvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":107,"kind":1024,"name":"dataType","url":"interfaces/parameter.html#datatype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":108,"kind":1024,"name":"allowableValues","url":"interfaces/parameter.html#allowablevalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":109,"kind":1024,"name":"id","url":"interfaces/parameter.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Parameter"},{"id":110,"kind":2048,"name":"changeValueAsync","url":"interfaces/parameter.html#changevalueasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Parameter"},{"id":111,"kind":2048,"name":"addEventListener","url":"interfaces/parameter.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Parameter"},{"id":112,"kind":2048,"name":"removeEventListener","url":"interfaces/parameter.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Parameter"},{"id":113,"kind":256,"name":"ParameterDomainRestriction","url":"interfaces/parameterdomainrestriction.html","classes":"tsd-kind-interface"},{"id":114,"kind":1024,"name":"type","url":"interfaces/parameterdomainrestriction.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":115,"kind":1024,"name":"allowableValues","url":"interfaces/parameterdomainrestriction.html#allowablevalues","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":116,"kind":1024,"name":"minValue","url":"interfaces/parameterdomainrestriction.html#minvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":117,"kind":1024,"name":"maxValue","url":"interfaces/parameterdomainrestriction.html#maxvalue","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":118,"kind":1024,"name":"stepSize","url":"interfaces/parameterdomainrestriction.html#stepsize","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":119,"kind":1024,"name":"dateStepPeriod","url":"interfaces/parameterdomainrestriction.html#datestepperiod","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ParameterDomainRestriction"},{"id":120,"kind":256,"name":"TableauEvent","url":"interfaces/tableauevent.html","classes":"tsd-kind-interface"},{"id":121,"kind":1024,"name":"type","url":"interfaces/tableauevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauEvent"},{"id":122,"kind":256,"name":"TableauSheetEvent","url":"interfaces/tableausheetevent.html","classes":"tsd-kind-interface"},{"id":123,"kind":1024,"name":"sheet","url":"interfaces/tableausheetevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauSheetEvent"},{"id":124,"kind":1024,"name":"type","url":"interfaces/tableausheetevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauSheetEvent"},{"id":125,"kind":256,"name":"TableauWorksheetEvent","url":"interfaces/tableauworksheetevent.html","classes":"tsd-kind-interface"},{"id":126,"kind":1024,"name":"worksheet","url":"interfaces/tableauworksheetevent.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauWorksheetEvent"},{"id":127,"kind":1024,"name":"sheet","url":"interfaces/tableauworksheetevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauWorksheetEvent"},{"id":128,"kind":1024,"name":"type","url":"interfaces/tableauworksheetevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauWorksheetEvent"},{"id":129,"kind":256,"name":"MarksSelectedEvent","url":"interfaces/marksselectedevent.html","classes":"tsd-kind-interface"},{"id":130,"kind":2048,"name":"getMarksAsync","url":"interfaces/marksselectedevent.html#getmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"MarksSelectedEvent"},{"id":131,"kind":1024,"name":"worksheet","url":"interfaces/marksselectedevent.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"MarksSelectedEvent"},{"id":132,"kind":1024,"name":"sheet","url":"interfaces/marksselectedevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"MarksSelectedEvent"},{"id":133,"kind":1024,"name":"type","url":"interfaces/marksselectedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"MarksSelectedEvent"},{"id":134,"kind":256,"name":"ParameterChangedEvent","url":"interfaces/parameterchangedevent.html","classes":"tsd-kind-interface"},{"id":135,"kind":2048,"name":"getParameterAsync","url":"interfaces/parameterchangedevent.html#getparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"ParameterChangedEvent"},{"id":136,"kind":1024,"name":"type","url":"interfaces/parameterchangedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"ParameterChangedEvent"},{"id":137,"kind":256,"name":"SettingsChangedEvent","url":"interfaces/settingschangedevent.html","classes":"tsd-kind-interface"},{"id":138,"kind":1024,"name":"newSettings","url":"interfaces/settingschangedevent.html#newsettings","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SettingsChangedEvent"},{"id":139,"kind":65536,"name":"__type","url":"interfaces/settingschangedevent.html#newsettings.__type","classes":"tsd-kind-type-literal tsd-parent-kind-property tsd-is-not-exported","parent":"SettingsChangedEvent.newSettings"},{"id":140,"kind":1024,"name":"type","url":"interfaces/settingschangedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SettingsChangedEvent"},{"id":141,"kind":256,"name":"FilterChangedEvent","url":"interfaces/filterchangedevent.html","classes":"tsd-kind-interface"},{"id":142,"kind":1024,"name":"fieldName","url":"interfaces/filterchangedevent.html#fieldname","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"FilterChangedEvent"},{"id":143,"kind":2048,"name":"getFilterAsync","url":"interfaces/filterchangedevent.html#getfilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"FilterChangedEvent"},{"id":144,"kind":1024,"name":"worksheet","url":"interfaces/filterchangedevent.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"FilterChangedEvent"},{"id":145,"kind":1024,"name":"sheet","url":"interfaces/filterchangedevent.html#sheet","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"FilterChangedEvent"},{"id":146,"kind":1024,"name":"type","url":"interfaces/filterchangedevent.html#type","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"FilterChangedEvent"},{"id":147,"kind":256,"name":"EventListenerManager","url":"interfaces/eventlistenermanager.html","classes":"tsd-kind-interface"},{"id":148,"kind":2048,"name":"addEventListener","url":"interfaces/eventlistenermanager.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"EventListenerManager"},{"id":149,"kind":2048,"name":"removeEventListener","url":"interfaces/eventlistenermanager.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"EventListenerManager"},{"id":150,"kind":4194304,"name":"TableauEventHandlerFn","url":"globals.html#tableaueventhandlerfn","classes":"tsd-kind-type-alias"},{"id":151,"kind":65536,"name":"__type","url":"globals.html#tableaueventhandlerfn.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-is-not-exported","parent":"TableauEventHandlerFn"},{"id":152,"kind":4194304,"name":"TableauEventUnregisterFn","url":"globals.html#tableaueventunregisterfn","classes":"tsd-kind-type-alias"},{"id":153,"kind":65536,"name":"__type","url":"globals.html#tableaueventunregisterfn.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-is-not-exported","parent":"TableauEventUnregisterFn"},{"id":154,"kind":256,"name":"Dashboard","url":"interfaces/dashboard.html","classes":"tsd-kind-interface"},{"id":155,"kind":1024,"name":"objects","url":"interfaces/dashboard.html#objects","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Dashboard"},{"id":156,"kind":1024,"name":"worksheets","url":"interfaces/dashboard.html#worksheets","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Dashboard"},{"id":157,"kind":2048,"name":"setZoneVisibilityAsync","url":"interfaces/dashboard.html#setzonevisibilityasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Dashboard"},{"id":158,"kind":1024,"name":"name","url":"interfaces/dashboard.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":159,"kind":1024,"name":"sheetType","url":"interfaces/dashboard.html#sheettype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":160,"kind":2048,"name":"findParameterAsync","url":"interfaces/dashboard.html#findparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":161,"kind":1024,"name":"size","url":"interfaces/dashboard.html#size","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":162,"kind":2048,"name":"getParametersAsync","url":"interfaces/dashboard.html#getparametersasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":163,"kind":2048,"name":"addEventListener","url":"interfaces/dashboard.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":164,"kind":2048,"name":"removeEventListener","url":"interfaces/dashboard.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Dashboard"},{"id":165,"kind":256,"name":"DashboardObject","url":"interfaces/dashboardobject.html","classes":"tsd-kind-interface"},{"id":166,"kind":1024,"name":"dashboard","url":"interfaces/dashboardobject.html#dashboard","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":167,"kind":1024,"name":"type","url":"interfaces/dashboardobject.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":168,"kind":1024,"name":"position","url":"interfaces/dashboardobject.html#position","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":169,"kind":1024,"name":"size","url":"interfaces/dashboardobject.html#size","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":170,"kind":1024,"name":"worksheet","url":"interfaces/dashboardobject.html#worksheet","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":171,"kind":1024,"name":"name","url":"interfaces/dashboardobject.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":172,"kind":1024,"name":"isFloating","url":"interfaces/dashboardobject.html#isfloating","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":173,"kind":1024,"name":"isVisible","url":"interfaces/dashboardobject.html#isvisible","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":174,"kind":1024,"name":"id","url":"interfaces/dashboardobject.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardObject"},{"id":175,"kind":256,"name":"Point","url":"interfaces/point.html","classes":"tsd-kind-interface"},{"id":176,"kind":1024,"name":"x","url":"interfaces/point.html#x","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Point"},{"id":177,"kind":1024,"name":"y","url":"interfaces/point.html#y","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Point"},{"id":178,"kind":256,"name":"Sheet","url":"interfaces/sheet.html","classes":"tsd-kind-interface"},{"id":179,"kind":1024,"name":"name","url":"interfaces/sheet.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Sheet"},{"id":180,"kind":1024,"name":"sheetType","url":"interfaces/sheet.html#sheettype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Sheet"},{"id":181,"kind":2048,"name":"findParameterAsync","url":"interfaces/sheet.html#findparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Sheet"},{"id":182,"kind":1024,"name":"size","url":"interfaces/sheet.html#size","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Sheet"},{"id":183,"kind":2048,"name":"getParametersAsync","url":"interfaces/sheet.html#getparametersasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Sheet"},{"id":184,"kind":2048,"name":"addEventListener","url":"interfaces/sheet.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Sheet"},{"id":185,"kind":2048,"name":"removeEventListener","url":"interfaces/sheet.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Sheet"},{"id":186,"kind":256,"name":"Size","url":"interfaces/size.html","classes":"tsd-kind-interface"},{"id":187,"kind":1024,"name":"height","url":"interfaces/size.html#height","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Size"},{"id":188,"kind":1024,"name":"width","url":"interfaces/size.html#width","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Size"},{"id":189,"kind":256,"name":"Worksheet","url":"interfaces/worksheet.html","classes":"tsd-kind-interface"},{"id":190,"kind":1024,"name":"parentDashboard","url":"interfaces/worksheet.html#parentdashboard","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Worksheet"},{"id":191,"kind":2048,"name":"applyFilterAsync","url":"interfaces/worksheet.html#applyfilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":192,"kind":2048,"name":"applyRangeFilterAsync","url":"interfaces/worksheet.html#applyrangefilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":193,"kind":2048,"name":"clearFilterAsync","url":"interfaces/worksheet.html#clearfilterasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":194,"kind":2048,"name":"getDataSourcesAsync","url":"interfaces/worksheet.html#getdatasourcesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":195,"kind":2048,"name":"getFiltersAsync","url":"interfaces/worksheet.html#getfiltersasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":196,"kind":2048,"name":"getHighlightedMarksAsync","url":"interfaces/worksheet.html#gethighlightedmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":197,"kind":2048,"name":"getSelectedMarksAsync","url":"interfaces/worksheet.html#getselectedmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":198,"kind":2048,"name":"getSummaryDataAsync","url":"interfaces/worksheet.html#getsummarydataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":199,"kind":2048,"name":"getSummaryColumnsInfoAsync","url":"interfaces/worksheet.html#getsummarycolumnsinfoasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":200,"kind":2048,"name":"getUnderlyingDataAsync","url":"interfaces/worksheet.html#getunderlyingdataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":201,"kind":2048,"name":"getUnderlyingTablesAsync","url":"interfaces/worksheet.html#getunderlyingtablesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":202,"kind":2048,"name":"getUnderlyingTableDataAsync","url":"interfaces/worksheet.html#getunderlyingtabledataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":203,"kind":2048,"name":"selectMarksByValueAsync","url":"interfaces/worksheet.html#selectmarksbyvalueasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":204,"kind":2048,"name":"clearSelectedMarksAsync","url":"interfaces/worksheet.html#clearselectedmarksasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Worksheet"},{"id":205,"kind":1024,"name":"name","url":"interfaces/worksheet.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":206,"kind":1024,"name":"sheetType","url":"interfaces/worksheet.html#sheettype","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":207,"kind":2048,"name":"findParameterAsync","url":"interfaces/worksheet.html#findparameterasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":208,"kind":1024,"name":"size","url":"interfaces/worksheet.html#size","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":209,"kind":2048,"name":"getParametersAsync","url":"interfaces/worksheet.html#getparametersasync","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":210,"kind":2048,"name":"addEventListener","url":"interfaces/worksheet.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":211,"kind":2048,"name":"removeEventListener","url":"interfaces/worksheet.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Worksheet"},{"id":212,"kind":4194304,"name":"ZoneVisibilityMap","url":"globals.html#zonevisibilitymap","classes":"tsd-kind-type-alias"},{"id":213,"kind":256,"name":"DashboardContent","url":"interfaces/dashboardcontent.html","classes":"tsd-kind-interface"},{"id":214,"kind":1024,"name":"dashboard","url":"interfaces/dashboardcontent.html#dashboard","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DashboardContent"},{"id":215,"kind":256,"name":"Environment","url":"interfaces/environment.html","classes":"tsd-kind-interface"},{"id":216,"kind":1024,"name":"apiVersion","url":"interfaces/environment.html#apiversion","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":217,"kind":1024,"name":"context","url":"interfaces/environment.html#context","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":218,"kind":1024,"name":"language","url":"interfaces/environment.html#language","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":219,"kind":1024,"name":"locale","url":"interfaces/environment.html#locale","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":220,"kind":1024,"name":"mode","url":"interfaces/environment.html#mode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":221,"kind":1024,"name":"operatingSystem","url":"interfaces/environment.html#operatingsystem","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":222,"kind":1024,"name":"tableauVersion","url":"interfaces/environment.html#tableauversion","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Environment"},{"id":223,"kind":256,"name":"Settings","url":"interfaces/settings.html","classes":"tsd-kind-interface"},{"id":224,"kind":2048,"name":"erase","url":"interfaces/settings.html#erase","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":225,"kind":2048,"name":"get","url":"interfaces/settings.html#get","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":226,"kind":2048,"name":"getAll","url":"interfaces/settings.html#getall","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":227,"kind":1024,"name":"isModified","url":"interfaces/settings.html#ismodified","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Settings"},{"id":228,"kind":2048,"name":"saveAsync","url":"interfaces/settings.html#saveasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":229,"kind":2048,"name":"set","url":"interfaces/settings.html#set","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Settings"},{"id":230,"kind":2048,"name":"addEventListener","url":"interfaces/settings.html#addeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Settings"},{"id":231,"kind":2048,"name":"removeEventListener","url":"interfaces/settings.html#removeeventlistener","classes":"tsd-kind-method tsd-parent-kind-interface tsd-is-inherited","parent":"Settings"},{"id":232,"kind":256,"name":"UI","url":"interfaces/ui.html","classes":"tsd-kind-interface"},{"id":233,"kind":2048,"name":"displayDialogAsync","url":"interfaces/ui.html#displaydialogasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"UI"},{"id":234,"kind":2048,"name":"closeDialog","url":"interfaces/ui.html#closedialog","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"UI"},{"id":235,"kind":256,"name":"DialogOptions","url":"interfaces/dialogoptions.html","classes":"tsd-kind-interface"},{"id":236,"kind":1024,"name":"width","url":"interfaces/dialogoptions.html#width","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DialogOptions"},{"id":237,"kind":1024,"name":"height","url":"interfaces/dialogoptions.html#height","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DialogOptions"},{"id":238,"kind":256,"name":"Extensions","url":"interfaces/extensions.html","classes":"tsd-kind-interface"},{"id":239,"kind":2048,"name":"initializeAsync","url":"interfaces/extensions.html#initializeasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Extensions"},{"id":240,"kind":2048,"name":"initializeDialogAsync","url":"interfaces/extensions.html#initializedialogasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"Extensions"},{"id":241,"kind":1024,"name":"dashboardContent","url":"interfaces/extensions.html#dashboardcontent","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":242,"kind":1024,"name":"environment","url":"interfaces/extensions.html#environment","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":243,"kind":1024,"name":"settings","url":"interfaces/extensions.html#settings","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":244,"kind":1024,"name":"ui","url":"interfaces/extensions.html#ui","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Extensions"},{"id":245,"kind":2,"name":"Tableau","url":"modules/tableau.html","classes":"tsd-kind-module"},{"id":246,"kind":4,"name":"ExtensionContext","url":"enums/tableau.extensioncontext.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":247,"kind":16,"name":"Desktop","url":"enums/tableau.extensioncontext.html#desktop","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionContext"},{"id":248,"kind":16,"name":"Server","url":"enums/tableau.extensioncontext.html#server","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionContext"},{"id":249,"kind":4,"name":"ExtensionMode","url":"enums/tableau.extensionmode.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":250,"kind":16,"name":"Authoring","url":"enums/tableau.extensionmode.html#authoring","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionMode"},{"id":251,"kind":16,"name":"Viewing","url":"enums/tableau.extensionmode.html#viewing","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ExtensionMode"},{"id":252,"kind":4,"name":"AnalyticsObjectType","url":"enums/tableau.analyticsobjecttype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":253,"kind":16,"name":"Cluster","url":"enums/tableau.analyticsobjecttype.html#cluster","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.AnalyticsObjectType"},{"id":254,"kind":16,"name":"Forecast","url":"enums/tableau.analyticsobjecttype.html#forecast","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.AnalyticsObjectType"},{"id":255,"kind":16,"name":"TrendLine","url":"enums/tableau.analyticsobjecttype.html#trendline","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.AnalyticsObjectType"},{"id":256,"kind":4,"name":"ColumnType","url":"enums/tableau.columntype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":257,"kind":16,"name":"Discrete","url":"enums/tableau.columntype.html#discrete","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ColumnType"},{"id":258,"kind":16,"name":"Continuous","url":"enums/tableau.columntype.html#continuous","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ColumnType"},{"id":259,"kind":4,"name":"DashboardObjectType","url":"enums/tableau.dashboardobjecttype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":260,"kind":16,"name":"Blank","url":"enums/tableau.dashboardobjecttype.html#blank","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":261,"kind":16,"name":"Worksheet","url":"enums/tableau.dashboardobjecttype.html#worksheet","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":262,"kind":16,"name":"QuickFilter","url":"enums/tableau.dashboardobjecttype.html#quickfilter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":263,"kind":16,"name":"ParameterControl","url":"enums/tableau.dashboardobjecttype.html#parametercontrol","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":264,"kind":16,"name":"PageFilter","url":"enums/tableau.dashboardobjecttype.html#pagefilter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":265,"kind":16,"name":"Legend","url":"enums/tableau.dashboardobjecttype.html#legend","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":266,"kind":16,"name":"Title","url":"enums/tableau.dashboardobjecttype.html#title","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":267,"kind":16,"name":"Text","url":"enums/tableau.dashboardobjecttype.html#text","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":268,"kind":16,"name":"Image","url":"enums/tableau.dashboardobjecttype.html#image","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":269,"kind":16,"name":"WebPage","url":"enums/tableau.dashboardobjecttype.html#webpage","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":270,"kind":16,"name":"Extension","url":"enums/tableau.dashboardobjecttype.html#extension","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DashboardObjectType"},{"id":271,"kind":4,"name":"DataType","url":"enums/tableau.datatype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":272,"kind":16,"name":"String","url":"enums/tableau.datatype.html#string","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":273,"kind":16,"name":"Int","url":"enums/tableau.datatype.html#int","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":274,"kind":16,"name":"Float","url":"enums/tableau.datatype.html#float","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":275,"kind":16,"name":"Bool","url":"enums/tableau.datatype.html#bool","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":276,"kind":16,"name":"Date","url":"enums/tableau.datatype.html#date","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":277,"kind":16,"name":"DateTime","url":"enums/tableau.datatype.html#datetime","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":278,"kind":16,"name":"Spatial","url":"enums/tableau.datatype.html#spatial","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DataType"},{"id":279,"kind":4,"name":"DateRangeType","url":"enums/tableau.daterangetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":280,"kind":16,"name":"Last","url":"enums/tableau.daterangetype.html#last","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":281,"kind":16,"name":"LastN","url":"enums/tableau.daterangetype.html#lastn","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":282,"kind":16,"name":"Next","url":"enums/tableau.daterangetype.html#next","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":283,"kind":16,"name":"NextN","url":"enums/tableau.daterangetype.html#nextn","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":284,"kind":16,"name":"Current","url":"enums/tableau.daterangetype.html#current","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":285,"kind":16,"name":"ToDate","url":"enums/tableau.daterangetype.html#todate","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.DateRangeType"},{"id":286,"kind":4,"name":"EncodingType","url":"enums/tableau.encodingtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":287,"kind":16,"name":"Column","url":"enums/tableau.encodingtype.html#column","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":288,"kind":16,"name":"Row","url":"enums/tableau.encodingtype.html#row","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":289,"kind":16,"name":"Page","url":"enums/tableau.encodingtype.html#page","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":290,"kind":16,"name":"Filter","url":"enums/tableau.encodingtype.html#filter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":291,"kind":16,"name":"MarksType","url":"enums/tableau.encodingtype.html#markstype","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":292,"kind":16,"name":"MeasureValues","url":"enums/tableau.encodingtype.html#measurevalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":293,"kind":16,"name":"Color","url":"enums/tableau.encodingtype.html#color","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":294,"kind":16,"name":"Size","url":"enums/tableau.encodingtype.html#size","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":295,"kind":16,"name":"Label","url":"enums/tableau.encodingtype.html#label","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":296,"kind":16,"name":"Detail","url":"enums/tableau.encodingtype.html#detail","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":297,"kind":16,"name":"Tooltip","url":"enums/tableau.encodingtype.html#tooltip","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":298,"kind":16,"name":"Shape","url":"enums/tableau.encodingtype.html#shape","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":299,"kind":16,"name":"Path","url":"enums/tableau.encodingtype.html#path","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":300,"kind":16,"name":"Angle","url":"enums/tableau.encodingtype.html#angle","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.EncodingType"},{"id":301,"kind":4,"name":"ErrorCodes","url":"enums/tableau.errorcodes.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":302,"kind":16,"name":"APINotInitialized","url":"enums/tableau.errorcodes.html#apinotinitialized","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":303,"kind":16,"name":"VisibilityError","url":"enums/tableau.errorcodes.html#visibilityerror","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":304,"kind":16,"name":"DialogAlreadyOpen","url":"enums/tableau.errorcodes.html#dialogalreadyopen","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":305,"kind":16,"name":"DialogClosedByUser","url":"enums/tableau.errorcodes.html#dialogclosedbyuser","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":306,"kind":16,"name":"InternalError","url":"enums/tableau.errorcodes.html#internalerror","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":307,"kind":16,"name":"InvalidDomainDialog","url":"enums/tableau.errorcodes.html#invaliddomaindialog","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":308,"kind":16,"name":"InvalidParameter","url":"enums/tableau.errorcodes.html#invalidparameter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":309,"kind":16,"name":"MissingFilter","url":"enums/tableau.errorcodes.html#missingfilter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":310,"kind":16,"name":"MissingParameter","url":"enums/tableau.errorcodes.html#missingparameter","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":311,"kind":16,"name":"ServerError","url":"enums/tableau.errorcodes.html#servererror","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":312,"kind":16,"name":"SettingSaveInProgress","url":"enums/tableau.errorcodes.html#settingsaveinprogress","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":313,"kind":16,"name":"UnsupportedEventName","url":"enums/tableau.errorcodes.html#unsupportedeventname","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":314,"kind":16,"name":"UnsupportedMethodForDataSourceType","url":"enums/tableau.errorcodes.html#unsupportedmethodfordatasourcetype","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ErrorCodes"},{"id":315,"kind":4,"name":"FieldAggregationType","url":"enums/tableau.fieldaggregationtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":316,"kind":16,"name":"Sum","url":"enums/tableau.fieldaggregationtype.html#sum","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":317,"kind":16,"name":"Avg","url":"enums/tableau.fieldaggregationtype.html#avg","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":318,"kind":16,"name":"Min","url":"enums/tableau.fieldaggregationtype.html#min","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":319,"kind":16,"name":"Max","url":"enums/tableau.fieldaggregationtype.html#max","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":320,"kind":16,"name":"Stdev","url":"enums/tableau.fieldaggregationtype.html#stdev","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":321,"kind":16,"name":"Stdevp","url":"enums/tableau.fieldaggregationtype.html#stdevp","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":322,"kind":16,"name":"Var","url":"enums/tableau.fieldaggregationtype.html#var","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":323,"kind":16,"name":"Varp","url":"enums/tableau.fieldaggregationtype.html#varp","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":324,"kind":16,"name":"Count","url":"enums/tableau.fieldaggregationtype.html#count","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":325,"kind":16,"name":"Countd","url":"enums/tableau.fieldaggregationtype.html#countd","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":326,"kind":16,"name":"Median","url":"enums/tableau.fieldaggregationtype.html#median","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":327,"kind":16,"name":"Attr","url":"enums/tableau.fieldaggregationtype.html#attr","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":328,"kind":16,"name":"None","url":"enums/tableau.fieldaggregationtype.html#none","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":329,"kind":16,"name":"Year","url":"enums/tableau.fieldaggregationtype.html#year","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":330,"kind":16,"name":"Qtr","url":"enums/tableau.fieldaggregationtype.html#qtr","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":331,"kind":16,"name":"Month","url":"enums/tableau.fieldaggregationtype.html#month","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":332,"kind":16,"name":"Day","url":"enums/tableau.fieldaggregationtype.html#day","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":333,"kind":16,"name":"Hour","url":"enums/tableau.fieldaggregationtype.html#hour","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":334,"kind":16,"name":"Minute","url":"enums/tableau.fieldaggregationtype.html#minute","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":335,"kind":16,"name":"Second","url":"enums/tableau.fieldaggregationtype.html#second","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":336,"kind":16,"name":"Week","url":"enums/tableau.fieldaggregationtype.html#week","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":337,"kind":16,"name":"Weekday","url":"enums/tableau.fieldaggregationtype.html#weekday","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":338,"kind":16,"name":"MonthYear","url":"enums/tableau.fieldaggregationtype.html#monthyear","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":339,"kind":16,"name":"Mdy","url":"enums/tableau.fieldaggregationtype.html#mdy","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":340,"kind":16,"name":"End","url":"enums/tableau.fieldaggregationtype.html#end","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":341,"kind":16,"name":"TruncYear","url":"enums/tableau.fieldaggregationtype.html#truncyear","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":342,"kind":16,"name":"TruncQtr","url":"enums/tableau.fieldaggregationtype.html#truncqtr","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":343,"kind":16,"name":"TruncMonth","url":"enums/tableau.fieldaggregationtype.html#truncmonth","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":344,"kind":16,"name":"TruncWeek","url":"enums/tableau.fieldaggregationtype.html#truncweek","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":345,"kind":16,"name":"TruncDay","url":"enums/tableau.fieldaggregationtype.html#truncday","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":346,"kind":16,"name":"TruncHour","url":"enums/tableau.fieldaggregationtype.html#trunchour","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":347,"kind":16,"name":"TruncMinute","url":"enums/tableau.fieldaggregationtype.html#truncminute","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":348,"kind":16,"name":"TruncSecond","url":"enums/tableau.fieldaggregationtype.html#truncsecond","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":349,"kind":16,"name":"Quart1","url":"enums/tableau.fieldaggregationtype.html#quart1","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":350,"kind":16,"name":"Quart3","url":"enums/tableau.fieldaggregationtype.html#quart3","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":351,"kind":16,"name":"Skewness","url":"enums/tableau.fieldaggregationtype.html#skewness","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":352,"kind":16,"name":"Kurtosis","url":"enums/tableau.fieldaggregationtype.html#kurtosis","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":353,"kind":16,"name":"InOut","url":"enums/tableau.fieldaggregationtype.html#inout","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":354,"kind":16,"name":"User","url":"enums/tableau.fieldaggregationtype.html#user","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldAggregationType"},{"id":355,"kind":4,"name":"FieldRoleType","url":"enums/tableau.fieldroletype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":356,"kind":16,"name":"Dimension","url":"enums/tableau.fieldroletype.html#dimension","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldRoleType"},{"id":357,"kind":16,"name":"Measure","url":"enums/tableau.fieldroletype.html#measure","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldRoleType"},{"id":358,"kind":16,"name":"Unknown","url":"enums/tableau.fieldroletype.html#unknown","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FieldRoleType"},{"id":359,"kind":4,"name":"FilterType","url":"enums/tableau.filtertype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":360,"kind":16,"name":"Categorical","url":"enums/tableau.filtertype.html#categorical","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":361,"kind":16,"name":"Range","url":"enums/tableau.filtertype.html#range","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":362,"kind":16,"name":"Hierarchical","url":"enums/tableau.filtertype.html#hierarchical","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":363,"kind":16,"name":"RelativeDate","url":"enums/tableau.filtertype.html#relativedate","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterType"},{"id":364,"kind":4,"name":"FilterUpdateType","url":"enums/tableau.filterupdatetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":365,"kind":16,"name":"Add","url":"enums/tableau.filterupdatetype.html#add","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":366,"kind":16,"name":"All","url":"enums/tableau.filterupdatetype.html#all","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":367,"kind":16,"name":"Replace","url":"enums/tableau.filterupdatetype.html#replace","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":368,"kind":16,"name":"Remove","url":"enums/tableau.filterupdatetype.html#remove","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterUpdateType"},{"id":369,"kind":4,"name":"FilterDomainType","url":"enums/tableau.filterdomaintype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":370,"kind":16,"name":"Relevant","url":"enums/tableau.filterdomaintype.html#relevant","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterDomainType"},{"id":371,"kind":16,"name":"Database","url":"enums/tableau.filterdomaintype.html#database","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterDomainType"},{"id":372,"kind":4,"name":"FilterNullOption","url":"enums/tableau.filternulloption.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":373,"kind":16,"name":"NullValues","url":"enums/tableau.filternulloption.html#nullvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterNullOption"},{"id":374,"kind":16,"name":"NonNullValues","url":"enums/tableau.filternulloption.html#nonnullvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterNullOption"},{"id":375,"kind":16,"name":"AllValues","url":"enums/tableau.filternulloption.html#allvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.FilterNullOption"},{"id":376,"kind":4,"name":"MarkType","url":"enums/tableau.marktype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":377,"kind":16,"name":"Bar","url":"enums/tableau.marktype.html#bar","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":378,"kind":16,"name":"Line","url":"enums/tableau.marktype.html#line","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":379,"kind":16,"name":"Area","url":"enums/tableau.marktype.html#area","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":380,"kind":16,"name":"Square","url":"enums/tableau.marktype.html#square","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":381,"kind":16,"name":"Circle","url":"enums/tableau.marktype.html#circle","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":382,"kind":16,"name":"Shape","url":"enums/tableau.marktype.html#shape","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":383,"kind":16,"name":"Text","url":"enums/tableau.marktype.html#text","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":384,"kind":16,"name":"Map","url":"enums/tableau.marktype.html#map","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":385,"kind":16,"name":"Pie","url":"enums/tableau.marktype.html#pie","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":386,"kind":16,"name":"GanttBar","url":"enums/tableau.marktype.html#ganttbar","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":387,"kind":16,"name":"Polygon","url":"enums/tableau.marktype.html#polygon","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.MarkType"},{"id":388,"kind":4,"name":"ParameterValueType","url":"enums/tableau.parametervaluetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":389,"kind":16,"name":"All","url":"enums/tableau.parametervaluetype.html#all","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ParameterValueType"},{"id":390,"kind":16,"name":"List","url":"enums/tableau.parametervaluetype.html#list","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ParameterValueType"},{"id":391,"kind":16,"name":"Range","url":"enums/tableau.parametervaluetype.html#range","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ParameterValueType"},{"id":392,"kind":4,"name":"PeriodType","url":"enums/tableau.periodtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":393,"kind":16,"name":"Years","url":"enums/tableau.periodtype.html#years","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":394,"kind":16,"name":"Quarters","url":"enums/tableau.periodtype.html#quarters","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":395,"kind":16,"name":"Months","url":"enums/tableau.periodtype.html#months","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":396,"kind":16,"name":"Weeks","url":"enums/tableau.periodtype.html#weeks","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":397,"kind":16,"name":"Days","url":"enums/tableau.periodtype.html#days","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":398,"kind":16,"name":"Hours","url":"enums/tableau.periodtype.html#hours","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":399,"kind":16,"name":"Minutes","url":"enums/tableau.periodtype.html#minutes","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":400,"kind":16,"name":"Seconds","url":"enums/tableau.periodtype.html#seconds","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.PeriodType"},{"id":401,"kind":4,"name":"QuickTableCalcType","url":"enums/tableau.quicktablecalctype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":402,"kind":16,"name":"RunningTotal","url":"enums/tableau.quicktablecalctype.html#runningtotal","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":403,"kind":16,"name":"Difference","url":"enums/tableau.quicktablecalctype.html#difference","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":404,"kind":16,"name":"PercentDifference","url":"enums/tableau.quicktablecalctype.html#percentdifference","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":405,"kind":16,"name":"PercentOfTotal","url":"enums/tableau.quicktablecalctype.html#percentoftotal","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":406,"kind":16,"name":"Rank","url":"enums/tableau.quicktablecalctype.html#rank","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":407,"kind":16,"name":"Percentile","url":"enums/tableau.quicktablecalctype.html#percentile","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":408,"kind":16,"name":"MovingAverage","url":"enums/tableau.quicktablecalctype.html#movingaverage","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":409,"kind":16,"name":"YTDTotal","url":"enums/tableau.quicktablecalctype.html#ytdtotal","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":410,"kind":16,"name":"CompoundGrowthRate","url":"enums/tableau.quicktablecalctype.html#compoundgrowthrate","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":411,"kind":16,"name":"YearOverYearGrowth","url":"enums/tableau.quicktablecalctype.html#yearoveryeargrowth","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":412,"kind":16,"name":"YTDGrowth","url":"enums/tableau.quicktablecalctype.html#ytdgrowth","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":413,"kind":16,"name":"Undefined","url":"enums/tableau.quicktablecalctype.html#undefined","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.QuickTableCalcType"},{"id":414,"kind":4,"name":"SelectionUpdateType","url":"enums/tableau.selectionupdatetype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":415,"kind":16,"name":"Replace","url":"enums/tableau.selectionupdatetype.html#replace","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SelectionUpdateType"},{"id":416,"kind":16,"name":"Add","url":"enums/tableau.selectionupdatetype.html#add","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SelectionUpdateType"},{"id":417,"kind":16,"name":"Remove","url":"enums/tableau.selectionupdatetype.html#remove","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SelectionUpdateType"},{"id":418,"kind":4,"name":"SheetType","url":"enums/tableau.sheettype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":419,"kind":16,"name":"Dashboard","url":"enums/tableau.sheettype.html#dashboard","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SheetType"},{"id":420,"kind":16,"name":"Story","url":"enums/tableau.sheettype.html#story","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SheetType"},{"id":421,"kind":16,"name":"Worksheet","url":"enums/tableau.sheettype.html#worksheet","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SheetType"},{"id":422,"kind":4,"name":"SortDirection","url":"enums/tableau.sortdirection.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":423,"kind":16,"name":"Increasing","url":"enums/tableau.sortdirection.html#increasing","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SortDirection"},{"id":424,"kind":16,"name":"Decreasing","url":"enums/tableau.sortdirection.html#decreasing","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.SortDirection"},{"id":425,"kind":4,"name":"TableauEventType","url":"enums/tableau.tableaueventtype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":426,"kind":16,"name":"FilterChanged","url":"enums/tableau.tableaueventtype.html#filterchanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":427,"kind":16,"name":"MarkSelectionChanged","url":"enums/tableau.tableaueventtype.html#markselectionchanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":428,"kind":16,"name":"ParameterChanged","url":"enums/tableau.tableaueventtype.html#parameterchanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":429,"kind":16,"name":"SettingsChanged","url":"enums/tableau.tableaueventtype.html#settingschanged","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TableauEventType"},{"id":430,"kind":4,"name":"TrendLineModelType","url":"enums/tableau.trendlinemodeltype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":431,"kind":16,"name":"Linear","url":"enums/tableau.trendlinemodeltype.html#linear","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":432,"kind":16,"name":"Logarithmic","url":"enums/tableau.trendlinemodeltype.html#logarithmic","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":433,"kind":16,"name":"Exponential","url":"enums/tableau.trendlinemodeltype.html#exponential","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":434,"kind":16,"name":"Polynomial","url":"enums/tableau.trendlinemodeltype.html#polynomial","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.TrendLineModelType"},{"id":435,"kind":4,"name":"ZoneVisibilityType","url":"enums/tableau.zonevisibilitytype.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":436,"kind":16,"name":"Show","url":"enums/tableau.zonevisibilitytype.html#show","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ZoneVisibilityType"},{"id":437,"kind":16,"name":"Hide","url":"enums/tableau.zonevisibilitytype.html#hide","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.ZoneVisibilityType"},{"id":438,"kind":4,"name":"IncludeDataValuesOption","url":"enums/tableau.includedatavaluesoption.html","classes":"tsd-kind-enum tsd-parent-kind-module","parent":"Tableau"},{"id":439,"kind":16,"name":"AllValues","url":"enums/tableau.includedatavaluesoption.html#allvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.IncludeDataValuesOption"},{"id":440,"kind":16,"name":"OnlyNativeValues","url":"enums/tableau.includedatavaluesoption.html#onlynativevalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.IncludeDataValuesOption"},{"id":441,"kind":16,"name":"OnlyFormattedValues","url":"enums/tableau.includedatavaluesoption.html#onlyformattedvalues","classes":"tsd-kind-enum-member tsd-parent-kind-enum","parent":"Tableau.IncludeDataValuesOption"},{"id":442,"kind":32,"name":"extensions","url":"modules/tableau.html#extensions","classes":"tsd-kind-variable tsd-parent-kind-module","parent":"Tableau"},{"id":443,"kind":256,"name":"DataSource","url":"interfaces/datasource.html","classes":"tsd-kind-interface"},{"id":444,"kind":1024,"name":"name","url":"interfaces/datasource.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":445,"kind":1024,"name":"id","url":"interfaces/datasource.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":446,"kind":1024,"name":"fields","url":"interfaces/datasource.html#fields","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":447,"kind":1024,"name":"extractUpdateTime","url":"interfaces/datasource.html#extractupdatetime","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":448,"kind":1024,"name":"isExtract","url":"interfaces/datasource.html#isextract","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSource"},{"id":449,"kind":2048,"name":"refreshAsync","url":"interfaces/datasource.html#refreshasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":450,"kind":2048,"name":"getActiveTablesAsync","url":"interfaces/datasource.html#getactivetablesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":451,"kind":2048,"name":"getConnectionSummariesAsync","url":"interfaces/datasource.html#getconnectionsummariesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":452,"kind":2048,"name":"getUnderlyingDataAsync","url":"interfaces/datasource.html#getunderlyingdataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":453,"kind":2048,"name":"getLogicalTablesAsync","url":"interfaces/datasource.html#getlogicaltablesasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":454,"kind":2048,"name":"getLogicalTableDataAsync","url":"interfaces/datasource.html#getlogicaltabledataasync","classes":"tsd-kind-method tsd-parent-kind-interface","parent":"DataSource"},{"id":455,"kind":256,"name":"Field","url":"interfaces/field.html","classes":"tsd-kind-interface"},{"id":456,"kind":1024,"name":"name","url":"interfaces/field.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":457,"kind":1024,"name":"id","url":"interfaces/field.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":458,"kind":1024,"name":"description","url":"interfaces/field.html#description","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":459,"kind":1024,"name":"dataSource","url":"interfaces/field.html#datasource","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":460,"kind":1024,"name":"role","url":"interfaces/field.html#role","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":461,"kind":1024,"name":"isHidden","url":"interfaces/field.html#ishidden","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":462,"kind":1024,"name":"isGenerated","url":"interfaces/field.html#isgenerated","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":463,"kind":1024,"name":"isCalculatedField","url":"interfaces/field.html#iscalculatedfield","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":464,"kind":1024,"name":"aggregation","url":"interfaces/field.html#aggregation","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":465,"kind":1024,"name":"columnType","url":"interfaces/field.html#columntype","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":466,"kind":1024,"name":"isCombinedField","url":"interfaces/field.html#iscombinedfield","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Field"},{"id":467,"kind":256,"name":"ConnectionSummary","url":"interfaces/connectionsummary.html","classes":"tsd-kind-interface"},{"id":468,"kind":1024,"name":"name","url":"interfaces/connectionsummary.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":469,"kind":1024,"name":"id","url":"interfaces/connectionsummary.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":470,"kind":1024,"name":"type","url":"interfaces/connectionsummary.html#type","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":471,"kind":1024,"name":"serverURI","url":"interfaces/connectionsummary.html#serveruri","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"ConnectionSummary"},{"id":472,"kind":256,"name":"TableSummary","url":"interfaces/tablesummary.html","classes":"tsd-kind-interface"},{"id":473,"kind":1024,"name":"name","url":"interfaces/tablesummary.html#name","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":474,"kind":1024,"name":"id","url":"interfaces/tablesummary.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":475,"kind":1024,"name":"connectionId","url":"interfaces/tablesummary.html#connectionid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":476,"kind":1024,"name":"customSQL","url":"interfaces/tablesummary.html#customsql","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableSummary"},{"id":477,"kind":256,"name":"DataSourceUnderlyingDataOptions","url":"interfaces/datasourceunderlyingdataoptions.html","classes":"tsd-kind-interface"},{"id":478,"kind":1024,"name":"ignoreAliases","url":"interfaces/datasourceunderlyingdataoptions.html#ignorealiases","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":479,"kind":1024,"name":"columnsToInclude","url":"interfaces/datasourceunderlyingdataoptions.html#columnstoinclude","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":480,"kind":1024,"name":"columnsToIncludeById","url":"interfaces/datasourceunderlyingdataoptions.html#columnstoincludebyid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":481,"kind":1024,"name":"maxRows","url":"interfaces/datasourceunderlyingdataoptions.html#maxrows","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":482,"kind":1024,"name":"includeDataValuesOption","url":"interfaces/datasourceunderlyingdataoptions.html#includedatavaluesoption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"DataSourceUnderlyingDataOptions"},{"id":483,"kind":256,"name":"LogicalTable","url":"interfaces/logicaltable.html","classes":"tsd-kind-interface"},{"id":484,"kind":1024,"name":"id","url":"interfaces/logicaltable.html#id","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"LogicalTable"},{"id":485,"kind":1024,"name":"caption","url":"interfaces/logicaltable.html#caption","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"LogicalTable"},{"id":486,"kind":256,"name":"TableauError","url":"interfaces/tableauerror.html","classes":"tsd-kind-interface"},{"id":487,"kind":1024,"name":"errorCode","url":"interfaces/tableauerror.html#errorcode","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauError"},{"id":488,"kind":1024,"name":"name","url":"interfaces/tableauerror.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauError"},{"id":489,"kind":1024,"name":"message","url":"interfaces/tableauerror.html#message","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauError"},{"id":490,"kind":1024,"name":"stack","url":"interfaces/tableauerror.html#stack","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"TableauError"},{"id":491,"kind":1024,"name":"Error","url":"interfaces/tableauerror.html#error","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"TableauError"}]}; \ No newline at end of file diff --git a/docs/enums/tableau.analyticsobjecttype.html b/docs/enums/tableau.analyticsobjecttype.html index b46e6610..b05c9e33 100644 --- a/docs/enums/tableau.analyticsobjecttype.html +++ b/docs/enums/tableau.analyticsobjecttype.html @@ -90,7 +90,7 @@

Cluster

Cluster: = "cluster"
@@ -100,7 +100,7 @@

Forecast

Forecast: = "forecast"
@@ -110,7 +110,7 @@

TrendLine

TrendLine: = "trend-line"
@@ -189,6 +189,9 @@

TrendLine

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.columntype.html b/docs/enums/tableau.columntype.html index 89a6c37b..483e6afd 100644 --- a/docs/enums/tableau.columntype.html +++ b/docs/enums/tableau.columntype.html @@ -89,7 +89,7 @@

    Continuous

    Continuous: = "continuous"
    @@ -99,7 +99,7 @@

    Discrete

    Discrete: = "discrete"
    @@ -175,6 +175,9 @@

    Discrete

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.dashboardobjecttype.html b/docs/enums/tableau.dashboardobjecttype.html index a868a4c0..5dd8c1d1 100644 --- a/docs/enums/tableau.dashboardobjecttype.html +++ b/docs/enums/tableau.dashboardobjecttype.html @@ -105,7 +105,7 @@

    Blank

    Blank: = "blank"
    @@ -115,7 +115,7 @@

    Extension

    Extension: = "extension"
    @@ -125,7 +125,7 @@

    Image

    Image: = "image"
    @@ -135,7 +135,7 @@

    Legend

    Legend: = "legend"
    @@ -145,7 +145,7 @@

    PageFilter

    PageFilter: = "page-filter"
    @@ -155,7 +155,7 @@

    ParameterControl

    ParameterControl: = "parameter-control"
    @@ -165,7 +165,7 @@

    QuickFilter

    QuickFilter: = "quick-filter"
    @@ -175,7 +175,7 @@

    Text

    Text: = "text"
    @@ -185,7 +185,7 @@

    Title

    Title: = "title"
    @@ -195,7 +195,7 @@

    WebPage

    WebPage: = "web-page"
    @@ -205,7 +205,7 @@

    Worksheet

    Worksheet: = "worksheet"
    @@ -308,6 +308,9 @@

    Worksheet

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.datatype.html b/docs/enums/tableau.datatype.html index 05cc9fe3..f2695222 100644 --- a/docs/enums/tableau.datatype.html +++ b/docs/enums/tableau.datatype.html @@ -101,7 +101,7 @@

    Bool

    Bool: = "bool"
    @@ -111,7 +111,7 @@

    Date

    Date: = "date"
    @@ -121,7 +121,7 @@

    DateTime

    DateTime: = "date-time"
    @@ -131,7 +131,7 @@

    Float

    Float: = "float"
    @@ -141,7 +141,7 @@

    Int

    Int: = "int"
    @@ -151,7 +151,7 @@

    Spatial

    Spatial: = "spatial"
    @@ -161,7 +161,7 @@

    String

    String: = "string"
    @@ -252,6 +252,9 @@

    String

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.daterangetype.html b/docs/enums/tableau.daterangetype.html index 87499d38..988c177b 100644 --- a/docs/enums/tableau.daterangetype.html +++ b/docs/enums/tableau.daterangetype.html @@ -100,7 +100,7 @@

    Current

    Current: = "current"
    @@ -110,7 +110,7 @@

    Last

    Last: = "last"
    @@ -120,7 +120,7 @@

    LastN

    LastN: = "last-n"
    @@ -130,7 +130,7 @@

    Next

    Next: = "next"
    @@ -140,7 +140,7 @@

    NextN

    NextN: = "next-n"
    @@ -150,7 +150,7 @@

    ToDate

    ToDate: = "to-date"
    @@ -238,6 +238,9 @@

    ToDate

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.encodingtype.html b/docs/enums/tableau.encodingtype.html index ccc266fa..0c9f763a 100644 --- a/docs/enums/tableau.encodingtype.html +++ b/docs/enums/tableau.encodingtype.html @@ -101,7 +101,7 @@

    Angle

    Angle: = "angle"
    @@ -111,7 +111,7 @@

    Color

    Color: = "color"
    @@ -121,7 +121,7 @@

    Column

    Column: = "column"
    @@ -131,7 +131,7 @@

    Detail

    Detail: = "detail"
    @@ -141,7 +141,7 @@

    Filter

    Filter: = "filter"
    @@ -151,7 +151,7 @@

    Label

    Label: = "label"
    @@ -161,7 +161,7 @@

    MarksType

    MarksType: = "marks-type"
    @@ -171,7 +171,7 @@

    MeasureValues

    MeasureValues: = "measure-values"
    @@ -181,7 +181,7 @@

    Page

    Page: = "page"
    @@ -191,7 +191,7 @@

    Path

    Path: = "path"
    @@ -201,7 +201,7 @@

    Row

    Row: = "row"
    @@ -211,7 +211,7 @@

    Shape

    Shape: = "shape"
    @@ -221,7 +221,7 @@

    Size

    Size: = "size"
    @@ -231,7 +231,7 @@

    Tooltip

    Tooltip: = "tooltip"
    @@ -343,6 +343,9 @@

    Tooltip

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.errorcodes.html b/docs/enums/tableau.errorcodes.html index 77328445..1c535c27 100644 --- a/docs/enums/tableau.errorcodes.html +++ b/docs/enums/tableau.errorcodes.html @@ -107,7 +107,7 @@

    APINotInitialized

    APINotInitialized: = "api-not-initialized"
    @@ -122,7 +122,7 @@

    DialogAlreadyOpen

    DialogAlreadyOpen: = "dialog-already-open"
    @@ -137,7 +137,7 @@

    DialogClosedByUser

    DialogClosedByUser: = "dialog-closed-by-user"
    @@ -152,7 +152,7 @@

    InternalError

    InternalError: = "internal-error"
    @@ -167,7 +167,7 @@

    InvalidDomainDialog

    InvalidDomainDialog: = "invalid-dialog-domain"
    @@ -182,7 +182,7 @@

    InvalidParameter

    InvalidParameter: = "invalid-parameter"
    @@ -197,7 +197,7 @@

    MissingFilter

    MissingFilter: = "missing-filter"
    @@ -212,7 +212,7 @@

    MissingParameter

    MissingParameter: = "missing-parameter"
    @@ -227,7 +227,7 @@

    ServerError

    ServerError: = "server-error"
    @@ -242,7 +242,7 @@

    SettingSaveInProgress

    SettingSaveInProgress: = "setting-save-in-progress"
    @@ -257,7 +257,7 @@

    UnsupportedEventName

    UnsupportedEventName: = "unsupported-event-name"
    @@ -272,7 +272,7 @@

    UnsupportedMethodForDataSourceType

    UnsupportedMethodForDataSourceType: = "unsupported-method-for-data-source-type"
    @@ -287,7 +287,7 @@

    VisibilityError

    VisibilityError: = "visibility-error"
    @@ -401,6 +401,9 @@

    VisibilityError

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.extensioncontext.html b/docs/enums/tableau.extensioncontext.html index 6f228dcf..b1ca5fb6 100644 --- a/docs/enums/tableau.extensioncontext.html +++ b/docs/enums/tableau.extensioncontext.html @@ -96,7 +96,7 @@

    Desktop

    Desktop: = "desktop"
    @@ -106,7 +106,7 @@

    Server

    Server: = "server"
    @@ -182,6 +182,9 @@

    Server

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.extensionmode.html b/docs/enums/tableau.extensionmode.html index ef35d7ec..f7183b1b 100644 --- a/docs/enums/tableau.extensionmode.html +++ b/docs/enums/tableau.extensionmode.html @@ -96,7 +96,7 @@

    Authoring

    Authoring: = "authoring"
    @@ -106,7 +106,7 @@

    Viewing

    Viewing: = "viewing"
    @@ -182,6 +182,9 @@

    Viewing

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.fieldaggregationtype.html b/docs/enums/tableau.fieldaggregationtype.html index f9f8bf58..fe9b6340 100644 --- a/docs/enums/tableau.fieldaggregationtype.html +++ b/docs/enums/tableau.fieldaggregationtype.html @@ -133,7 +133,7 @@

    Attr

    Attr: = "attr"
    @@ -143,7 +143,7 @@

    Avg

    Avg: = "avg"
    @@ -153,7 +153,7 @@

    Count

    Count: = "count"
    @@ -163,7 +163,7 @@

    Countd

    Countd: = "countd"
    @@ -173,7 +173,7 @@

    Day

    Day: = "day"
    @@ -183,7 +183,7 @@

    End

    End: = "end"
    @@ -193,7 +193,7 @@

    Hour

    Hour: = "hour"
    @@ -203,7 +203,7 @@

    InOut

    InOut: = "in-out"
    @@ -213,7 +213,7 @@

    Kurtosis

    Kurtosis: = "kurtosis"
    @@ -223,7 +223,7 @@

    Max

    Max: = "max"
    @@ -233,7 +233,7 @@

    Mdy

    Mdy: = "mdy"
    @@ -243,7 +243,7 @@

    Median

    Median: = "median"
    @@ -253,7 +253,7 @@

    Min

    Min: = "min"
    @@ -263,7 +263,7 @@

    Minute

    Minute: = "minute"
    @@ -273,7 +273,7 @@

    Month

    Month: = "month"
    @@ -283,7 +283,7 @@

    MonthYear

    MonthYear: = "month-year"
    @@ -293,7 +293,7 @@

    None

    None: = "none"
    @@ -303,7 +303,7 @@

    Qtr

    Qtr: = "qtr"
    @@ -313,7 +313,7 @@

    Quart1

    Quart1: = "quart1"
    @@ -323,7 +323,7 @@

    Quart3

    Quart3: = "quart3"
    @@ -333,7 +333,7 @@

    Second

    Second: = "second"
    @@ -343,7 +343,7 @@

    Skewness

    Skewness: = "skewness"
    @@ -353,7 +353,7 @@

    Stdev

    Stdev: = "stdev"
    @@ -363,7 +363,7 @@

    Stdevp

    Stdevp: = "stdevp"
    @@ -373,7 +373,7 @@

    Sum

    Sum: = "sum"
    @@ -383,7 +383,7 @@

    TruncDay

    TruncDay: = "trunc-day"
    @@ -393,7 +393,7 @@

    TruncHour

    TruncHour: = "trunc-hour"
    @@ -403,7 +403,7 @@

    TruncMinute

    TruncMinute: = "trunc-minute"
    @@ -413,7 +413,7 @@

    TruncMonth

    TruncMonth: = "trunc-month"
    @@ -423,7 +423,7 @@

    TruncQtr

    TruncQtr: = "trunc-qtr"
    @@ -433,7 +433,7 @@

    TruncSecond

    TruncSecond: = "trunc-second"
    @@ -443,7 +443,7 @@

    TruncWeek

    TruncWeek: = "trunc-week"
    @@ -453,7 +453,7 @@

    TruncYear

    TruncYear: = "trunc-year"
    @@ -463,7 +463,7 @@

    User

    User: = "user"
    @@ -473,7 +473,7 @@

    Var

    Var: = "var"
    @@ -483,7 +483,7 @@

    Varp

    Varp: = "varp"
    @@ -493,7 +493,7 @@

    Week

    Week: = "week"
    @@ -503,7 +503,7 @@

    Weekday

    Weekday: = "weekday"
    @@ -513,7 +513,7 @@

    Year

    Year: = "year"
    @@ -700,6 +700,9 @@

    Year

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.fieldroletype.html b/docs/enums/tableau.fieldroletype.html index ec9d2932..286b512e 100644 --- a/docs/enums/tableau.fieldroletype.html +++ b/docs/enums/tableau.fieldroletype.html @@ -97,7 +97,7 @@

    Dimension

    Dimension: = "dimension"
    @@ -107,7 +107,7 @@

    Measure

    Measure: = "measure"
    @@ -117,7 +117,7 @@

    Unknown

    Unknown: = "unknown"
    @@ -196,6 +196,9 @@

    Unknown

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.filterdomaintype.html b/docs/enums/tableau.filterdomaintype.html index febcf5f7..be0344fc 100644 --- a/docs/enums/tableau.filterdomaintype.html +++ b/docs/enums/tableau.filterdomaintype.html @@ -96,7 +96,7 @@

    Database

    Database: = "database"
    @@ -111,7 +111,7 @@

    Relevant

    Relevant: = "relevant"
    @@ -193,6 +193,9 @@

    Relevant

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.filternulloption.html b/docs/enums/tableau.filternulloption.html index f4154a98..8fa4a369 100644 --- a/docs/enums/tableau.filternulloption.html +++ b/docs/enums/tableau.filternulloption.html @@ -98,7 +98,7 @@

    AllValues

    AllValues: = "all-values"
    @@ -108,7 +108,7 @@

    NonNullValues

    NonNullValues: = "non-null-values"
    @@ -118,7 +118,7 @@

    NullValues

    NullValues: = "null-values"
    @@ -197,6 +197,9 @@

    NullValues

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.filtertype.html b/docs/enums/tableau.filtertype.html index 19765575..2e1d2bfc 100644 --- a/docs/enums/tableau.filtertype.html +++ b/docs/enums/tableau.filtertype.html @@ -98,7 +98,7 @@

    Categorical

    Categorical: = "categorical"
    @@ -108,7 +108,7 @@

    Hierarchical

    Hierarchical: = "hierarchical"
    @@ -118,7 +118,7 @@

    Range

    Range: = "range"
    @@ -128,7 +128,7 @@

    RelativeDate

    RelativeDate: = "relative-date"
    @@ -210,6 +210,9 @@

    RelativeDate

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/enums/tableau.filterupdatetype.html b/docs/enums/tableau.filterupdatetype.html index 572f3a30..7fe50c05 100644 --- a/docs/enums/tableau.filterupdatetype.html +++ b/docs/enums/tableau.filterupdatetype.html @@ -98,7 +98,7 @@

    Add

    Add: = "add"
    @@ -108,7 +108,7 @@

    All

    All: = "all"
    @@ -118,7 +118,7 @@

    Remove

    Remove: = "remove"
    @@ -128,7 +128,7 @@

    Replace

    Replace: = "replace"
    @@ -210,6 +210,9 @@

    Replace

      +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.includedatavaluesoption.html b/docs/enums/tableau.includedatavaluesoption.html new file mode 100644 index 00000000..fd20452b --- /dev/null +++ b/docs/enums/tableau.includedatavaluesoption.html @@ -0,0 +1,336 @@ + + + + + + IncludeDataValuesOption | Dashboard Extensions + + + + + +
      +
      +
      +
      + +
      +
      + Options +
      +
      + All +
        +
      • Public
      • +
      • Public/Protected
      • +
      • All
      • +
      +
      + + + + +
      +
      + Menu +
      +
      +
      +
      +
      +
      + +

      Enumeration IncludeDataValuesOption

      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Enum that serves as a filter on the DataValues returned from getSummaryDataAsync, + getUnderlyingTableDataAsync and getLogicalTableDataAsync. + All properties not requested will be undefined in the DataValue results. + This is a performance optimization only, and will be ignored in Tableau versions prior to 2021.2.

      +
      +
      +
      since
      +

      1.5.0

      +
      +
      +
      +
      +
      +

      Index

      +
      +
      +
      +

      Enumeration members

      + +
      +
      +
      +
      +
      +

      Enumeration members

      +
      + +

      AllValues

      +
      AllValues: = "all-values"
      + +
      +
      +

      DataValues will include all properties.

      +
      +
      +
      +
      + +

      OnlyFormattedValues

      +
      OnlyFormattedValues: = "only-formatted-values"
      + +
      +
      +

      DataValues will only include formattedValue properties.

      +
      +
      +
      +
      + +

      OnlyNativeValues

      +
      OnlyNativeValues: = "only-native-values"
      + +
      +
      +

      DataValues will only include value and nativeValue properties.

      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +

      Legend

      +
      +
        +
      • Module
      • +
      • Object literal
      • +
      • Variable
      • +
      • Function
      • +
      • Function with type parameter
      • +
      • Index signature
      • +
      • Type alias
      • +
      • Type alias with type parameter
      • +
      +
        +
      • Enumeration
      • +
      • Enumeration member
      • +
      • Property
      • +
      • Method
      • +
      +
        +
      • Interface
      • +
      • Interface with type parameter
      • +
      • Constructor
      • +
      • Property
      • +
      • Method
      • +
      • Index signature
      • +
      +
        +
      • Class
      • +
      • Class with type parameter
      • +
      • Constructor
      • +
      • Property
      • +
      • Method
      • +
      • Accessor
      • +
      • Index signature
      • +
      +
        +
      • Inherited constructor
      • +
      • Inherited property
      • +
      • Inherited method
      • +
      • Inherited accessor
      • +
      +
        +
      • Protected property
      • +
      • Protected method
      • +
      • Protected accessor
      • +
      +
        +
      • Private property
      • +
      • Private method
      • +
      • Private accessor
      • +
      +
        +
      • Static property
      • +
      • Static method
      • +
      +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/docs/enums/tableau.marktype.html b/docs/enums/tableau.marktype.html index a20d4bf1..dc08a077 100644 --- a/docs/enums/tableau.marktype.html +++ b/docs/enums/tableau.marktype.html @@ -105,7 +105,7 @@

      Area

      Area: = "area"
      @@ -115,7 +115,7 @@

      Bar

      Bar: = "bar"
      @@ -125,7 +125,7 @@

      Circle

      Circle: = "circle"
      @@ -135,7 +135,7 @@

      GanttBar

      GanttBar: = "gantt-bar"
      @@ -145,7 +145,7 @@

      Line

      Line: = "line"
      @@ -155,7 +155,7 @@

      Map

      Map: = "map"
      @@ -165,7 +165,7 @@

      Pie

      Pie: = "pie"
      @@ -175,7 +175,7 @@

      Polygon

      Polygon: = "polygon"
      @@ -185,7 +185,7 @@

      Shape

      Shape: = "shape"
      @@ -195,7 +195,7 @@

      Square

      Square: = "square"
      @@ -205,7 +205,7 @@

      Text

      Text: = "text"
      @@ -269,6 +269,9 @@

      Text

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • diff --git a/docs/enums/tableau.parametervaluetype.html b/docs/enums/tableau.parametervaluetype.html index 34670300..8d871c5c 100644 --- a/docs/enums/tableau.parametervaluetype.html +++ b/docs/enums/tableau.parametervaluetype.html @@ -98,7 +98,7 @@

      All

      All: = "all"
      @@ -108,7 +108,7 @@

      List

      List: = "list"
      @@ -118,7 +118,7 @@

      Range

      Range: = "range"
      @@ -182,6 +182,9 @@

      Range

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.periodtype.html b/docs/enums/tableau.periodtype.html index 089fc459..84043551 100644 --- a/docs/enums/tableau.periodtype.html +++ b/docs/enums/tableau.periodtype.html @@ -102,7 +102,7 @@

      Days

      Days: = "days"
      @@ -112,7 +112,7 @@

      Hours

      Hours: = "hours"
      @@ -122,7 +122,7 @@

      Minutes

      Minutes: = "minutes"
      @@ -132,7 +132,7 @@

      Months

      Months: = "months"
      @@ -142,7 +142,7 @@

      Quarters

      Quarters: = "quarters"
      @@ -152,7 +152,7 @@

      Seconds

      Seconds: = "seconds"
      @@ -162,7 +162,7 @@

      Weeks

      Weeks: = "weeks"
      @@ -172,7 +172,7 @@

      Years

      Years: = "years"
      @@ -236,6 +236,9 @@

      Years

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.quicktablecalctype.html b/docs/enums/tableau.quicktablecalctype.html index 94c50fbc..6dbbe180 100644 --- a/docs/enums/tableau.quicktablecalctype.html +++ b/docs/enums/tableau.quicktablecalctype.html @@ -99,7 +99,7 @@

      CompoundGrowthRate

      CompoundGrowthRate: = "compound-growth-rate"
      @@ -109,7 +109,7 @@

      Difference

      Difference: = "difference"
      @@ -119,7 +119,7 @@

      MovingAverage

      MovingAverage: = "moving-average"
      @@ -129,7 +129,7 @@

      PercentDifference

      PercentDifference: = "percent-difference"
      @@ -139,7 +139,7 @@

      PercentOfTotal

      PercentOfTotal: = "percent-of-total"
      @@ -149,7 +149,7 @@

      Percentile

      Percentile: = "percentile"
      @@ -159,7 +159,7 @@

      Rank

      Rank: = "rank"
      @@ -169,7 +169,7 @@

      RunningTotal

      RunningTotal: = "running-total"
      @@ -179,7 +179,7 @@

      Undefined

      Undefined: = "undefined"
      @@ -189,7 +189,7 @@

      YTDGrowth

      YTDGrowth: = "ytd-growth"
      @@ -199,7 +199,7 @@

      YTDTotal

      YTDTotal: = "ytd-total"
      @@ -209,7 +209,7 @@

      YearOverYearGrowth

      YearOverYearGrowth: = "year-over-year-growth"
      @@ -273,6 +273,9 @@

      YearOverYearGrowth

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.selectionupdatetype.html b/docs/enums/tableau.selectionupdatetype.html index c493f7bc..49c61a1b 100644 --- a/docs/enums/tableau.selectionupdatetype.html +++ b/docs/enums/tableau.selectionupdatetype.html @@ -97,7 +97,7 @@

      Add

      Add: = "select-add"
      @@ -107,7 +107,7 @@

      Remove

      Remove: = "select-remove"
      @@ -117,7 +117,7 @@

      Replace

      Replace: = "select-replace"
      @@ -181,6 +181,9 @@

      Replace

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.sheettype.html b/docs/enums/tableau.sheettype.html index 29ac1c83..35261cb4 100644 --- a/docs/enums/tableau.sheettype.html +++ b/docs/enums/tableau.sheettype.html @@ -97,7 +97,7 @@

      Dashboard

      Dashboard: = "dashboard"
      @@ -107,7 +107,7 @@

      Story

      Story: = "story"
      @@ -117,7 +117,7 @@

      Worksheet

      Worksheet: = "worksheet"
      @@ -181,6 +181,9 @@

      Worksheet

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.sortdirection.html b/docs/enums/tableau.sortdirection.html index 707987bc..f6655c70 100644 --- a/docs/enums/tableau.sortdirection.html +++ b/docs/enums/tableau.sortdirection.html @@ -89,7 +89,7 @@

      Decreasing

      Decreasing: = "decreasing"
      @@ -99,7 +99,7 @@

      Increasing

      Increasing: = "increasing"
      @@ -163,6 +163,9 @@

      Increasing

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.tableaueventtype.html b/docs/enums/tableau.tableaueventtype.html index f76d1c09..3d597327 100644 --- a/docs/enums/tableau.tableaueventtype.html +++ b/docs/enums/tableau.tableaueventtype.html @@ -98,7 +98,7 @@

      FilterChanged

      FilterChanged: = "filter-changed"
      @@ -113,7 +113,7 @@

      MarkSelectionChanged

      MarkSelectionChanged: = "mark-selection-changed"
      @@ -128,7 +128,7 @@

      ParameterChanged

      ParameterChanged: = "parameter-changed"
      @@ -143,7 +143,7 @@

      SettingsChanged

      SettingsChanged: = "settings-changed"
      @@ -212,6 +212,9 @@

      SettingsChanged

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.trendlinemodeltype.html b/docs/enums/tableau.trendlinemodeltype.html index ac5f75f9..ccd40ac5 100644 --- a/docs/enums/tableau.trendlinemodeltype.html +++ b/docs/enums/tableau.trendlinemodeltype.html @@ -91,7 +91,7 @@

      Exponential

      Exponential: = "exponential"
      @@ -101,7 +101,7 @@

      Linear

      Linear: = "linear"
      @@ -111,7 +111,7 @@

      Logarithmic

      Logarithmic: = "logarithmic"
      @@ -121,7 +121,7 @@

      Polynomial

      Polynomial: = "polynomial"
      @@ -185,6 +185,9 @@

      Polynomial

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/enums/tableau.zonevisibilitytype.html b/docs/enums/tableau.zonevisibilitytype.html index 7fc15a89..35e6de1e 100644 --- a/docs/enums/tableau.zonevisibilitytype.html +++ b/docs/enums/tableau.zonevisibilitytype.html @@ -101,7 +101,7 @@

      Hide

      Hide: = "hide"
      @@ -116,7 +116,7 @@

      Show

      Show: = "show"
      @@ -185,6 +185,9 @@

      Show

    • FilterUpdateType
    • +
    • + IncludeDataValuesOption +
    • MarkType
    • diff --git a/docs/globals.html b/docs/globals.html index bc48e8c3..a321c884 100644 --- a/docs/globals.html +++ b/docs/globals.html @@ -144,7 +144,7 @@

      CategoricalValue

      CategoricalValue: string | Array<string>
      @@ -159,7 +159,7 @@

      TableauEventHandlerFn

      TableauEventHandlerFn: function
      @@ -200,7 +200,7 @@

      TableauEventUnregisterFn

      TableauEventUnregisterFn: function
      @@ -236,7 +236,7 @@

      ZoneVisibilityMap

      ZoneVisibilityMap: Map<number, ZoneVisibilityType> | object
      diff --git a/docs/interfaces/categoricaldomain.html b/docs/interfaces/categoricaldomain.html index 1d0f7901..f4a1ba8f 100644 --- a/docs/interfaces/categoricaldomain.html +++ b/docs/interfaces/categoricaldomain.html @@ -101,7 +101,7 @@

      type

      @@ -118,7 +118,7 @@

      values

      values: Array<DataValue>
      diff --git a/docs/interfaces/categoricalfilter.html b/docs/interfaces/categoricalfilter.html index 0a9efc9c..10826936 100644 --- a/docs/interfaces/categoricalfilter.html +++ b/docs/interfaces/categoricalfilter.html @@ -118,7 +118,7 @@

      appliedValues

      appliedValues: Array<DataValue>
      @@ -136,7 +136,7 @@

      fieldId

      @@ -154,7 +154,7 @@

      fieldName

      @@ -173,7 +173,7 @@

      filterType

      @@ -190,7 +190,7 @@

      Optional isAllSelect
      isAllSelected: undefined | false | true
      @@ -209,7 +209,7 @@

      isExcludeMode

      isExcludeMode: boolean
      @@ -227,7 +227,7 @@

      worksheetName

      @@ -251,7 +251,7 @@

      getDomainAsync

    • @@ -278,10 +278,15 @@

      getFieldAsync

      +
      +
      since
      +

      1.5.0 Fixed to properly return the field. Also requires Tableau 2019.2+.

      +
      +

      Returns Promise<Field>

      a promise containing the field for the filter.

      diff --git a/docs/interfaces/column.html b/docs/interfaces/column.html index 676c0423..68127450 100644 --- a/docs/interfaces/column.html +++ b/docs/interfaces/column.html @@ -80,6 +80,7 @@

      Index

      Properties

      • dataType
      • +
      • fieldId
      • fieldName
      • index
      • isReferenced
      • @@ -96,7 +97,7 @@

        dataType

        dataType: DataType
        @@ -108,19 +109,44 @@

        dataType

        +
        + +

        fieldId

        +
        fieldId: string
        + +
        +
        +
        returns
        +

        The fieldId of the field in the column. In summary data, this includes the aggregation. + The fieldId is not stable across replacing data sources. + For example after replacing the data source [Clipboard_20210305T164000].[sum:Sales:qk] could become + [federated.12usuoq1171o1b1ebdyh60fjnev1].[sum:Sales:qk].

        +
        +
        since
        +

        1.5.0

        +
        +
        +
        +

        fieldName

        fieldName: string
        returns
        -

        The name of the column.

        +

        The name of the field in the column. In summary data, this includes the aggregation. + The summary data field name is not stable across languages. + For example, in an English version of Tableau, the field name might be SUM(Sales). In French, this would be SOMME(Sales).

        @@ -131,7 +157,7 @@

        index

        index: number
        @@ -148,7 +174,7 @@

        isReferenced

        isReferenced: boolean
        @@ -179,6 +205,9 @@

        isReferenced

      • dataType
      • +
      • + fieldId +
      • fieldName
      • diff --git a/docs/interfaces/connectionsummary.html b/docs/interfaces/connectionsummary.html index ec8411de..f2aac248 100644 --- a/docs/interfaces/connectionsummary.html +++ b/docs/interfaces/connectionsummary.html @@ -104,7 +104,7 @@

        id

        id: string
        @@ -121,7 +121,7 @@

        name

        name: string
        @@ -138,7 +138,7 @@

        serverURI

        serverURI: string | undefined
        @@ -155,7 +155,7 @@

        type

        type: string
        diff --git a/docs/interfaces/dashboard.html b/docs/interfaces/dashboard.html index aaf2ecca..16514096 100644 --- a/docs/interfaces/dashboard.html +++ b/docs/interfaces/dashboard.html @@ -120,7 +120,7 @@

        name

        @@ -137,7 +137,7 @@

        objects

        objects: Array<DashboardObject>
        @@ -155,7 +155,7 @@

        sheetType

        @@ -173,7 +173,7 @@

        size

        @@ -190,7 +190,7 @@

        worksheets

        worksheets: Array<Worksheet>
        @@ -229,7 +229,7 @@

        addEventListener

        @@ -311,7 +311,7 @@

        findParameterAsync

        @@ -344,7 +344,7 @@

        getParametersAsync

        @@ -365,7 +365,7 @@

        removeEventListener

        @@ -400,13 +400,13 @@

        setZoneVisibilityAsync

      • -

        Sets the visibility of one or more floating dashboard zones. - Throws an error if the zone is invalid or if the zone is not floating

        +

        Sets the visibility of one or more dashboard zones. + Throws an error if the zone is invalid

        since
        @@ -425,6 +425,9 @@

        setZoneVisibilityAsync

          var zoneVisibilityMap = new Map;
           zoneVisibilityMap.set(10, tableau.ZoneVisibilityType.Show);
           zoneVisibilityMap.set(8, tableau.ZoneVisibilityType.Hide);
        +
        since
        +

        1.5.0 The zone can be any zone in the dashboard. Previously, the zone must have been floating.

        +

        Parameters

        diff --git a/docs/interfaces/dashboardcontent.html b/docs/interfaces/dashboardcontent.html index 0d25b4d7..b4bbb9ff 100644 --- a/docs/interfaces/dashboardcontent.html +++ b/docs/interfaces/dashboardcontent.html @@ -102,7 +102,7 @@

        dashboard

        dashboard: Dashboard
        diff --git a/docs/interfaces/dashboardobject.html b/docs/interfaces/dashboardobject.html index 811edee7..c8a7991e 100644 --- a/docs/interfaces/dashboardobject.html +++ b/docs/interfaces/dashboardobject.html @@ -108,7 +108,7 @@

        dashboard

        dashboard: Dashboard
        @@ -125,7 +125,7 @@

        id

        id: number
        @@ -145,7 +145,7 @@

        isFloating

        isFloating: boolean
        @@ -165,7 +165,7 @@

        isVisible

        isVisible: boolean
        @@ -185,7 +185,7 @@

        name

        name: string
        @@ -205,7 +205,7 @@

        position

        position: Point
        @@ -222,7 +222,7 @@

        size

        size: Size
        @@ -239,7 +239,7 @@

        type

        @@ -256,7 +256,7 @@

        worksheet

        worksheet: Worksheet | undefined
        diff --git a/docs/interfaces/datasource.html b/docs/interfaces/datasource.html index 7133aa61..fd91b043 100644 --- a/docs/interfaces/datasource.html +++ b/docs/interfaces/datasource.html @@ -115,7 +115,7 @@

        extractUpdateTime

        extractUpdateTime: string | undefined
        @@ -132,7 +132,7 @@

        fields

        fields: Array<Field>
        @@ -149,7 +149,7 @@

        id

        id: string
        @@ -166,7 +166,7 @@

        isExtract

        isExtract: boolean
        @@ -183,7 +183,7 @@

        name

        name: string
        @@ -207,7 +207,7 @@

        getActiveTablesAsync

      • @@ -235,7 +235,7 @@

        getConnectionSummariesAsync

      • @@ -255,7 +255,7 @@

        getLogicalTableDataAsync

      • @@ -266,6 +266,13 @@

        getLogicalTableDataAsync

        since

        1.4.0

        +
        since
        +

        1.5.0 Use the DataSourceUnderlyingDataOptions.includeDataValuesOption option to optimize performance + by restricting the properties included in the returned DataValues.

        +
        +
        since
        +

        1.5.0 Columns to include can be specified by id using the DataSourceUnderlyingDataOptions.columnsToIncludeById option.

        +

        Parameters

        @@ -281,7 +288,7 @@
        Optional options: Returns Promise<DataTable>
        -

        Returns a promise containing a page of data from the underlying data of the data source.

        +

        A data table containing the underlying data of the data source.

        The following example shows use of the getLogicalTableDataAsync() method to get the data from a specific logical table in a data source. The example uses the JavaScript find() method to select the workbook, @@ -315,7 +322,7 @@

        getLogicalTablesAsync

      • @@ -351,7 +358,7 @@

        getUnderlyingDataAsync

      • @@ -400,7 +407,7 @@

        refreshAsync

      • diff --git a/docs/interfaces/datasourceunderlyingdataoptions.html b/docs/interfaces/datasourceunderlyingdataoptions.html index 8b305ad1..d208856c 100644 --- a/docs/interfaces/datasourceunderlyingdataoptions.html +++ b/docs/interfaces/datasourceunderlyingdataoptions.html @@ -87,7 +87,9 @@

        Index

        Properties

      • @@ -102,22 +104,43 @@

        Optional columnsToInclude
        columnsToInclude: Array<string>
        -

        The columns to return by name, returns all by default.

        +

        The columns to return specified by field name, returns all by default.

        +
        + +

        Optional columnsToIncludeById

        +
        columnsToIncludeById: Array<string>
        + +
        +
        +

        The columns to return specified by field id, returns all by default. + Since 1.5.0, fieldId is a property of the Column object.

        +
        +
        +
        since
        +

        1.5.0

        +
        +
        +
        +

        Optional ignoreAliases

        ignoreAliases: undefined | false | true
        @@ -126,13 +149,35 @@

        Optional ignoreAliases

        +
        + +

        Optional includeDataValuesOption

        +
        includeDataValuesOption: IncludeDataValuesOption
        + +
        +
        +

        Specify which properties to return in DataValues. The default is IncludeDataValuesOption.AllValues. + All properties not requested will be undefined in the DataValue results. + This is a performance optimization only, and will be ignored in Tableau versions prior to 2021.2.

        +
        +
        +
        since
        +

        1.5.0

        +
        +
        +
        +

        Optional maxRows

        maxRows: undefined | number
        @@ -161,9 +206,15 @@

        Optional maxRows

      • columnsToInclude
      • +
      • + columnsToIncludeById +
      • ignoreAliases
      • +
      • + includeDataValuesOption +
      • maxRows
      • diff --git a/docs/interfaces/datatable.html b/docs/interfaces/datatable.html index a677c0a2..23958c64 100644 --- a/docs/interfaces/datatable.html +++ b/docs/interfaces/datatable.html @@ -99,7 +99,7 @@

        columns

        columns: Array<Column>
        @@ -116,7 +116,7 @@

        data

        data: Array<Array<DataValue>>
        @@ -135,7 +135,7 @@

        isSummaryData

        isSummaryData: boolean
        @@ -153,7 +153,7 @@

        isTotalRowCountLimited

        isTotalRowCountLimited: boolean
        @@ -176,7 +176,7 @@

        Optional marksInfo

        marksInfo: Array<MarkInfo>
        @@ -196,7 +196,7 @@

        name

        name: string
        @@ -213,7 +213,7 @@

        totalRowCount

        totalRowCount: number
        diff --git a/docs/interfaces/datavalue.html b/docs/interfaces/datavalue.html index 5db67f4c..0d3b7383 100644 --- a/docs/interfaces/datavalue.html +++ b/docs/interfaces/datavalue.html @@ -91,11 +91,11 @@

        Properties

        Properties

        -

        formattedValue

        -
        formattedValue: string
        +

        Optional formattedValue

        +
        formattedValue: undefined | string
        @@ -113,7 +113,7 @@

        nativeValue

        nativeValue: any
        @@ -138,7 +138,7 @@

        value

        value: any
        diff --git a/docs/interfaces/dialogoptions.html b/docs/interfaces/dialogoptions.html index a02eccb0..ce58acc6 100644 --- a/docs/interfaces/dialogoptions.html +++ b/docs/interfaces/dialogoptions.html @@ -94,7 +94,7 @@

        Optional height

        height: undefined | number
        @@ -109,7 +109,7 @@

        Optional width

        width: undefined | number
        diff --git a/docs/interfaces/environment.html b/docs/interfaces/environment.html index 308a2af8..72b8f70c 100644 --- a/docs/interfaces/environment.html +++ b/docs/interfaces/environment.html @@ -107,7 +107,7 @@

        apiVersion

        apiVersion: string
        @@ -124,7 +124,7 @@

        context

        @@ -141,7 +141,7 @@

        language

        language: string
        @@ -158,7 +158,7 @@

        locale

        locale: string
        @@ -175,7 +175,7 @@

        mode

        @@ -192,7 +192,7 @@

        operatingSystem

        operatingSystem: string
        @@ -209,7 +209,7 @@

        tableauVersion

        tableauVersion: string
        diff --git a/docs/interfaces/eventlistenermanager.html b/docs/interfaces/eventlistenermanager.html index a59a36b2..5c6d4ec9 100644 --- a/docs/interfaces/eventlistenermanager.html +++ b/docs/interfaces/eventlistenermanager.html @@ -117,7 +117,7 @@

        addEventListener

      • @@ -198,7 +198,7 @@

        removeEventListener

      • diff --git a/docs/interfaces/extensions.html b/docs/interfaces/extensions.html index 7a43ebb0..d8bd47ac 100644 --- a/docs/interfaces/extensions.html +++ b/docs/interfaces/extensions.html @@ -111,7 +111,7 @@

        Optional dashboardContent
        dashboardContent: DashboardContent
        @@ -130,7 +130,7 @@

        environment

        environment: Environment
        @@ -147,7 +147,7 @@

        settings

        settings: Settings
        @@ -164,7 +164,7 @@

        ui

        ui: UI
        @@ -187,7 +187,7 @@

        initializeAsync

      • @@ -234,7 +234,7 @@

        initializeDialogAsync

      • diff --git a/docs/interfaces/field.html b/docs/interfaces/field.html index 3bf59880..4baf6555 100644 --- a/docs/interfaces/field.html +++ b/docs/interfaces/field.html @@ -111,7 +111,7 @@

        aggregation

        @@ -128,7 +128,7 @@

        columnType

        columnType: ColumnType
        @@ -147,7 +147,7 @@

        dataSource

        dataSource: DataSource
        @@ -164,7 +164,7 @@

        description

        description: string | undefined
        @@ -181,7 +181,7 @@

        id

        id: string
        @@ -198,7 +198,7 @@

        isCalculatedField

        isCalculatedField: boolean
        @@ -215,7 +215,7 @@

        isCombinedField

        isCombinedField: boolean
        @@ -232,7 +232,7 @@

        isGenerated

        isGenerated: boolean
        @@ -253,7 +253,7 @@

        isHidden

        isHidden: boolean
        @@ -270,7 +270,7 @@

        name

        name: string
        @@ -287,7 +287,7 @@

        role

        diff --git a/docs/interfaces/filter.html b/docs/interfaces/filter.html index 159e45eb..b1d12c54 100644 --- a/docs/interfaces/filter.html +++ b/docs/interfaces/filter.html @@ -120,7 +120,7 @@

        fieldId

        fieldId: string
        @@ -137,7 +137,7 @@

        fieldName

        fieldName: string
        @@ -155,7 +155,7 @@

        filterType

        filterType: FilterType
        @@ -172,7 +172,7 @@

        worksheetName

        worksheetName: string
        @@ -196,10 +196,15 @@

        getFieldAsync

      • +
        +
        since
        +

        1.5.0 Fixed to properly return the field. Also requires Tableau 2019.2+.

        +
        +

        Returns Promise<Field>

        a promise containing the field for the filter.

        diff --git a/docs/interfaces/filterchangedevent.html b/docs/interfaces/filterchangedevent.html index 32a590d5..4fca473b 100644 --- a/docs/interfaces/filterchangedevent.html +++ b/docs/interfaces/filterchangedevent.html @@ -107,7 +107,7 @@

        fieldName

        fieldName: string
        @@ -125,7 +125,7 @@

        sheet

        @@ -143,7 +143,7 @@

        type

        @@ -161,7 +161,7 @@

        worksheet

        @@ -185,7 +185,7 @@

        getFilterAsync

      • diff --git a/docs/interfaces/filteroptions.html b/docs/interfaces/filteroptions.html index 69a05b3f..b0f1452f 100644 --- a/docs/interfaces/filteroptions.html +++ b/docs/interfaces/filteroptions.html @@ -100,7 +100,7 @@

        isExcludeMode

        isExcludeMode: boolean
        diff --git a/docs/interfaces/getsummarydataoptions.html b/docs/interfaces/getsummarydataoptions.html index e85a6d04..f631e6e7 100644 --- a/docs/interfaces/getsummarydataoptions.html +++ b/docs/interfaces/getsummarydataoptions.html @@ -91,8 +91,11 @@

        Index

        Properties

        @@ -100,13 +103,34 @@

        Properties

      • Properties

        +
        + +

        Optional columnsToIncludeById

        +
        columnsToIncludeById: Array<string>
        + +
        +
        +

        The columns to return specified by field id, returns all by default. + Since 1.5.0, fieldId is a property of the Column object.

        +
        +
        +
        since
        +

        1.5.0

        +
        +
        +
        +

        Optional ignoreAliases

        ignoreAliases: undefined | false | true
        @@ -121,7 +145,7 @@

        Optional ignoreSelection<
        ignoreSelection: undefined | false | true
        @@ -130,6 +154,51 @@

        Optional ignoreSelection<

        +
        + +

        Optional includeDataValuesOption

        +
        includeDataValuesOption: IncludeDataValuesOption
        + +
        +
        +

        Specify which properties to return in DataValues. The default is IncludeDataValuesOption.AllValues. + All properties not requested will be undefined in the DataValue results. + This is a performance optimization only, and will be ignored in Tableau versions prior to 2021.2.

        +
        +
        +
        since
        +

        1.5.0

        +
        +
        +
        +
        +
        + +

        Optional maxRows

        +
        maxRows: undefined | number
        + +
        +
        +

        The number of rows of data that you want to return. A value of 0 will attempt to return all rows. + 0 is the default if maxRows is not specified. + getUnderlyingTableDataAsync - maximum number of rows returned is capped at 10,000 regardless of maxRows. + getSummaryDataAsync - maximum number of rows returned is not capped, but performance may suffer with large row counts.

        +
        +
        +
        since
        +

        1.5.0 maxRows is now supported in both GetSummaryDataOptions and GetUnderlyingDataOptions.

        +
        +
        +
        +

      diff --git a/docs/interfaces/getunderlyingdataoptions.html b/docs/interfaces/getunderlyingdataoptions.html index 71e8012b..2d1b1c49 100644 --- a/docs/interfaces/getunderlyingdataoptions.html +++ b/docs/interfaces/getunderlyingdataoptions.html @@ -91,10 +91,12 @@

      Index

      Properties

      @@ -102,6 +104,28 @@

      Properties

      Properties

      +
      + +

      Optional columnsToIncludeById

      +
      columnsToIncludeById: Array<string>
      + +
      +
      +

      The columns to return specified by field id, returns all by default. + Since 1.5.0, fieldId is a property of the Column object.

      +
      +
      +
      since
      +

      1.5.0

      +
      +
      +
      +

      Optional ignoreAliases

      @@ -109,7 +133,7 @@

      Optional ignoreAliases

      Inherited from GetSummaryDataOptions.ignoreAliases

        -
      • Defined in src/ExternalContract/DataTableInterfaces.ts:112
      • +
      • Defined in packages/api-external-contract-js/src/ExternalContract/DataTableInterfaces.ts:124
      @@ -125,7 +149,7 @@

      Optional ignoreSelection<
      @@ -140,7 +164,7 @@

      Optional includeAllC
      includeAllColumns: undefined | false | true
      @@ -149,21 +173,51 @@

      Optional includeAllC

      -
      +
      + +

      Optional includeDataValuesOption

      +
      includeDataValuesOption: IncludeDataValuesOption
      + +
      +
      +

      Specify which properties to return in DataValues. The default is IncludeDataValuesOption.AllValues. + All properties not requested will be undefined in the DataValue results. + This is a performance optimization only, and will be ignored in Tableau versions prior to 2021.2.

      +
      +
      +
      since
      +

      1.5.0

      +
      +
      +
      +
      +

      Optional maxRows

      maxRows: undefined | number
      -

      The number of rows of data that you want to return. Enter 0 to return all rows. - A value of 0 will attempt to return all rows, but the maximum number of rows returned - from getUnderlyingDataAsync is currently set to 10,000.

      +

      The number of rows of data that you want to return. A value of 0 will attempt to return all rows. + 0 is the default if maxRows is not specified. + getUnderlyingTableDataAsync - maximum number of rows returned is capped at 10,000 regardless of maxRows. + getSummaryDataAsync - maximum number of rows returned is not capped, but performance may suffer with large row counts.

      +
      +
      since
      +

      1.5.0 maxRows is now supported in both GetSummaryDataOptions and GetUnderlyingDataOptions.

      +
      +
      @@ -183,6 +237,9 @@

      Optional maxRows

    • GetUnderlyingDataOptions diff --git a/docs/interfaces/logicaltable.html b/docs/interfaces/logicaltable.html index e6e9a7f9..e81a8108 100644 --- a/docs/interfaces/logicaltable.html +++ b/docs/interfaces/logicaltable.html @@ -104,7 +104,7 @@

      caption

      caption: string
    • @@ -114,7 +114,7 @@

      id

      id: string
      diff --git a/docs/interfaces/markinfo.html b/docs/interfaces/markinfo.html index 4ee6cb71..c9df58d8 100644 --- a/docs/interfaces/markinfo.html +++ b/docs/interfaces/markinfo.html @@ -104,7 +104,7 @@

      color

      color: string
      @@ -123,7 +123,7 @@

      Optional tupleId

      tupleId: Number
      @@ -142,7 +142,7 @@

      type

      type: MarkType
      diff --git a/docs/interfaces/markscollection.html b/docs/interfaces/markscollection.html index 5dc27116..62d88fa0 100644 --- a/docs/interfaces/markscollection.html +++ b/docs/interfaces/markscollection.html @@ -101,7 +101,7 @@

      data

      data: Array<DataTable>
      diff --git a/docs/interfaces/marksselectedevent.html b/docs/interfaces/marksselectedevent.html index 664a45c2..bcbc8370 100644 --- a/docs/interfaces/marksselectedevent.html +++ b/docs/interfaces/marksselectedevent.html @@ -114,7 +114,7 @@

      sheet

      @@ -132,7 +132,7 @@

      type

      @@ -150,7 +150,7 @@

      worksheet

      @@ -174,7 +174,7 @@

      getMarksAsync

    • diff --git a/docs/interfaces/pageddata.html b/docs/interfaces/pageddata.html index b2072bce..852e26a9 100644 --- a/docs/interfaces/pageddata.html +++ b/docs/interfaces/pageddata.html @@ -118,7 +118,7 @@

      data

      data: T
      @@ -133,7 +133,7 @@

      hasMoreData

      hasMoreData: boolean
      @@ -148,7 +148,7 @@

      page

      page: number
      @@ -163,7 +163,7 @@

      pageSize

      pageSize: number
      @@ -178,7 +178,7 @@

      total

      total: number
      @@ -200,7 +200,7 @@

      getNextPageAsync

    • diff --git a/docs/interfaces/paginationoptions.html b/docs/interfaces/paginationoptions.html index b8f5b664..9d8acdba 100644 --- a/docs/interfaces/paginationoptions.html +++ b/docs/interfaces/paginationoptions.html @@ -101,7 +101,7 @@

      pageNumber

      pageNumber: number
      @@ -116,7 +116,7 @@

      pageSize

      pageSize: number
      diff --git a/docs/interfaces/parameter.html b/docs/interfaces/parameter.html index 777c08e5..75c58c16 100644 --- a/docs/interfaces/parameter.html +++ b/docs/interfaces/parameter.html @@ -117,7 +117,7 @@

      allowableValues

      @@ -134,7 +134,7 @@

      currentValue

      currentValue: DataValue
      @@ -151,7 +151,7 @@

      dataType

      dataType: DataType
      @@ -168,7 +168,7 @@

      id

      id: string
      @@ -185,7 +185,7 @@

      name

      name: string
      @@ -210,7 +210,7 @@

      addEventListener

      @@ -291,7 +291,7 @@

      changeValueAsync

    • @@ -334,7 +334,7 @@

      removeEventListener

      diff --git a/docs/interfaces/parameterchangedevent.html b/docs/interfaces/parameterchangedevent.html index 8d0590f2..aa3d4298 100644 --- a/docs/interfaces/parameterchangedevent.html +++ b/docs/interfaces/parameterchangedevent.html @@ -112,7 +112,7 @@

      type

      @@ -136,7 +136,7 @@

      getParameterAsync

    • diff --git a/docs/interfaces/parameterdomainrestriction.html b/docs/interfaces/parameterdomainrestriction.html index 29423199..acfb0403 100644 --- a/docs/interfaces/parameterdomainrestriction.html +++ b/docs/interfaces/parameterdomainrestriction.html @@ -105,7 +105,7 @@

      Optional allowableValues<
      allowableValues: Array<DataValue>
      @@ -123,7 +123,7 @@

      Optional dateStepPer
      dateStepPeriod: PeriodType
      @@ -143,7 +143,7 @@

      Optional maxValue

      maxValue: DataValue
      @@ -161,7 +161,7 @@

      Optional minValue

      minValue: DataValue
      @@ -179,7 +179,7 @@

      Optional stepSize

      stepSize: undefined | number
      @@ -201,7 +201,7 @@

      type

      diff --git a/docs/interfaces/point.html b/docs/interfaces/point.html index 0801d7b6..0b4a160e 100644 --- a/docs/interfaces/point.html +++ b/docs/interfaces/point.html @@ -101,7 +101,7 @@

      x

      x: number
      @@ -118,7 +118,7 @@

      y

      y: number
      diff --git a/docs/interfaces/rangedomain.html b/docs/interfaces/rangedomain.html index 72747dac..e4a72145 100644 --- a/docs/interfaces/rangedomain.html +++ b/docs/interfaces/rangedomain.html @@ -102,7 +102,7 @@

      max

      @@ -119,7 +119,7 @@

      min

      @@ -136,7 +136,7 @@

      type

      diff --git a/docs/interfaces/rangefilter.html b/docs/interfaces/rangefilter.html index 68e11d7d..ec940c9d 100644 --- a/docs/interfaces/rangefilter.html +++ b/docs/interfaces/rangefilter.html @@ -119,7 +119,7 @@

      fieldId

      @@ -137,7 +137,7 @@

      fieldName

      @@ -156,7 +156,7 @@

      filterType

      @@ -173,7 +173,7 @@

      includeNullValues

      includeNullValues: boolean
      @@ -190,7 +190,7 @@

      maxValue

      maxValue: DataValue
      @@ -207,7 +207,7 @@

      minValue

      minValue: DataValue
      @@ -225,7 +225,7 @@

      worksheetName

      @@ -249,7 +249,7 @@

      getDomainAsync

    • @@ -279,10 +279,15 @@

      getFieldAsync

      +
      +
      since
      +

      1.5.0 Fixed to properly return the field. Also requires Tableau 2019.2+.

      +
      +

      Returns Promise<Field>

      a promise containing the field for the filter.

      diff --git a/docs/interfaces/rangefilteroptions.html b/docs/interfaces/rangefilteroptions.html index 7c4a74d8..59be0b6e 100644 --- a/docs/interfaces/rangefilteroptions.html +++ b/docs/interfaces/rangefilteroptions.html @@ -102,7 +102,7 @@

      Optional max

      max: number | Date
      @@ -112,7 +112,7 @@

      Optional min

      min: number | Date
      @@ -122,7 +122,7 @@

      Optional nullOption

      nullOption: FilterNullOption
      diff --git a/docs/interfaces/rangevalue.html b/docs/interfaces/rangevalue.html index 7f98d679..13a80995 100644 --- a/docs/interfaces/rangevalue.html +++ b/docs/interfaces/rangevalue.html @@ -105,7 +105,7 @@

      max

      max: number | Date
      @@ -120,7 +120,7 @@

      min

      min: number | Date
      @@ -135,7 +135,7 @@

      Optional nullOption

      nullOption: FilterNullOption
      diff --git a/docs/interfaces/relativedatefilter.html b/docs/interfaces/relativedatefilter.html index 27fcde6f..abbe9229 100644 --- a/docs/interfaces/relativedatefilter.html +++ b/docs/interfaces/relativedatefilter.html @@ -111,7 +111,7 @@

      anchorDate

      anchorDate: DataValue
      @@ -129,7 +129,7 @@

      fieldId

      @@ -147,7 +147,7 @@

      fieldName

      @@ -166,7 +166,7 @@

      filterType

      @@ -183,7 +183,7 @@

      periodType

      periodType: PeriodType
      @@ -200,7 +200,7 @@

      rangeN

      rangeN: number
      @@ -217,7 +217,7 @@

      rangeType

      rangeType: DateRangeType
      @@ -235,7 +235,7 @@

      worksheetName

      @@ -260,10 +260,15 @@

      getFieldAsync

      +
      +
      since
      +

      1.5.0 Fixed to properly return the field. Also requires Tableau 2019.2+.

      +
      +

      Returns Promise<Field>

      a promise containing the field for the filter.

      diff --git a/docs/interfaces/selectioncriteria.html b/docs/interfaces/selectioncriteria.html index 1882e2f8..6cb63d75 100644 --- a/docs/interfaces/selectioncriteria.html +++ b/docs/interfaces/selectioncriteria.html @@ -101,7 +101,7 @@

      fieldName

      fieldName: string
      @@ -117,7 +117,7 @@

      value

      diff --git a/docs/interfaces/settings.html b/docs/interfaces/settings.html index 1acc8d4f..f37ce6ba 100644 --- a/docs/interfaces/settings.html +++ b/docs/interfaces/settings.html @@ -119,7 +119,7 @@

      isModified

      isModified: boolean
      @@ -148,7 +148,7 @@

      addEventListener

      @@ -229,7 +229,7 @@

      erase

    • @@ -260,7 +260,7 @@

      get

    • @@ -295,7 +295,7 @@

      getAll

    • @@ -325,7 +325,7 @@

      removeEventListener

      @@ -360,7 +360,7 @@

      saveAsync

    • @@ -392,7 +392,7 @@

      set

    • diff --git a/docs/interfaces/settingschangedevent.html b/docs/interfaces/settingschangedevent.html index b86c550d..839893d3 100644 --- a/docs/interfaces/settingschangedevent.html +++ b/docs/interfaces/settingschangedevent.html @@ -107,7 +107,7 @@

      newSettings

      newSettings: object
      @@ -133,7 +133,7 @@

      type

      diff --git a/docs/interfaces/sheet.html b/docs/interfaces/sheet.html index bed0100c..14705aa0 100644 --- a/docs/interfaces/sheet.html +++ b/docs/interfaces/sheet.html @@ -117,7 +117,7 @@

      name

      name: string
      @@ -134,7 +134,7 @@

      sheetType

      sheetType: SheetType
      @@ -151,7 +151,7 @@

      size

      size: Size
      @@ -176,7 +176,7 @@

      addEventListener

      @@ -257,7 +257,7 @@

      findParameterAsync

    • @@ -289,7 +289,7 @@

      getParametersAsync

    • @@ -310,7 +310,7 @@

      removeEventListener

      diff --git a/docs/interfaces/size.html b/docs/interfaces/size.html index 2dcc6eb0..37faf920 100644 --- a/docs/interfaces/size.html +++ b/docs/interfaces/size.html @@ -101,7 +101,7 @@

      height

      height: number
      @@ -118,7 +118,7 @@

      width

      width: number
      diff --git a/docs/interfaces/tableauerror.html b/docs/interfaces/tableauerror.html index dd9a8470..f7148f98 100644 --- a/docs/interfaces/tableauerror.html +++ b/docs/interfaces/tableauerror.html @@ -119,7 +119,7 @@

      errorCode

      errorCode: ErrorCodes
      diff --git a/docs/interfaces/tableauevent.html b/docs/interfaces/tableauevent.html index 7b716e84..3af97ae4 100644 --- a/docs/interfaces/tableauevent.html +++ b/docs/interfaces/tableauevent.html @@ -112,7 +112,7 @@

      type

      diff --git a/docs/interfaces/tableausheetevent.html b/docs/interfaces/tableausheetevent.html index 6429c38e..c49a59e6 100644 --- a/docs/interfaces/tableausheetevent.html +++ b/docs/interfaces/tableausheetevent.html @@ -111,7 +111,7 @@

      sheet

      sheet: Sheet
      @@ -129,7 +129,7 @@

      type

      diff --git a/docs/interfaces/tableauworksheetevent.html b/docs/interfaces/tableauworksheetevent.html index 9a532061..13cee52d 100644 --- a/docs/interfaces/tableauworksheetevent.html +++ b/docs/interfaces/tableauworksheetevent.html @@ -116,7 +116,7 @@

      sheet

      @@ -134,7 +134,7 @@

      type

      @@ -151,7 +151,7 @@

      worksheet

      worksheet: Worksheet
      diff --git a/docs/interfaces/tablesummary.html b/docs/interfaces/tablesummary.html index c88e923c..5e66f5ed 100644 --- a/docs/interfaces/tablesummary.html +++ b/docs/interfaces/tablesummary.html @@ -103,7 +103,7 @@

      connectionId

      connectionId: string
      @@ -120,7 +120,7 @@

      customSQL

      customSQL: string | undefined
      @@ -137,7 +137,7 @@

      id

      id: string
      @@ -154,7 +154,7 @@

      name

      name: string
      diff --git a/docs/interfaces/ui.html b/docs/interfaces/ui.html index 2c5e5cc4..1589d86b 100644 --- a/docs/interfaces/ui.html +++ b/docs/interfaces/ui.html @@ -113,7 +113,7 @@

      closeDialog

    • @@ -150,7 +150,7 @@

      displayDialogAsync

    • diff --git a/docs/interfaces/worksheet.html b/docs/interfaces/worksheet.html index ae0be22a..f3603f2a 100644 --- a/docs/interfaces/worksheet.html +++ b/docs/interfaces/worksheet.html @@ -104,6 +104,7 @@

      Methods

    • getHighlightedMarksAsync
    • getParametersAsync
    • getSelectedMarksAsync
    • +
    • getSummaryColumnsInfoAsync
    • getSummaryDataAsync
    • getUnderlyingDataAsync
    • getUnderlyingTableDataAsync
    • @@ -124,7 +125,7 @@

      name

      @@ -141,7 +142,7 @@

      parentDashboard

      parentDashboard: Dashboard
      @@ -159,7 +160,7 @@

      sheetType

      @@ -177,7 +178,7 @@

      size

      @@ -202,7 +203,7 @@

      addEventListener

      @@ -283,7 +284,7 @@

      applyFilterAsync

    • @@ -333,7 +334,7 @@

      applyRangeFilterAsync

    • @@ -372,7 +373,7 @@

      clearFilterAsync

    • @@ -406,7 +407,7 @@

      clearSelectedMarksAsync

    • @@ -435,7 +436,7 @@

      findParameterAsync

      @@ -467,7 +468,7 @@

      getDataSourcesAsync

    • @@ -503,7 +504,7 @@

      getFiltersAsync

    • @@ -526,7 +527,7 @@

      getHighlightedMarksAsync

    • @@ -551,7 +552,7 @@

      getParametersAsync

      @@ -571,7 +572,7 @@

      getSelectedMarksAsync

    • @@ -593,6 +594,34 @@

      Returns Promise

    +
    + +

    getSummaryColumnsInfoAsync

    +
      +
    • getSummaryColumnsInfoAsync(): Promise<Array<Column>>
    • +
    +
      +
    • + +
      +
      +

      Gets the column information for all columns that are returned with getSummaryDataAsync.

      +
      +
      +
      since
      +

      1.5.0

      +
      +
      +
      +

      Returns Promise<Array<Column>>

      +

      The array of columns that describe the data in the worksheet.

      +
    • +
    +

    getSummaryDataAsync

    @@ -603,13 +632,26 @@

    getSummaryDataAsync

  • Gets the summary data table for this worksheet.

    +
    +
    since
    +

    1.5.0 Use the GetSummaryDataOptions.maxRows option to request the number of rows of data + to return. If unspecified, the call to getSummaryDataAsync requests all rows.

    +
    +
    since
    +

    1.5.0 Use the GetSummaryDataOptions.includeDataValuesOption option to optimize performance + by restricting the properties included in the returned DataValues.

    +
    +
    since
    +

    1.5.0 Use the GetSummaryDataOptions.columnsToIncludeById option to request the columns to return.

    +
    +

    Parameters

      @@ -622,10 +664,10 @@
      Optional options: Returns Promise<DataTable>

      A data table containing the summary data for the worksheet.

      -

      Example showing the method call to get the summary data from a worksheet.

      +

      Example showing the method call to get 1,000 rows of summary data from a worksheet.

      // After getting the worksheet,
        // get the summary data for the sheet
      - worksheet.getSummaryDataAsync().then(function (sumdata) {
      + worksheet.getSummaryDataAsync({maxRows: 1000}).then(function (sumdata) {
       
         const worksheetData = sumdata;
       
      @@ -646,7 +688,7 @@ 

      getUnderlyingDataAsync

    • @@ -670,10 +712,10 @@
      Optional options: Returns Promise<DataTable>

      A data table containing the underlying data for the worksheet.

      -

      You can use the getUnderlyingDataOptions.maxRows property to request the number of rows of data to return. +

      Use the GetUnderlyingDataOptions.maxRows property to request the number of rows of data to return. If unspecified (maxRows == '0'), the call to getUnderlyingDataAsync requests all rows in the data source. Note that the maximum number of rows returned from the getUnderlyingDataAsync() method is currently limited - to 10,000 rows. You can use the DataTable property, isTotalRowCountLimited, to test whether there is + to 10,000 rows. Use the DataTable property, isTotalRowCountLimited, to test whether there is more data. A value of true indicates that the calling function requested more rows than the current limit (10,000) and the underlying data source contains more rows than can be returned.

      In the following example, the getUnderlyingDataAsync() method is used to get the underlying data for @@ -701,7 +743,7 @@

      getUnderlyingTableDataAsync

    • @@ -712,19 +754,14 @@

      getUnderlyingTableDataAsync

      since

      1.4.0

      -

      You can use the getUnderlyingDataOptions.maxRows property to request the number of rows of data to return. - If unspecified (maxRows == '0'), the call to getUnderlyingTableDataAsync requests all rows in the logical table. - Note that the maximum number of rows returned from the getUnderlyingTableDataAsync() method is currently limited - to 10,000 rows. You can use the DataTable property, isTotalRowCountLimited, to test whether there is - more data. A value of true indicates that the calling function requested more rows than the current limit (10,000) and the - underlying data source contains more rows than can be returned.

      -
       var worksheet = tableau.extensions.dashboardContent.dashboard.worksheets.find(w => w.name === "Sale Map");
      - worksheet.getUnderlyingTablesAsync().then(function (logicalTables) {
      -     worksheet.getUnderlyingTableDataAsync(logicalTables[0].id).then((dataTable) => {
      -       // process the dataTable...
      -     });
      - });
      -
      + +
      since
      +

      1.5.0 Use the GetUnderlyingDataOptions.includeDataValuesOption option to optimize performance + by restricting the properties included in the returned DataValues.

      +
      +
      since
      +

      1.5.0 Use the GetUnderlyingDataOptions.columnsToIncludeById option to request the columns to return.

      +

      Parameters

      @@ -744,6 +781,19 @@
      Optional options: Returns Promise<DataTable>

      A data table containing the underlying data for the given logical table id

      +

      Use the getUnderlyingDataOptions.maxRows option to request the number of rows of data to return. + If unspecified (maxRows == '0'), the call to getUnderlyingTableDataAsync requests all rows in the logical table. + Note that the maximum number of rows returned from the getUnderlyingTableDataAsync() method is currently limited + to 10,000 rows. Use the DataTable property, isTotalRowCountLimited, to test whether there is + more data. A value of true indicates that the calling function requested more rows than the current limit (10,000) and the + underlying data source contains more rows than can be returned.

      +
       var worksheet = tableau.extensions.dashboardContent.dashboard.worksheets.find(w => w.name === "Sale Map");
      + worksheet.getUnderlyingTablesAsync().then(function (logicalTables) {
      +     worksheet.getUnderlyingTableDataAsync(logicalTables[0].id).then((dataTable) => {
      +       // process the dataTable...
      +     });
      + });
      +
  • @@ -757,7 +807,7 @@

    getUnderlyingTablesAsync

  • @@ -797,7 +847,7 @@

    removeEventListener

    @@ -832,7 +882,7 @@

    selectMarksByValueAsync

  • @@ -931,6 +981,9 @@

    Returns Promise getSelectedMarksAsync

  • +
  • + getSummaryColumnsInfoAsync +
  • getSummaryDataAsync
  • diff --git a/docs/modules/tableau.html b/docs/modules/tableau.html index f5d42e74..4fcdaa7f 100644 --- a/docs/modules/tableau.html +++ b/docs/modules/tableau.html @@ -94,6 +94,7 @@

    Enumerations

  • FilterNullOption
  • FilterType
  • FilterUpdateType
  • +
  • IncludeDataValuesOption
  • MarkType
  • ParameterValueType
  • PeriodType
  • @@ -123,7 +124,7 @@

    Let extensions

    extensions: Extensions
    @@ -187,6 +188,9 @@

    Let extensions

  • FilterUpdateType
  • +
  • + IncludeDataValuesOption +
  • MarkType
  • diff --git a/docs/trex_typescript.md b/docs/trex_typescript.md index 3cebab94..14aa91de 100644 --- a/docs/trex_typescript.md +++ b/docs/trex_typescript.md @@ -21,7 +21,7 @@ The Tableau Extension API type definitions are available as an npm @types packag npm install @tableau/extensions-api-types ``` -
    Note The version of the types package must match the version of the Extensions API library you are using. You can specify the library version by appending the version number to the package name (@n.n.n). For example, npm install @tableau/extensions-api-types@1.3.1. If you don't specify a version number, npm will install the latest released package.
    +
    Note The version of the types package must match the version of the Extensions API library you are using. You can specify the library version by appending the version number to the package name (@n.n.n). For example, npm install @tableau/extensions-api-types@1.3. You only need to match major and minor versions (e.g. types 1.3.1 works with any 1.3.x version of the extensions library). If you don't specify a version number, npm will install the latest released package.
    ## Import the type definitions diff --git a/lib/tableau.extensions.1.4.0.js b/lib/previous/tableau.extensions.1.4.0.js similarity index 100% rename from lib/tableau.extensions.1.4.0.js rename to lib/previous/tableau.extensions.1.4.0.js diff --git a/lib/tableau.extensions.1.4.0.min.js b/lib/previous/tableau.extensions.1.4.0.min.js similarity index 100% rename from lib/tableau.extensions.1.4.0.min.js rename to lib/previous/tableau.extensions.1.4.0.min.js diff --git a/lib/tableau.extensions.1.5.0.js b/lib/tableau.extensions.1.5.0.js new file mode 100644 index 00000000..48a04ae8 --- /dev/null +++ b/lib/tableau.extensions.1.5.0.js @@ -0,0 +1,12599 @@ +window["tableau"] = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/dist-extensions/"; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "../lib/src/ExtensionsApi.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../../../node_modules/core-js/es/array/find.js": +/*!************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/array/find.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.array.find */ "../../../node_modules/core-js/modules/es.array.find.js"); +var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "../../../node_modules/core-js/internals/entry-unbind.js"); + +module.exports = entryUnbind('Array', 'find'); + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/array/from.js": +/*!************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/array/from.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../../node_modules/core-js/modules/es.string.iterator.js"); +__webpack_require__(/*! ../../modules/es.array.from */ "../../../node_modules/core-js/modules/es.array.from.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Array.from; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/map/index.js": +/*!***********************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/map/index.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.map */ "../../../node_modules/core-js/modules/es.map.js"); +__webpack_require__(/*! ../../modules/es.object.to-string */ "../../../node_modules/core-js/modules/es.object.to-string.js"); +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../../node_modules/core-js/modules/es.string.iterator.js"); +__webpack_require__(/*! ../../modules/web.dom-collections.iterator */ "../../../node_modules/core-js/modules/web.dom-collections.iterator.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Map; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/number/is-integer.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/is-integer.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.number.is-integer */ "../../../node_modules/core-js/modules/es.number.is-integer.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.isInteger; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/number/is-nan.js": +/*!***************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/is-nan.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.number.is-nan */ "../../../node_modules/core-js/modules/es.number.is-nan.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.isNaN; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/number/parse-float.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/parse-float.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.number.parse-float */ "../../../node_modules/core-js/modules/es.number.parse-float.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.parseFloat; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/number/parse-int.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/number/parse-int.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.number.parse-int */ "../../../node_modules/core-js/modules/es.number.parse-int.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.parseInt; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/object/assign.js": +/*!***************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/object/assign.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.object.assign */ "../../../node_modules/core-js/modules/es.object.assign.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.assign; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/object/entries.js": +/*!****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/object/entries.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.object.entries */ "../../../node_modules/core-js/modules/es.object.entries.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.entries; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/object/set-prototype-of.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/object/set-prototype-of.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.object.set-prototype-of */ "../../../node_modules/core-js/modules/es.object.set-prototype-of.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.setPrototypeOf; + + +/***/ }), + +/***/ "../../../node_modules/core-js/es/promise/index.js": +/*!***************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/es/promise/index.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.aggregate-error */ "../../../node_modules/core-js/modules/es.aggregate-error.js"); +__webpack_require__(/*! ../../modules/es.object.to-string */ "../../../node_modules/core-js/modules/es.object.to-string.js"); +__webpack_require__(/*! ../../modules/es.promise */ "../../../node_modules/core-js/modules/es.promise.js"); +__webpack_require__(/*! ../../modules/es.promise.all-settled */ "../../../node_modules/core-js/modules/es.promise.all-settled.js"); +__webpack_require__(/*! ../../modules/es.promise.any */ "../../../node_modules/core-js/modules/es.promise.any.js"); +__webpack_require__(/*! ../../modules/es.promise.finally */ "../../../node_modules/core-js/modules/es.promise.finally.js"); +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../../node_modules/core-js/modules/es.string.iterator.js"); +__webpack_require__(/*! ../../modules/web.dom-collections.iterator */ "../../../node_modules/core-js/modules/web.dom-collections.iterator.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../../node_modules/core-js/internals/path.js"); + +module.exports = path.Promise; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/a-function.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/a-function.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') { + throw TypeError(String(it) + ' is not a function'); + } return it; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/a-possible-prototype.js": +/*!*****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/a-possible-prototype.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); + +module.exports = function (it) { + if (!isObject(it) && it !== null) { + throw TypeError("Can't set " + String(it) + ' as a prototype'); + } return it; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/add-to-unscopables.js": +/*!***************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/add-to-unscopables.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../../node_modules/core-js/internals/object-create.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js"); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] == undefined) { + definePropertyModule.f(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/an-instance.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/an-instance.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name) { + if (!(it instanceof Constructor)) { + throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); + } return it; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/an-object.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/an-object.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); + +module.exports = function (it) { + if (!isObject(it)) { + throw TypeError(String(it) + ' is not an object'); + } return it; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/array-from.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-from.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../../node_modules/core-js/internals/function-bind-context.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../../node_modules/core-js/internals/to-object.js"); +var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "../../../node_modules/core-js/internals/call-with-safe-iteration-closing.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../../node_modules/core-js/internals/is-array-iterator-method.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "../../../node_modules/core-js/internals/to-length.js"); +var createProperty = __webpack_require__(/*! ../internals/create-property */ "../../../node_modules/core-js/internals/create-property.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../../node_modules/core-js/internals/get-iterator-method.js"); + +// `Array.from` method implementation +// https://tc39.es/ecma262/#sec-array.from +module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var iteratorMethod = getIteratorMethod(O); + var index = 0; + var length, result, step, iterator, next, value; + if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2); + // if the target is not iterable or it's an array with the default iterator - use a simple case + if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = iteratorMethod.call(O); + next = iterator.next; + result = new C(); + for (;!(step = next.call(iterator)).done; index++) { + value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; + createProperty(result, index, value); + } + } else { + length = toLength(O.length); + result = new C(length); + for (;length > index; index++) { + value = mapping ? mapfn(O[index], index) : O[index]; + createProperty(result, index, value); + } + } + result.length = index; + return result; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/array-includes.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-includes.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../../node_modules/core-js/internals/to-indexed-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "../../../node_modules/core-js/internals/to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "../../../node_modules/core-js/internals/to-absolute-index.js"); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/array-iteration.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-iteration.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../../node_modules/core-js/internals/function-bind-context.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../../node_modules/core-js/internals/indexed-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../../node_modules/core-js/internals/to-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "../../../node_modules/core-js/internals/to-length.js"); +var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "../../../node_modules/core-js/internals/array-species-create.js"); + +var push = [].push; + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation +var createMethod = function (TYPE) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var IS_FILTER_OUT = TYPE == 7; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject($this); + var self = IndexedObject(O); + var boundFunction = bind(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var create = specificCreate || arraySpeciesCreate; + var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: push.call(target, value); // filter + } else switch (TYPE) { + case 4: return false; // every + case 7: push.call(target, value); // filterOut + } + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + +module.exports = { + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + forEach: createMethod(0), + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + map: createMethod(1), + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + filter: createMethod(2), + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + some: createMethod(3), + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + every: createMethod(4), + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + find: createMethod(5), + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod(6), + // `Array.prototype.filterOut` method + // https://github.com/tc39/proposal-array-filtering + filterOut: createMethod(7) +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/array-species-create.js": +/*!*****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/array-species-create.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "../../../node_modules/core-js/internals/is-array.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return new (C === undefined ? Array : C)(length === 0 ? 0 : length); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/call-with-safe-iteration-closing.js": +/*!*****************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! + \*****************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../../node_modules/core-js/internals/iterator-close.js"); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (error) { + iteratorClose(iterator); + throw error; + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/check-correctness-of-iteration.js": +/*!***************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/check-correctness-of-iteration.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing + Array.from(iteratorWithReturn, function () { throw 2; }); +} catch (error) { /* empty */ } + +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/classof-raw.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/classof-raw.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/classof.js": +/*!****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/classof.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../../node_modules/core-js/internals/to-string-tag-support.js"); +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "../../../node_modules/core-js/internals/classof-raw.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/collection-strong.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/collection-strong.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js").f; +var create = __webpack_require__(/*! ../internals/object-create */ "../../../node_modules/core-js/internals/object-create.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../../node_modules/core-js/internals/redefine-all.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../../node_modules/core-js/internals/function-bind-context.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../../node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../../node_modules/core-js/internals/iterate.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../../node_modules/core-js/internals/define-iterator.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../../node_modules/core-js/internals/set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var fastKey = __webpack_require__(/*! ../internals/internal-metadata */ "../../../node_modules/core-js/internals/internal-metadata.js").fastKey; +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../../node_modules/core-js/internals/internal-state.js"); + +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) that.size = 0; + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + }); + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + // change existing entry + if (entry) { + entry.value = value; + // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (DESCRIPTORS) state.size++; + else that.size++; + // add to index + if (index !== 'F') state.index[index] = entry; + } return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; + // frozen object case + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; + + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) state.size = 0; + else that.size = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (DESCRIPTORS) state.size--; + else that.size--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(this, key); + } + }); + + redefineAll(C.prototype, IS_MAP ? { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) defineProperty(C.prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return C; + }, + setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + // get next entry + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { value: undefined, done: true }; + } + // return step by kind + if (kind == 'keys') return { value: entry.key, done: false }; + if (kind == 'values') return { value: entry.value, done: false }; + return { value: [entry.key, entry.value], done: false }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(CONSTRUCTOR_NAME); + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/collection.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/collection.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../../node_modules/core-js/internals/is-forced.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "../../../node_modules/core-js/internals/internal-metadata.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../../node_modules/core-js/internals/iterate.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../../node_modules/core-js/internals/an-instance.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../../node_modules/core-js/internals/check-correctness-of-iteration.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../../node_modules/core-js/internals/set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "../../../node_modules/core-js/internals/inherit-if-required.js"); + +module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + + var fixMethod = function (KEY) { + var nativeMethod = NativePrototype[KEY]; + redefine(NativePrototype, KEY, + KEY == 'add' ? function add(value) { + nativeMethod.call(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + } : function set(key, value) { + nativeMethod.call(this, key === 0 ? 0 : key, value); + return this; + } + ); + }; + + var REPLACE = isForced( + CONSTRUCTOR_NAME, + typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })) + ); + + if (REPLACE) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.REQUIRED = true; + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new -- required for testing + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, Constructor, CONSTRUCTOR_NAME); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + $({ global: true, forced: Constructor != NativeConstructor }, exported); + + setToStringTag(Constructor, CONSTRUCTOR_NAME); + + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + + return Constructor; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/copy-constructor-properties.js": +/*!************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/copy-constructor-properties.js ***! + \************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "../../../node_modules/core-js/internals/own-keys.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../../node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, source) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/correct-prototype-getter.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/correct-prototype-getter.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/create-iterator-constructor.js": +/*!************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-iterator-constructor.js ***! + \************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "../../../node_modules/core-js/internals/iterators-core.js").IteratorPrototype; +var create = __webpack_require__(/*! ../internals/object-create */ "../../../node_modules/core-js/internals/object-create.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../../node_modules/core-js/internals/create-property-descriptor.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../../node_modules/core-js/internals/set-to-string-tag.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../../node_modules/core-js/internals/iterators.js"); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/create-non-enumerable-property.js": +/*!***************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-non-enumerable-property.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/create-property-descriptor.js": +/*!***********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-property-descriptor.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/create-property.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/create-property.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../../../node_modules/core-js/internals/to-primitive.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = function (object, key, value) { + var propertyKey = toPrimitive(key); + if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else object[propertyKey] = value; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/define-iterator.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/define-iterator.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "../../../node_modules/core-js/internals/create-iterator-constructor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../../node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../../node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../../node_modules/core-js/internals/set-to-string-tag.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../../node_modules/core-js/internals/is-pure.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../../node_modules/core-js/internals/iterators.js"); +var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "../../../node_modules/core-js/internals/iterators-core.js"); + +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { + createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return nativeIterator.call(this); }; + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator); + } + Iterators[NAME] = defaultIterator; + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + return methods; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/descriptors.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/descriptors.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/document-create-element.js": +/*!********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/document-create-element.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/dom-iterables.js": +/*!**********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/dom-iterables.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// iterable DOM collections +// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods +module.exports = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/engine-is-ios.js": +/*!**********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-ios.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../../node_modules/core-js/internals/engine-user-agent.js"); + +module.exports = /(?:iphone|ipod|ipad).*applewebkit/i.test(userAgent); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/engine-is-node.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-node.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../../node_modules/core-js/internals/classof-raw.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); + +module.exports = classof(global.process) == 'process'; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/engine-is-webos-webkit.js": +/*!*******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-is-webos-webkit.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../../node_modules/core-js/internals/engine-user-agent.js"); + +module.exports = /web0s(?!.*chrome)/i.test(userAgent); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/engine-user-agent.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-user-agent.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('navigator', 'userAgent') || ''; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/engine-v8-version.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/engine-v8-version.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../../node_modules/core-js/internals/engine-user-agent.js"); + +var process = global.process; +var versions = process && process.versions; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + version = match[0] + match[1]; +} else if (userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = match[1]; + } +} + +module.exports = version && +version; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/entry-unbind.js": +/*!*********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/entry-unbind.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../../node_modules/core-js/internals/function-bind-context.js"); + +var call = Function.call; + +module.exports = function (CONSTRUCTOR, METHOD, length) { + return bind(call, global[CONSTRUCTOR].prototype[METHOD], length); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/enum-bug-keys.js": +/*!**********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/enum-bug-keys.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/export.js": +/*!***************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/export.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../../node_modules/core-js/internals/set-global.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../../node_modules/core-js/internals/copy-constructor-properties.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../../node_modules/core-js/internals/is-forced.js"); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty === typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + // extend global + redefine(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/fails.js": +/*!**************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/fails.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/freezing.js": +/*!*****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/freezing.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing + return Object.isExtensible(Object.preventExtensions({})); +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/function-bind-context.js": +/*!******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/function-bind-context.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "../../../node_modules/core-js/internals/a-function.js"); + +// optional / simple context binding +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 0: return function () { + return fn.call(that); + }; + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/get-built-in.js": +/*!*********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/get-built-in.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var path = __webpack_require__(/*! ../internals/path */ "../../../node_modules/core-js/internals/path.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); + +var aFunction = function (variable) { + return typeof variable == 'function' ? variable : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) + : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/get-iterator-method.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/get-iterator-method.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof */ "../../../node_modules/core-js/internals/classof.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../../node_modules/core-js/internals/iterators.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/global.js": +/*!***************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/global.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {var check = function (it) { + return it && it.Math == Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../packages/api-extensions-js/node_modules/webpack/buildin/global.js */ "../node_modules/webpack/buildin/global.js"))) + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/has.js": +/*!************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/has.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; + +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/hidden-keys.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/hidden-keys.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/host-report-errors.js": +/*!***************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/host-report-errors.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); + +module.exports = function (a, b) { + var console = global.console; + if (console && console.error) { + arguments.length === 1 ? console.error(a) : console.error(a, b); + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/html.js": +/*!*************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/html.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('document', 'documentElement'); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/ie8-dom-define.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/ie8-dom-define.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../../node_modules/core-js/internals/document-create-element.js"); + +// Thank's IE8 for his funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- requied for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/indexed-object.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/indexed-object.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../../node_modules/core-js/internals/classof-raw.js"); + +var split = ''.split; + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split.call(it, '') : Object(it); +} : Object; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/inherit-if-required.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/inherit-if-required.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../../node_modules/core-js/internals/object-set-prototype-of.js"); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + typeof (NewTarget = dummy.constructor) == 'function' && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/inspect-source.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/inspect-source.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ../internals/shared-store */ "../../../node_modules/core-js/internals/shared-store.js"); + +var functionToString = Function.toString; + +// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper +if (typeof store.inspectSource != 'function') { + store.inspectSource = function (it) { + return functionToString.call(it); + }; +} + +module.exports = store.inspectSource; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/internal-metadata.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/internal-metadata.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../../node_modules/core-js/internals/hidden-keys.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js").f; +var uid = __webpack_require__(/*! ../internals/uid */ "../../../node_modules/core-js/internals/uid.js"); +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "../../../node_modules/core-js/internals/freezing.js"); + +var METADATA = uid('meta'); +var id = 0; + +// eslint-disable-next-line es/no-object-isextensible -- safe +var isExtensible = Object.isExtensible || function () { + return true; +}; + +var setMetadata = function (it) { + defineProperty(it, METADATA, { value: { + objectID: 'O' + ++id, // object ID + weakData: {} // weak collections IDs + } }); +}; + +var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; +}; + +var getWeakData = function (it, create) { + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; +}; + +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it); + return it; +}; + +var meta = module.exports = { + REQUIRED: false, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; + +hiddenKeys[METADATA] = true; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/internal-state.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/internal-state.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "../../../node_modules/core-js/internals/native-weak-map.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var objectHas = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var shared = __webpack_require__(/*! ../internals/shared-store */ "../../../node_modules/core-js/internals/shared-store.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../../node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../../node_modules/core-js/internals/hidden-keys.js"); + +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP) { + var store = shared.state || (shared.state = new WeakMap()); + var wmget = store.get; + var wmhas = store.has; + var wmset = store.set; + set = function (it, metadata) { + metadata.facade = it; + wmset.call(store, it, metadata); + return metadata; + }; + get = function (it) { + return wmget.call(store, it) || {}; + }; + has = function (it) { + return wmhas.call(store, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return objectHas(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return objectHas(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/is-array-iterator-method.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-array-iterator-method.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../../node_modules/core-js/internals/iterators.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/is-array.js": +/*!*****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-array.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../../node_modules/core-js/internals/classof-raw.js"); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(arg) { + return classof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/is-forced.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-forced.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : typeof detection == 'function' ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/is-integer.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-integer.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); + +var floor = Math.floor; + +// `Number.isInteger` method implementation +// https://tc39.es/ecma262/#sec-number.isinteger +module.exports = function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/is-object.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-object.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/is-pure.js": +/*!****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/is-pure.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = false; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/iterate.js": +/*!****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterate.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../../node_modules/core-js/internals/is-array-iterator-method.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "../../../node_modules/core-js/internals/to-length.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../../node_modules/core-js/internals/function-bind-context.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../../node_modules/core-js/internals/get-iterator-method.js"); +var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../../node_modules/core-js/internals/iterator-close.js"); + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + if (iterator) iteratorClose(iterator); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = toLength(iterable.length); length > index; index++) { + result = callFn(iterable[index]); + if (result && result instanceof Result) return result; + } return new Result(false); + } + iterator = iterFn.call(iterable); + } + + next = iterator.next; + while (!(step = next.call(iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator); + throw error; + } + if (typeof result == 'object' && result && result instanceof Result) return result; + } return new Result(false); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/iterator-close.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterator-close.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); + +module.exports = function (iterator) { + var returnMethod = iterator['return']; + if (returnMethod !== undefined) { + return anObject(returnMethod.call(iterator)).value; + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/iterators-core.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterators-core.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../../node_modules/core-js/internals/object-get-prototype-of.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../../node_modules/core-js/internals/is-pure.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +var returnThis = function () { return this; }; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +if ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) { + createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/iterators.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/iterators.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/microtask.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/microtask.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var macrotask = __webpack_require__(/*! ../internals/task */ "../../../node_modules/core-js/internals/task.js").set; +var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../../node_modules/core-js/internals/engine-is-ios.js"); +var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "../../../node_modules/core-js/internals/engine-is-webos-webkit.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../../node_modules/core-js/internals/engine-is-node.js"); + +var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; +var document = global.document; +var process = global.process; +var Promise = global.Promise; +// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` +var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); +var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; + +var flush, head, last, notify, toggle, node, promise, then; + +// modern engines have queueMicrotask method +if (!queueMicrotask) { + flush = function () { + var parent, fn; + if (IS_NODE && (parent = process.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (error) { + if (head) notify(); + else last = undefined; + throw error; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 + // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 + if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { + toggle = true; + node = document.createTextNode(''); + new MutationObserver(flush).observe(node, { characterData: true }); + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise && Promise.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + promise = Promise.resolve(undefined); + then = promise.then; + notify = function () { + then.call(promise, flush); + }; + // Node.js without promises + } else if (IS_NODE) { + notify = function () { + process.nextTick(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global, flush); + }; + } +} + +module.exports = queueMicrotask || function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/native-promise-constructor.js": +/*!***********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/native-promise-constructor.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); + +module.exports = global.Promise; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/native-symbol.js": +/*!**********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/native-symbol.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../../node_modules/core-js/internals/engine-is-node.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../../node_modules/core-js/internals/engine-v8-version.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + // eslint-disable-next-line es/no-symbol -- required for testing + return !Symbol.sham && + // Chrome 38 Symbol has incorrect toString conversion + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + (IS_NODE ? V8_VERSION === 38 : V8_VERSION > 37 && V8_VERSION < 41); +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/native-weak-map.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/native-weak-map.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../../node_modules/core-js/internals/inspect-source.js"); + +var WeakMap = global.WeakMap; + +module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap)); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/new-promise-capability.js": +/*!*******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/new-promise-capability.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "../../../node_modules/core-js/internals/a-function.js"); + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); +}; + +// 25.4.1.5 NewPromiseCapability(C) +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/number-parse-float.js": +/*!***************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/number-parse-float.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var trim = __webpack_require__(/*! ../internals/string-trim */ "../../../node_modules/core-js/internals/string-trim.js").trim; +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../../node_modules/core-js/internals/whitespaces.js"); + +var $parseFloat = global.parseFloat; +var FORCED = 1 / $parseFloat(whitespaces + '-0') !== -Infinity; + +// `parseFloat` method +// https://tc39.es/ecma262/#sec-parsefloat-string +module.exports = FORCED ? function parseFloat(string) { + var trimmedString = trim(String(string)); + var result = $parseFloat(trimmedString); + return result === 0 && trimmedString.charAt(0) == '-' ? -0 : result; +} : $parseFloat; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/number-parse-int.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/number-parse-int.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var trim = __webpack_require__(/*! ../internals/string-trim */ "../../../node_modules/core-js/internals/string-trim.js").trim; +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../../node_modules/core-js/internals/whitespaces.js"); + +var $parseInt = global.parseInt; +var hex = /^[+-]?0[Xx]/; +var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22; + +// `parseInt` method +// https://tc39.es/ecma262/#sec-parseint-string-radix +module.exports = FORCED ? function parseInt(string, radix) { + var S = trim(String(string)); + return $parseInt(S, (radix >>> 0) || (hex.test(S) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-assign.js": +/*!**********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-assign.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../../node_modules/core-js/internals/object-keys.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../../node_modules/core-js/internals/object-get-own-property-symbols.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../../node_modules/core-js/internals/object-property-is-enumerable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../../node_modules/core-js/internals/to-object.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../../node_modules/core-js/internals/indexed-object.js"); + +// eslint-disable-next-line es/no-object-assign -- safe +var $assign = Object.assign; +// eslint-disable-next-line es/no-object-defineproperty -- required for testing +var defineProperty = Object.defineProperty; + +// `Object.assign` method +// https://tc39.es/ecma262/#sec-object.assign +module.exports = !$assign || fails(function () { + // should have correct order of operations (Edge bug) + if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', { + enumerable: true, + get: function () { + defineProperty(this, 'b', { + value: 3, + enumerable: false + }); + } + }), { b: 2 })).b !== 1) return true; + // should work with symbols and should have deterministic property order (V8 bug) + var A = {}; + var B = {}; + // eslint-disable-next-line es/no-symbol -- safe + var symbol = Symbol(); + var alphabet = 'abcdefghijklmnopqrst'; + A[symbol] = 7; + alphabet.split('').forEach(function (chr) { B[chr] = chr; }); + return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length` + var T = toObject(target); + var argumentsLength = arguments.length; + var index = 1; + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + var propertyIsEnumerable = propertyIsEnumerableModule.f; + while (argumentsLength > index) { + var S = IndexedObject(arguments[index++]); + var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-create.js": +/*!**********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-create.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "../../../node_modules/core-js/internals/object-define-properties.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../../node_modules/core-js/internals/enum-bug-keys.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../../node_modules/core-js/internals/hidden-keys.js"); +var html = __webpack_require__(/*! ../internals/html */ "../../../node_modules/core-js/internals/html.js"); +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "../../../node_modules/core-js/internals/document-create-element.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../../node_modules/core-js/internals/shared-key.js"); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + /* global ActiveXObject -- old IE */ + activeXDocument = document.domain && new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame(); + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : defineProperties(result, Properties); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-define-properties.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-define-properties.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../../node_modules/core-js/internals/object-keys.js"); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]); + return O; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-define-property.js": +/*!*******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-define-property.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../../node_modules/core-js/internals/ie8-dom-define.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../../../node_modules/core-js/internals/to-primitive.js"); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!*******************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \*******************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../../node_modules/core-js/internals/object-property-is-enumerable.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../../node_modules/core-js/internals/create-property-descriptor.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../../node_modules/core-js/internals/to-indexed-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../../../node_modules/core-js/internals/to-primitive.js"); +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../../node_modules/core-js/internals/ie8-dom-define.js"); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-get-own-property-names.js": +/*!**************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-names.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../../node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../../node_modules/core-js/internals/enum-bug-keys.js"); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!****************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \****************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-get-prototype-of.js": +/*!********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-get-prototype-of.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../../node_modules/core-js/internals/to-object.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../../node_modules/core-js/internals/shared-key.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "../../../node_modules/core-js/internals/correct-prototype-getter.js"); + +var IE_PROTO = sharedKey('IE_PROTO'); +var ObjectPrototype = Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-keys-internal.js": +/*!*****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-keys-internal.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../../node_modules/core-js/internals/to-indexed-object.js"); +var indexOf = __webpack_require__(/*! ../internals/array-includes */ "../../../node_modules/core-js/internals/array-includes.js").indexOf; +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../../node_modules/core-js/internals/hidden-keys.js"); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~indexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-keys.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-keys.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../../node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../../node_modules/core-js/internals/enum-bug-keys.js"); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-property-is-enumerable.js": +/*!**************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-property-is-enumerable.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-set-prototype-of.js": +/*!********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-set-prototype-of.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* eslint-disable no-proto -- safe */ +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "../../../node_modules/core-js/internals/a-possible-prototype.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; + setter.call(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter.call(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-to-array.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-to-array.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../../node_modules/core-js/internals/object-keys.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../../node_modules/core-js/internals/to-indexed-object.js"); +var propertyIsEnumerable = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../../node_modules/core-js/internals/object-property-is-enumerable.js").f; + +// `Object.{ entries, values }` methods implementation +var createMethod = function (TO_ENTRIES) { + return function (it) { + var O = toIndexedObject(it); + var keys = objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) { + result.push(TO_ENTRIES ? [key, O[key]] : O[key]); + } + } + return result; + }; +}; + +module.exports = { + // `Object.entries` method + // https://tc39.es/ecma262/#sec-object.entries + entries: createMethod(true), + // `Object.values` method + // https://tc39.es/ecma262/#sec-object.values + values: createMethod(false) +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/object-to-string.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/object-to-string.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../../node_modules/core-js/internals/to-string-tag-support.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../../node_modules/core-js/internals/classof.js"); + +// `Object.prototype.toString` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.tostring +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/own-keys.js": +/*!*****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/own-keys.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../../node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../../node_modules/core-js/internals/object-get-own-property-symbols.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/path.js": +/*!*************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/path.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); + +module.exports = global; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/perform.js": +/*!****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/perform.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/promise-resolve.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/promise-resolve.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "../../../node_modules/core-js/internals/new-promise-capability.js"); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/redefine-all.js": +/*!*********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/redefine-all.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); + +module.exports = function (target, src, options) { + for (var key in src) redefine(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/redefine.js": +/*!*****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/redefine.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../../node_modules/core-js/internals/set-global.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../../node_modules/core-js/internals/inspect-source.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../../node_modules/core-js/internals/internal-state.js"); + +var getInternalState = InternalStateModule.get; +var enforceInternalState = InternalStateModule.enforce; +var TEMPLATE = String(String).split('String'); + +(module.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + var state; + if (typeof value == 'function') { + if (typeof key == 'string' && !has(value, 'name')) { + createNonEnumerableProperty(value, 'name', key); + } + state = enforceInternalState(value); + if (!state.source) { + state.source = TEMPLATE.join(typeof key == 'string' ? key : ''); + } + } + if (O === global) { + if (simple) O[key] = value; + else setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) O[key] = value; + else createNonEnumerableProperty(O, key, value); +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, 'toString', function toString() { + return typeof this == 'function' && getInternalState(this).source || inspectSource(this); +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/require-object-coercible.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/require-object-coercible.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/set-global.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/set-global.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); + +module.exports = function (key, value) { + try { + createNonEnumerableProperty(global, key, value); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/set-species.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/set-species.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../../node_modules/core-js/internals/descriptors.js"); + +var SPECIES = wellKnownSymbol('species'); + +module.exports = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + + if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { + defineProperty(Constructor, SPECIES, { + configurable: true, + get: function () { return this; } + }); + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/set-to-string-tag.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/set-to-string-tag.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "../../../node_modules/core-js/internals/object-define-property.js").f; +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +module.exports = function (it, TAG, STATIC) { + if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + } +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/shared-key.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/shared-key.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ../internals/shared */ "../../../node_modules/core-js/internals/shared.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../../node_modules/core-js/internals/uid.js"); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/shared-store.js": +/*!*********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/shared-store.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../../node_modules/core-js/internals/set-global.js"); + +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || setGlobal(SHARED, {}); + +module.exports = store; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/shared.js": +/*!***************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/shared.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../../node_modules/core-js/internals/is-pure.js"); +var store = __webpack_require__(/*! ../internals/shared-store */ "../../../node_modules/core-js/internals/shared-store.js"); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.10.1', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2021 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/species-constructor.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/species-constructor.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../../node_modules/core-js/internals/an-object.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "../../../node_modules/core-js/internals/a-function.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); + +// `SpeciesConstructor` abstract operation +// https://tc39.es/ecma262/#sec-speciesconstructor +module.exports = function (O, defaultConstructor) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/string-multibyte.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/string-multibyte.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "../../../node_modules/core-js/internals/to-integer.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../../node_modules/core-js/internals/require-object-coercible.js"); + +// `String.prototype.{ codePointAt, at }` methods implementation +var createMethod = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = String(requireObjectCoercible($this)); + var position = toInteger(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = S.charCodeAt(position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING ? S.charAt(position) : first + : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; +}; + +module.exports = { + // `String.prototype.codePointAt` method + // https://tc39.es/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod(true) +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/string-trim.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/string-trim.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../../node_modules/core-js/internals/require-object-coercible.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../../node_modules/core-js/internals/whitespaces.js"); + +var whitespace = '[' + whitespaces + ']'; +var ltrim = RegExp('^' + whitespace + whitespace + '*'); +var rtrim = RegExp(whitespace + whitespace + '*$'); + +// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation +var createMethod = function (TYPE) { + return function ($this) { + var string = String(requireObjectCoercible($this)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; + }; +}; + +module.exports = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + start: createMethod(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + end: createMethod(2), + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + trim: createMethod(3) +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/task.js": +/*!*************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/task.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../../node_modules/core-js/internals/function-bind-context.js"); +var html = __webpack_require__(/*! ../internals/html */ "../../../node_modules/core-js/internals/html.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../../node_modules/core-js/internals/document-create-element.js"); +var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../../node_modules/core-js/internals/engine-is-ios.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../../node_modules/core-js/internals/engine-is-node.js"); + +var location = global.location; +var set = global.setImmediate; +var clear = global.clearImmediate; +var process = global.process; +var MessageChannel = global.MessageChannel; +var Dispatch = global.Dispatch; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var defer, channel, port; + +var run = function (id) { + // eslint-disable-next-line no-prototype-builtins -- safe + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; + +var runner = function (id) { + return function () { + run(id); + }; +}; + +var listener = function (event) { + run(event.data); +}; + +var post = function (id) { + // old engines have not location.origin + global.postMessage(id + '', location.protocol + '//' + location.host); +}; + +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if (!set || !clear) { + set = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func -- spec requirement + (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); + }; + defer(counter); + return counter; + }; + clear = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (IS_NODE) { + defer = function (id) { + process.nextTick(runner(id)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(runner(id)); + }; + // Browsers with MessageChannel, includes WebWorkers + // except iOS - https://github.com/zloirock/core-js/issues/624 + } else if (MessageChannel && !IS_IOS) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = bind(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if ( + global.addEventListener && + typeof postMessage == 'function' && + !global.importScripts && + location && location.protocol !== 'file:' && + !fails(post) + ) { + defer = post; + global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in createElement('script')) { + defer = function (id) { + html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(runner(id), 0); + }; + } +} + +module.exports = { + set: set, + clear: clear +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-absolute-index.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-absolute-index.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "../../../node_modules/core-js/internals/to-integer.js"); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toInteger(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-indexed-object.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-indexed-object.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../../node_modules/core-js/internals/indexed-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../../node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-integer.js": +/*!*******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-integer.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var ceil = Math.ceil; +var floor = Math.floor; + +// `ToInteger` abstract operation +// https://tc39.es/ecma262/#sec-tointeger +module.exports = function (argument) { + return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-length.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-length.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "../../../node_modules/core-js/internals/to-integer.js"); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-object.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-object.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../../node_modules/core-js/internals/require-object-coercible.js"); + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-primitive.js": +/*!*********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-primitive.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (input, PREFERRED_STRING) { + if (!isObject(input)) return input; + var fn, val; + if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; + if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; + if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/to-string-tag-support.js": +/*!******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/to-string-tag-support.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/uid.js": +/*!************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/uid.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var postfix = Math.random(); + +module.exports = function (key) { + return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/use-symbol-as-uid.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/use-symbol-as-uid.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../../node_modules/core-js/internals/native-symbol.js"); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/well-known-symbol.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/well-known-symbol.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "../../../node_modules/core-js/internals/shared.js"); +var has = __webpack_require__(/*! ../internals/has */ "../../../node_modules/core-js/internals/has.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../../node_modules/core-js/internals/uid.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../../node_modules/core-js/internals/native-symbol.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../../node_modules/core-js/internals/use-symbol-as-uid.js"); + +var WellKnownSymbolsStore = shared('wks'); +var Symbol = global.Symbol; +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!has(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { + if (NATIVE_SYMBOL && has(Symbol, name)) { + WellKnownSymbolsStore[name] = Symbol[name]; + } else { + WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name); + } + } return WellKnownSymbolsStore[name]; +}; + + +/***/ }), + +/***/ "../../../node_modules/core-js/internals/whitespaces.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/internals/whitespaces.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// a string of all valid unicode whitespaces +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.aggregate-error.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.aggregate-error.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../../node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../../node_modules/core-js/internals/object-set-prototype-of.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../../node_modules/core-js/internals/object-create.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../../node_modules/core-js/internals/create-property-descriptor.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../../node_modules/core-js/internals/iterate.js"); + +var $AggregateError = function AggregateError(errors, message) { + var that = this; + if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message); + if (setPrototypeOf) { + // eslint-disable-next-line unicorn/error-message -- expected + that = setPrototypeOf(new Error(undefined), getPrototypeOf(that)); + } + if (message !== undefined) createNonEnumerableProperty(that, 'message', String(message)); + var errorsArray = []; + iterate(errors, errorsArray.push, { that: errorsArray }); + createNonEnumerableProperty(that, 'errors', errorsArray); + return that; +}; + +$AggregateError.prototype = create(Error.prototype, { + constructor: createPropertyDescriptor(5, $AggregateError), + message: createPropertyDescriptor(5, ''), + name: createPropertyDescriptor(5, 'AggregateError') +}); + +// `AggregateError` constructor +// https://tc39.es/ecma262/#sec-aggregate-error-constructor +$({ global: true }, { + AggregateError: $AggregateError +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.array.find.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.array.find.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var $find = __webpack_require__(/*! ../internals/array-iteration */ "../../../node_modules/core-js/internals/array-iteration.js").find; +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../../node_modules/core-js/internals/add-to-unscopables.js"); + +var FIND = 'find'; +var SKIPS_HOLES = true; + +// Shouldn't skip holes +if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); + +// `Array.prototype.find` method +// https://tc39.es/ecma262/#sec-array.prototype.find +$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables(FIND); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.array.from.js": +/*!********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.array.from.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var from = __webpack_require__(/*! ../internals/array-from */ "../../../node_modules/core-js/internals/array-from.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../../node_modules/core-js/internals/check-correctness-of-iteration.js"); + +var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { + // eslint-disable-next-line es/no-array-from -- required for testing + Array.from(iterable); +}); + +// `Array.from` method +// https://tc39.es/ecma262/#sec-array.from +$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { + from: from +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.array.iterator.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.array.iterator.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../../node_modules/core-js/internals/to-indexed-object.js"); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../../node_modules/core-js/internals/add-to-unscopables.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../../node_modules/core-js/internals/iterators.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../../node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../../node_modules/core-js/internals/define-iterator.js"); + +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); + +// `Array.prototype.entries` method +// https://tc39.es/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.es/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.es/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.es/ecma262/#sec-createarrayiterator +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), // target + index: 0, // next index + kind: kind // kind + }); +// `%ArrayIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return { value: undefined, done: true }; + } + if (kind == 'keys') return { value: index, done: false }; + if (kind == 'values') return { value: target[index], done: false }; + return { value: [index, target[index]], done: false }; +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.es/ecma262/#sec-createunmappedargumentsobject +// https://tc39.es/ecma262/#sec-createmappedargumentsobject +Iterators.Arguments = Iterators.Array; + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.map.js": +/*!*************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.map.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var collection = __webpack_require__(/*! ../internals/collection */ "../../../node_modules/core-js/internals/collection.js"); +var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "../../../node_modules/core-js/internals/collection-strong.js"); + +// `Map` constructor +// https://tc39.es/ecma262/#sec-map-objects +module.exports = collection('Map', function (init) { + return function Map() { return init(this, arguments.length ? arguments[0] : undefined); }; +}, collectionStrong); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.number.is-integer.js": +/*!***************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.is-integer.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var isInteger = __webpack_require__(/*! ../internals/is-integer */ "../../../node_modules/core-js/internals/is-integer.js"); + +// `Number.isInteger` method +// https://tc39.es/ecma262/#sec-number.isinteger +$({ target: 'Number', stat: true }, { + isInteger: isInteger +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.number.is-nan.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.is-nan.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); + +// `Number.isNaN` method +// https://tc39.es/ecma262/#sec-number.isnan +$({ target: 'Number', stat: true }, { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare -- NaN check + return number != number; + } +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.number.parse-float.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.parse-float.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var parseFloat = __webpack_require__(/*! ../internals/number-parse-float */ "../../../node_modules/core-js/internals/number-parse-float.js"); + +// `Number.parseFloat` method +// https://tc39.es/ecma262/#sec-number.parseFloat +// eslint-disable-next-line es/no-number-parsefloat -- required for testing +$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, { + parseFloat: parseFloat +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.number.parse-int.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.number.parse-int.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "../../../node_modules/core-js/internals/number-parse-int.js"); + +// `Number.parseInt` method +// https://tc39.es/ecma262/#sec-number.parseint +// eslint-disable-next-line es/no-number-parseint -- required for testing +$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, { + parseInt: parseInt +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.object.assign.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.assign.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var assign = __webpack_require__(/*! ../internals/object-assign */ "../../../node_modules/core-js/internals/object-assign.js"); + +// `Object.assign` method +// https://tc39.es/ecma262/#sec-object.assign +// eslint-disable-next-line es/no-object-assign -- required for testing +$({ target: 'Object', stat: true, forced: Object.assign !== assign }, { + assign: assign +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.object.entries.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.entries.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var $entries = __webpack_require__(/*! ../internals/object-to-array */ "../../../node_modules/core-js/internals/object-to-array.js").entries; + +// `Object.entries` method +// https://tc39.es/ecma262/#sec-object.entries +$({ target: 'Object', stat: true }, { + entries: function entries(O) { + return $entries(O); + } +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.object.set-prototype-of.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.set-prototype-of.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../../node_modules/core-js/internals/object-set-prototype-of.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +$({ target: 'Object', stat: true }, { + setPrototypeOf: setPrototypeOf +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.object.to-string.js": +/*!**************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.object.to-string.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../../node_modules/core-js/internals/to-string-tag-support.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); +var toString = __webpack_require__(/*! ../internals/object-to-string */ "../../../node_modules/core-js/internals/object-to-string.js"); + +// `Object.prototype.toString` method +// https://tc39.es/ecma262/#sec-object.prototype.tostring +if (!TO_STRING_TAG_SUPPORT) { + redefine(Object.prototype, 'toString', toString, { unsafe: true }); +} + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.promise.all-settled.js": +/*!*****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.all-settled.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "../../../node_modules/core-js/internals/a-function.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../../node_modules/core-js/internals/perform.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../../node_modules/core-js/internals/iterate.js"); + +// `Promise.allSettled` method +// https://tc39.es/ecma262/#sec-promise.allsettled +$({ target: 'Promise', stat: true }, { + allSettled: function allSettled(iterable) { + var C = this; + var capability = newPromiseCapabilityModule.f(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var promiseResolve = aFunction(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + promiseResolve.call(C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = { status: 'fulfilled', value: value }; + --remaining || resolve(values); + }, function (error) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = { status: 'rejected', reason: error }; + --remaining || resolve(values); + }); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.promise.any.js": +/*!*********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.any.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "../../../node_modules/core-js/internals/a-function.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../../node_modules/core-js/internals/perform.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../../node_modules/core-js/internals/iterate.js"); + +var PROMISE_ANY_ERROR = 'No one promise resolved'; + +// `Promise.any` method +// https://tc39.es/ecma262/#sec-promise.any +$({ target: 'Promise', stat: true }, { + any: function any(iterable) { + var C = this; + var capability = newPromiseCapabilityModule.f(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var promiseResolve = aFunction(C.resolve); + var errors = []; + var counter = 0; + var remaining = 1; + var alreadyResolved = false; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyRejected = false; + errors.push(undefined); + remaining++; + promiseResolve.call(C, promise).then(function (value) { + if (alreadyRejected || alreadyResolved) return; + alreadyResolved = true; + resolve(value); + }, function (error) { + if (alreadyRejected || alreadyResolved) return; + alreadyRejected = true; + errors[index] = error; + --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR)); + }); + }); + --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR)); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.promise.finally.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.finally.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../../node_modules/core-js/internals/is-pure.js"); +var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../../node_modules/core-js/internals/native-promise-constructor.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../../node_modules/core-js/internals/fails.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../../node_modules/core-js/internals/species-constructor.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../../node_modules/core-js/internals/promise-resolve.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); + +// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829 +var NON_GENERIC = !!NativePromise && fails(function () { + NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ }); +}); + +// `Promise.prototype.finally` method +// https://tc39.es/ecma262/#sec-promise.prototype.finally +$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, { + 'finally': function (onFinally) { + var C = speciesConstructor(this, getBuiltIn('Promise')); + var isFunction = typeof onFinally == 'function'; + return this.then( + isFunction ? function (x) { + return promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); + } +}); + +// patch native Promise.prototype for native async functions +if (!IS_PURE && typeof NativePromise == 'function' && !NativePromise.prototype['finally']) { + redefine(NativePromise.prototype, 'finally', getBuiltIn('Promise').prototype['finally']); +} + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.promise.js": +/*!*****************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.promise.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../../node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../../node_modules/core-js/internals/is-pure.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../../node_modules/core-js/internals/get-built-in.js"); +var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../../node_modules/core-js/internals/native-promise-constructor.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../../node_modules/core-js/internals/redefine.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../../node_modules/core-js/internals/redefine-all.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../../node_modules/core-js/internals/set-to-string-tag.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../../node_modules/core-js/internals/set-species.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../../node_modules/core-js/internals/is-object.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "../../../node_modules/core-js/internals/a-function.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../../node_modules/core-js/internals/an-instance.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../../node_modules/core-js/internals/inspect-source.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../../node_modules/core-js/internals/iterate.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../../node_modules/core-js/internals/check-correctness-of-iteration.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../../node_modules/core-js/internals/species-constructor.js"); +var task = __webpack_require__(/*! ../internals/task */ "../../../node_modules/core-js/internals/task.js").set; +var microtask = __webpack_require__(/*! ../internals/microtask */ "../../../node_modules/core-js/internals/microtask.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../../node_modules/core-js/internals/promise-resolve.js"); +var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "../../../node_modules/core-js/internals/host-report-errors.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../../node_modules/core-js/internals/perform.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../../node_modules/core-js/internals/internal-state.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../../node_modules/core-js/internals/is-forced.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../../node_modules/core-js/internals/engine-is-node.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../../node_modules/core-js/internals/engine-v8-version.js"); + +var SPECIES = wellKnownSymbol('species'); +var PROMISE = 'Promise'; +var getInternalState = InternalStateModule.get; +var setInternalState = InternalStateModule.set; +var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); +var PromiseConstructor = NativePromise; +var TypeError = global.TypeError; +var document = global.document; +var process = global.process; +var $fetch = getBuiltIn('fetch'); +var newPromiseCapability = newPromiseCapabilityModule.f; +var newGenericPromiseCapability = newPromiseCapability; +var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); +var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function'; +var UNHANDLED_REJECTION = 'unhandledrejection'; +var REJECTION_HANDLED = 'rejectionhandled'; +var PENDING = 0; +var FULFILLED = 1; +var REJECTED = 2; +var HANDLED = 1; +var UNHANDLED = 2; +var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; + +var FORCED = isForced(PROMISE, function () { + var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor); + if (!GLOBAL_CORE_JS_PROMISE) { + // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // We can't detect it synchronously, so just check versions + if (V8_VERSION === 66) return true; + // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test + if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true; + } + // We need Promise#finally in the pure version for preventing prototype pollution + if (IS_PURE && !PromiseConstructor.prototype['finally']) return true; + // We can't use @@species feature detection in V8 since it causes + // deoptimization and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false; + // Detect correctness of subclassing with @@species support + var promise = PromiseConstructor.resolve(1); + var FakePromise = function (exec) { + exec(function () { /* empty */ }, function () { /* empty */ }); + }; + var constructor = promise.constructor = {}; + constructor[SPECIES] = FakePromise; + return !(promise.then(function () { /* empty */ }) instanceof FakePromise); +}); + +var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { + PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); +}); + +// helpers +var isThenable = function (it) { + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; + +var notify = function (state, isReject) { + if (state.notified) return; + state.notified = true; + var chain = state.reactions; + microtask(function () { + var value = state.value; + var ok = state.state == FULFILLED; + var index = 0; + // variable length - can't use forEach + while (chain.length > index) { + var reaction = chain[index++]; + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (state.rejection === UNHANDLED) onHandleUnhandled(state); + state.rejection = HANDLED; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // can throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (error) { + if (domain && !exited) domain.exit(); + reject(error); + } + } + state.reactions = []; + state.notified = false; + if (isReject && !state.rejection) onUnhandled(state); + }); +}; + +var dispatchEvent = function (name, promise, reason) { + var event, handler; + if (DISPATCH_EVENT) { + event = document.createEvent('Event'); + event.promise = promise; + event.reason = reason; + event.initEvent(name, false, true); + global.dispatchEvent(event); + } else event = { promise: promise, reason: reason }; + if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event); + else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); +}; + +var onUnhandled = function (state) { + task.call(global, function () { + var promise = state.facade; + var value = state.value; + var IS_UNHANDLED = isUnhandled(state); + var result; + if (IS_UNHANDLED) { + result = perform(function () { + if (IS_NODE) { + process.emit('unhandledRejection', value, promise); + } else dispatchEvent(UNHANDLED_REJECTION, promise, value); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; + if (result.error) throw result.value; + } + }); +}; + +var isUnhandled = function (state) { + return state.rejection !== HANDLED && !state.parent; +}; + +var onHandleUnhandled = function (state) { + task.call(global, function () { + var promise = state.facade; + if (IS_NODE) { + process.emit('rejectionHandled', promise); + } else dispatchEvent(REJECTION_HANDLED, promise, state.value); + }); +}; + +var bind = function (fn, state, unwrap) { + return function (value) { + fn(state, value, unwrap); + }; +}; + +var internalReject = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + state.value = value; + state.state = REJECTED; + notify(state, true); +}; + +var internalResolve = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + try { + if (state.facade === value) throw TypeError("Promise can't be resolved itself"); + var then = isThenable(value); + if (then) { + microtask(function () { + var wrapper = { done: false }; + try { + then.call(value, + bind(internalResolve, wrapper, state), + bind(internalReject, wrapper, state) + ); + } catch (error) { + internalReject(wrapper, error, state); + } + }); + } else { + state.value = value; + state.state = FULFILLED; + notify(state, false); + } + } catch (error) { + internalReject({ done: false }, error, state); + } +}; + +// constructor polyfill +if (FORCED) { + // 25.4.3.1 Promise(executor) + PromiseConstructor = function Promise(executor) { + anInstance(this, PromiseConstructor, PROMISE); + aFunction(executor); + Internal.call(this); + var state = getInternalState(this); + try { + executor(bind(internalResolve, state), bind(internalReject, state)); + } catch (error) { + internalReject(state, error); + } + }; + // eslint-disable-next-line no-unused-vars -- required for `.length` + Internal = function Promise(executor) { + setInternalState(this, { + type: PROMISE, + done: false, + notified: false, + parent: false, + reactions: [], + rejection: false, + state: PENDING, + value: undefined + }); + }; + Internal.prototype = redefineAll(PromiseConstructor.prototype, { + // `Promise.prototype.then` method + // https://tc39.es/ecma262/#sec-promise.prototype.then + then: function then(onFulfilled, onRejected) { + var state = getInternalPromiseState(this); + var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = IS_NODE ? process.domain : undefined; + state.parent = true; + state.reactions.push(reaction); + if (state.state != PENDING) notify(state, false); + return reaction.promise; + }, + // `Promise.prototype.catch` method + // https://tc39.es/ecma262/#sec-promise.prototype.catch + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + var state = getInternalState(promise); + this.promise = promise; + this.resolve = bind(internalResolve, state); + this.reject = bind(internalReject, state); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function (C) { + return C === PromiseConstructor || C === PromiseWrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + + if (!IS_PURE && typeof NativePromise == 'function') { + nativeThen = NativePromise.prototype.then; + + // wrap native Promise#then for native async functions + redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) { + var that = this; + return new PromiseConstructor(function (resolve, reject) { + nativeThen.call(that, resolve, reject); + }).then(onFulfilled, onRejected); + // https://github.com/zloirock/core-js/issues/640 + }, { unsafe: true }); + + // wrap fetch result + if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + fetch: function fetch(input /* , init */) { + return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments)); + } + }); + } +} + +$({ global: true, wrap: true, forced: FORCED }, { + Promise: PromiseConstructor +}); + +setToStringTag(PromiseConstructor, PROMISE, false, true); +setSpecies(PROMISE); + +PromiseWrapper = getBuiltIn(PROMISE); + +// statics +$({ target: PROMISE, stat: true, forced: FORCED }, { + // `Promise.reject` method + // https://tc39.es/ecma262/#sec-promise.reject + reject: function reject(r) { + var capability = newPromiseCapability(this); + capability.reject.call(undefined, r); + return capability.promise; + } +}); + +$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { + // `Promise.resolve` method + // https://tc39.es/ecma262/#sec-promise.resolve + resolve: function resolve(x) { + return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); + } +}); + +$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { + // `Promise.all` method + // https://tc39.es/ecma262/#sec-promise.all + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aFunction(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + $promiseResolve.call(C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + }, + // `Promise.race` method + // https://tc39.es/ecma262/#sec-promise.race + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aFunction(C.resolve); + iterate(iterable, function (promise) { + $promiseResolve.call(C, promise).then(capability.resolve, reject); + }); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/es.string.iterator.js": +/*!*************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/es.string.iterator.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "../../../node_modules/core-js/internals/string-multibyte.js").charAt; +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../../node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../../node_modules/core-js/internals/define-iterator.js"); + +var STRING_ITERATOR = 'String Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + +// `String.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-string.prototype-@@iterator +defineIterator(String, 'String', function (iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: String(iterated), + index: 0 + }); +// `%StringIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { value: undefined, done: true }; + point = charAt(string, index); + state.index += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "../../../node_modules/core-js/modules/web.dom-collections.iterator.js": +/*!***********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/core-js/modules/web.dom-collections.iterator.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "../../../node_modules/core-js/internals/global.js"); +var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "../../../node_modules/core-js/internals/dom-iterables.js"); +var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "../../../node_modules/core-js/modules/es.array.iterator.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ArrayValues = ArrayIteratorMethods.values; + +for (var COLLECTION_NAME in DOMIterables) { + var Collection = global[COLLECTION_NAME]; + var CollectionPrototype = Collection && Collection.prototype; + if (CollectionPrototype) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[ITERATOR] !== ArrayValues) try { + createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues); + } catch (error) { + CollectionPrototype[ITERATOR] = ArrayValues; + } + if (!CollectionPrototype[TO_STRING_TAG]) { + createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); + } + if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { + createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); + } catch (error) { + CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; + } + } + } +} + + +/***/ }), + +/***/ "../../../node_modules/guid/guid.js": +/*!************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/node_modules/guid/guid.js ***! + \************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +(function () { + var validator = new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", "i"); + + function gen(count) { + var out = ""; + for (var i=0; i 2 && valueAsString[0] === '%' && valueAsString[valueAsString.length - 1] === '%') { + return true; + } + return false; + }; + // tslint:disable-next-line:no-any + DataTypeConverter.parseBoolean = function (booleanString) { + // boolean values come to us as 'true'|'false' + var normalizedBoolean = booleanString.toLowerCase(); + return (normalizedBoolean !== 'true' && normalizedBoolean !== 'false') + ? this.specialValueIndicator + : normalizedBoolean === 'true'; + }; + // tslint:disable-next-line:no-any + DataTypeConverter.parseNumber = function (valueAsString) { + var value = Number(valueAsString); + return isNaN(value) ? this.specialValueIndicator : value; + }; + DataTypeConverter.parseDate = function (dateAsString) { + // Note that without a time, the date is assumed to be UTC + // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 + // This matches style used in existing convertFilterValuePresModel + var value = new Date(dateAsString); + return Number.isNaN(value.getTime()) ? null : value; + }; + DataTypeConverter.parseDateTime = function (dateAsString) { + // With a time, the date is assumed to be UTC. + // Our date format is always: yyyy-mm-dd hh:mm:ss + // Unfortunately, IE11 can't parse that format so we add a T between the day and time. + // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) + var formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); + var value = new Date(formattedDateString); + return Number.isNaN(value.getTime()) ? null : value; + }; + // tslint:disable-next-line:no-any + DataTypeConverter.convertValueAsStringToValue = function (valueAsString, type) { + // This is both DataDictionary and ShowDataTablePresModel compatible. + // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in + // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values. + // For either of these cases, we return specialValueIndicator (or the original special string). + // To maintain backwards compatibilty, this converter: + // 1. returns a string for any special values + // 2. returns a string for any date + // Parameter min/max values can be undefined, so result is also undefined + if (valueAsString === undefined || valueAsString === null) { + return undefined; + } + if (this.isSpecial(valueAsString)) { + return valueAsString; + } + switch (type) { + case Enums_1.DataType.Bool: + return this.parseBoolean(valueAsString); + case Enums_1.DataType.Int: + case Enums_1.DataType.Float: + // Return special value '%null%' for any failure in parsing. + // We need to do that because ShowDataTablePresModel will give us strings like 'null' + // for special values. + return this.parseNumber(valueAsString); + case Enums_1.DataType.Date: + // For ShowDataTablePresModel, special values will be "null" which will fail to parse. + // In that case, we return '%null%'. + return this.parseDate(valueAsString) === null ? this.specialValueIndicator : valueAsString; + case Enums_1.DataType.DateTime: + // For ShowDataTablePresModel, special values will be "null" which will fail to parse. + // In that case, we return '%null%' + return this.parseDateTime(valueAsString) === null ? this.specialValueIndicator : valueAsString; + case Enums_1.DataType.Spatial: + case Enums_1.DataType.String: + default: + return valueAsString; + } + }; + // tslint:disable-next-line:no-any + DataTypeConverter.convertValueToNativeValue = function (value, type) { + // This converts from our 1.2 API that returns strings for specials, and dates as strings. + // It takes the special case of '%null%' and returns a null. + // For dates, it returns a Date object rather than a string. + // convertValueToNativeValue should be used to build a DataValue.nativeValue field. + // Parameter min/max can be undefined. If that is the case, nativeValue is treated like a special + if (value === undefined || value === null) { + return null; + } + switch (type) { + case Enums_1.DataType.Bool: + return (typeof value === 'string') ? null : value; + case Enums_1.DataType.Int: + case Enums_1.DataType.Float: + return (typeof value === 'string') ? null : value; + case Enums_1.DataType.Date: + // Convert the string to Date object (or null if parsing fails ... we assume special) + return this.parseDate(value); + case Enums_1.DataType.DateTime: + // Convert the string to Date object (or null if parsing fails ... we assume special) + return this.parseDateTime(value); + case Enums_1.DataType.String: + return this.isSpecial(value) ? null : value; + case Enums_1.DataType.Spatial: + default: + return value; + } + }; + // tslint:disable-next-line:no-any + DataTypeConverter.convertStringValueToNativeValue = function (value, type) { + // This handles the conversion from string directly to native value for all types + return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); + }; + DataTypeConverter.specialValueIndicator = '%null%'; + return DataTypeConverter; +}()); +exports.DataTypeConverter = DataTypeConverter; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/contract/Enums.js": +/*!**********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Enums.js ***! + \**********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var ExtensionContext; +(function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Unknown"] = "unknown"; +})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); +var ExtensionMode; +(function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + ExtensionMode["Unknown"] = "unknown"; +})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); +var ColumnType; +(function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; +})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); +var DashboardObjectType; +(function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; +})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); +var DataType; +(function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; +})(DataType = exports.DataType || (exports.DataType = {})); +var EncodedDataType; +(function (EncodedDataType) { + EncodedDataType["Number"] = "number"; + EncodedDataType["String"] = "string"; + EncodedDataType["Date"] = "date"; + EncodedDataType["Boolean"] = "boolean"; +})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); +var ErrorCodes; +(function (ErrorCodes) { + ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; + ErrorCodes["INTERNAL_ERROR"] = "internal-error"; + ErrorCodes["MISSING_ENUM_MAPPING"] = "missing-enum-mapping"; + ErrorCodes["MISSING_PARAMETER"] = "missing-parameter"; + ErrorCodes["PERMISSION_DENIED"] = "permission-denied"; + ErrorCodes["PRES_MODEL_PARSING_ERROR"] = "pres-model-parsing-error"; + ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; + ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; + ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; +})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); +var FieldAggregationType; +(function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; +})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); +var FieldRoleType; +(function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; +})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); +/** + * The different update types for applying filter. + */ +var FilterUpdateType; +(function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; +})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); +var SheetType; +(function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; +})(SheetType = exports.SheetType || (exports.SheetType = {})); +var DomainRestrictionType; +(function (DomainRestrictionType) { + DomainRestrictionType["All"] = "all"; + DomainRestrictionType["List"] = "list"; + DomainRestrictionType["Range"] = "range"; +})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); +var DateStepPeriod; +(function (DateStepPeriod) { + DateStepPeriod["Years"] = "years"; + DateStepPeriod["Quarters"] = "quarters"; + DateStepPeriod["Months"] = "months"; + DateStepPeriod["Weeks"] = "weeks"; + DateStepPeriod["Days"] = "days"; + DateStepPeriod["Hours"] = "hours"; + DateStepPeriod["Minutes"] = "minutes"; + DateStepPeriod["Seconds"] = "seconds"; +})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); +/** + * The option for specifying which values to include for filtering. + */ +var FilterNullOption; +(function (FilterNullOption) { + FilterNullOption["NullValues"] = "nullvalues"; + FilterNullOption["NonNullValues"] = "nonnullvalues"; + FilterNullOption["AllValues"] = "allvalues"; +})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); +/** + * The type of filter domain + */ +var FilterDomainType; +(function (FilterDomainType) { + FilterDomainType["Relevant"] = "relevant"; + FilterDomainType["Database"] = "database"; +})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); +/** + * Internal enum for specifying the selection type for select marks api. + */ +var SelectionUpdateType; +(function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; +})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); +/** + * Internal enum for specifying the included values type for range selection. + */ +var QuantitativeIncludedValues; +(function (QuantitativeIncludedValues) { + QuantitativeIncludedValues["IncludeNull"] = "include-null"; + QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; + QuantitativeIncludedValues["IncludeAll"] = "include-all"; +})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); +/** + * Type of mark for a given marks card in a viz. + */ +var MarkType; +(function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; +})(MarkType = exports.MarkType || (exports.MarkType = {})); +/** + * Internal enum for specifying the type of filter + */ +var FilterType; +(function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["RelativeDate"] = "relativeDate"; + FilterType["Hierarchical"] = "hierarchical"; +})(FilterType = exports.FilterType || (exports.FilterType = {})); +/** + * Internal enum for specifying the DateRangeType of a relative date filter + */ +var DateRangeType; +(function (DateRangeType) { + /** + * Refers to the last day, week, month, etc. of the date period. + */ + DateRangeType["Last"] = "last"; + /** + * Refers to the last N days, weeks, months, etc. of the date period. + */ + DateRangeType["LastN"] = "lastN"; + /** + * Refers to the next day, week, month, etc. of the date period. + */ + DateRangeType["Next"] = "next"; + /** + * Refers to the next N days, weeks, months, etc. of the date period. + */ + DateRangeType["NextN"] = "nextN"; + /** + * Refers to the current day, week, month, etc. of the date period. + */ + DateRangeType["Current"] = "current"; + /** + * Refers to everything up to and including the current day, week, month, etc. of the date period. + */ + DateRangeType["ToDate"] = "toDate"; +})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); +/** + * Used to determine if the launching of an extension dialog succeeded or failed. + */ +var ExtensionDialogResult; +(function (ExtensionDialogResult) { + ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; + ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; + ExtensionDialogResult["Success"] = "success"; +})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); +// Enumeration for ApiShowData table id sentinels. +var ApiShowDataTableSentinel; +(function (ApiShowDataTableSentinel) { + // find the one logical table - used in version compatibility check for getUnderlyingDataTable and getLogicalDataTable commands + ApiShowDataTableSentinel["SingleTableId"] = "single-table-id-sentinel"; + ApiShowDataTableSentinel["SingleTableCaption"] = "Single table id sentinel"; +})(ApiShowDataTableSentinel = exports.ApiShowDataTableSentinel || (exports.ApiShowDataTableSentinel = {})); +/** + * Used to optimize the getSummaryData/getUnderlyingTableData results + * Mapped from external IncludeDataValuesOption + */ +var ApiShowDataTableFormat; +(function (ApiShowDataTableFormat) { + ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; + ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; + ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; +})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/contract/Notifications.js": +/*!******************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Notifications.js ***! + \******************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var NotificationId; +(function (NotificationId) { + NotificationId["SelectedMarksChanged"] = "selected-marks-changed"; + NotificationId["ParameterChanged"] = "parameter-changed"; + NotificationId["FilterChanged"] = "filter-changed"; + NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; + NotificationId["SettingsChanged"] = "settings-changed"; + NotificationId["ContextMenuClick"] = "context-menu-click"; + NotificationId["TestConversionNotification"] = "test-conversion-notification"; + NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; +})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/contract/Parameters.js": +/*!***************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Parameters.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var ParameterId; +(function (ParameterId) { + ParameterId["ExtensionLocator"] = "extension-locator"; + ParameterId["ExtensionBootstrapInfo"] = "extension-bootstrap-info"; + ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; + ParameterId["VisualId"] = "visual-id"; + ParameterId["SheetPath"] = "sheet-path"; + ParameterId["ColumnsToIncludeById"] = "columns-to-include-by-id"; + ParameterId["IgnoreAliases"] = "ignore-aliases"; + ParameterId["IgnoreSelection"] = "ignore-selection"; + ParameterId["IncludeAllColumns"] = "include-all-columns"; + ParameterId["MaxRows"] = "max-rows"; + ParameterId["UnderlyingDataTable"] = "underlying-data-table"; + ParameterId["UnderlyingSummaryDataTable"] = "underlying-summary-data-table"; + ParameterId["DataSourceDataTable"] = "data-source-data-table"; + ParameterId["ShowDataTableFormat"] = "show-data-table-format"; + ParameterId["SettingsValues"] = "settings-values"; + ParameterId["SelectedData"] = "selected-data"; + ParameterId["HighlightedData"] = "highlighted-data"; + // Filter Params + ParameterId["FieldName"] = "field-name"; + ParameterId["FilterValues"] = "filter-values"; + ParameterId["FilterUpdateType"] = "filter-update-type"; + ParameterId["IsExcludeMode"] = "is-exclude"; + ParameterId["FilterRangeMin"] = "filter-range-min"; + ParameterId["FilterRangeMax"] = "filter-range-max"; + ParameterId["FilterRangeNullOption"] = "filter-range-null-option"; + ParameterId["WorksheetFilters"] = "worksheet-filters"; + ParameterId["FieldId"] = "field-id"; + ParameterId["DomainType"] = "domain-type"; + ParameterId["CategoricalDomain"] = "categorical-domain"; + ParameterId["QuantitativeDomain"] = "quantitative-dmain"; + ParameterId["Field"] = "field"; + ParameterId["WorksheetName"] = "worksheet-name"; + ParameterId["DashboardName"] = "dashboard"; + ParameterId["ParameterInfo"] = "parameter-info"; + ParameterId["ParameterInfos"] = "parameter-infos"; + ParameterId["ParameterCaption"] = "paremeter-caption"; + ParameterId["ParameterFieldName"] = "parameter-field-name"; + ParameterId["ParameterValue"] = "parameter-value"; + ParameterId["Selection"] = "selection"; + ParameterId["SelectionUpdateType"] = "selectionUpdateType"; + ParameterId["HierValSelectionModels"] = "hierarchicalValueSelectionModels"; + ParameterId["QuantRangeSelectionModels"] = "quantativeRangeSelectionModels"; + ParameterId["DimValSelectionModels"] = "dimensionValueSelectionModels"; + ParameterId["ActiveTablesInfo"] = "active-tables-info"; + ParameterId["DataSource"] = "data-source"; + ParameterId["DataSourceId"] = "data-source-id"; + ParameterId["DeltaTimeMs"] = "delta-time-ms"; + ParameterId["ShouldRefreshDS"] = "should-refresh-ds"; + ParameterId["DataSchema"] = "data-schema"; + ParameterId["DataSourceName"] = "data-source-name"; + ParameterId["ColumnsToInclude"] = "columns-to-include"; + ParameterId["JoinDescription"] = "join-description"; + ParameterId["ConnectionDescriptionSummaries"] = "connection-description-summaries"; + ParameterId["ExtensionDialogUrl"] = "extension-dialog-url"; + ParameterId["ExtensionDialogPayload"] = "extension-dialog-payload"; + ParameterId["IsExtensionDialog"] = "is-extension-dialog"; + ParameterId["ExtensionDialogH"] = "extension-dialog-height"; + ParameterId["ExtensionDialogW"] = "extension-dialog-width"; + ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; + ParameterId["ExtensionContextMenuIds"] = "extension-context-menu-ids"; + ParameterId["TestConversionParameter"] = "test-conversion-parameter"; + ParameterId["Dashboard"] = "dashboard"; + ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; + ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; + ParameterId["LogicalTableId"] = "logical-table-id"; + ParameterId["VizAPIInputJson"] = "vizapi-input-json"; + ParameterId["VizAPISVG"] = "vizapi-svg"; + ParameterId["EmbeddingBootstrapInfo"] = "embedding-bootstrap-info"; +})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/contract/Verbs.js": +/*!**********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/contract/Verbs.js ***! + \**********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// Declare this key type and export the NotificationId to make this behave like a string enum +var VerbId; +(function (VerbId) { + VerbId["ApplyCategoricalFilter"] = "categorical-filter"; + VerbId["ApplyRangeFilter"] = "range-filter"; + VerbId["ClearFilter"] = "clear-filter"; + VerbId["InitializeExtension"] = "initialize-extension"; + VerbId["GetDataSummaryData"] = "get-summary-data"; + VerbId["GetUnderlyingData"] = "get-underlying-data"; + VerbId["GetDataSourceData"] = "get-datasource-data"; + VerbId["SaveExtensionSettings"] = "save-extension-settings"; + VerbId["GetSelectedMarks"] = "get-selected-marks"; + VerbId["GetHighlightedMarks"] = "get-highlighted-marks"; + VerbId["GetParametersForSheet"] = "get-parameters-for-sheet"; + VerbId["FindParameter"] = "find-parameter"; + VerbId["ChangeParameterValue"] = "change-parameter-value"; + VerbId["ClearSelectedMarks"] = "clear-selected-marks"; + VerbId["SelectByValue"] = "select-by-value"; + VerbId["GetDataSources"] = "get-data-sources"; + VerbId["RefreshDataSource"] = "refresh-data-source"; + VerbId["GetFilters"] = "get-filters"; + VerbId["GetFieldAndDataSource"] = "get-field-and-datasource"; + VerbId["GetCategoricalDomain"] = "get-categorical-domain"; + VerbId["GetRangeDomain"] = "get-range-domain"; + VerbId["GetJoinDescription"] = "get-join-description"; + VerbId["GetConnectionDescriptionSummaries"] = "get-connection-description-summaries"; + VerbId["DisplayDialog"] = "display-dialog"; + VerbId["CloseDialog"] = "close-dialog"; + VerbId["TestConversionVerb"] = "test-conversion-verb"; + VerbId["GetField"] = "get-field"; + VerbId["GetDataSource"] = "get-datasource"; + VerbId["GetActiveTables"] = "get-active-tables"; + VerbId["SetZoneVisibility"] = "set-zone-visibility"; + VerbId["BlockExtension"] = "block-extension"; + VerbId["GetLogicalTables"] = "get-logical-tables"; + VerbId["GetLogicalTableData"] = "get-logical-table-data"; + VerbId["GetUnderlyingTableData"] = "get-underlying-table-data"; + VerbId["GetUnderlyingTables"] = "get-underlying-tables"; + VerbId["VizAPI"] = "viz-api"; + VerbId["GetEmbeddingBootstrapInfo"] = "get-embedding-bootstrap-info"; +})(VerbId = exports.VerbId || (exports.VerbId = {})); + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js": +/*!*************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***! + \*************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var guid = __webpack_require__(/*! guid */ "../../../node_modules/guid/guid.js"); +var CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); +var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +var MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); +var JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of + * this class can be instantiated on both sides of a frame boundary to facilitate communication + * in both directions between the frames. This class implements both the dispatcher and the listener + * portions, but doesn't require callers to care about both. + */ +var CrossFrameMessenger = /** @class */ (function () { + /** + * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener, + * be sure to call StartListening and register message handlers. + * @param thisWindow The window object which the CrossFrameMessenger lives. An onMessage listener will be added here. + * @param [otherWindow] Optional otherWindow which messages will be posted to. + * If defined, incoming messages must originate from otherWindow to be passed on + * @param [otherWindowOrigin] The target origin which otherWindow must have in order to receive dispatched messages. + * This value will be sent as the targetOrigin of a postMessage + * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) + */ + function CrossFrameMessenger(thisWindow, otherWindow, otherWindowOrigin) { + this.thisWindow = thisWindow; + this.otherWindow = otherWindow; + this.otherWindowOrigin = otherWindowOrigin; + // Make sure to call StartListening + } + ///// MessageListener Implementation + CrossFrameMessenger.prototype.startListening = function () { + var _this = this; + // Check if we already are listening, if not, hook up a message listener + if (!this.unregisterFunction) { + var boundHandler_1 = this.onMessageReceived.bind(this); + this.thisWindow.addEventListener('message', boundHandler_1, true); + this.unregisterFunction = function () { return _this.thisWindow.removeEventListener('message', boundHandler_1, true); }; + } + }; + CrossFrameMessenger.prototype.stopListening = function () { + // Stop listening if we have started listening + if (this.unregisterFunction) { + this.unregisterFunction(); + this.unregisterFunction = undefined; + } + }; + CrossFrameMessenger.prototype.setInitializeMessageHandler = function (handler) { + this.initializeMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setCommandResponseMessageHandler = function (handler) { + this.commandResponseMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setCommandMessageHandler = function (handler) { + this.commandMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setNotificationMessageHandler = function (handler) { + this.notificationMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setHandshakeMessageHandler = function (handler) { + this.handshakeMessageHandler = handler; + }; + ///// MessageDispatcher Implementation + /** + * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract) + * @param crossFrameVersion crossframe messaging version (exported in JsApiInternalConntract) + * @param options additional options that can be passed at initialization (information about the version of + * external being used for example) + */ + CrossFrameMessenger.prototype.prepareInitializationMessage = function (apiVersion, crossFrameVersion, options) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Initialize, + crossFrameVersion: crossFrameVersion, + apiVersion: apiVersion, + options: options + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareCommandMessage = function (verbId, parameters) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Command, + verbId: verbId, + parameters: parameters + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareCommandResponseMessage = function (commandGuid, data, error) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.CommandResponse, + commandGuid: commandGuid, + data: data, + error: error + }; + if (error) { + // stringify error object to remove unserializable fields like functions and prevent serialization errors + message.error = JSON.parse(JSON.stringify(error)); + } + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareNotificationMessage = function (notificationId, data) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Notification, + notificationId: notificationId, + data: data + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareAckMessage = function () { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Ack, + platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION + }; + return this.prepareMessage(message); + }; + /** + * Prepares a pending message for sending and returns the prepared message + * + * @param msg The message to be sent to this.otherWindow + * @returns The prepared message + */ + CrossFrameMessenger.prototype.prepareMessage = function (msg) { + if (!this.otherWindow || !this.otherWindowOrigin) { + throw 'Other window not initialized, cannot dispatch messages'; + } + var preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); + return preparedMessage; + }; + /** + * Called when a message is received. Does some validation of the message, and then + * calls an appropriate message handler if one is defined + * + * @param event The incoming MessageEvent + */ + CrossFrameMessenger.prototype.onMessageReceived = function (event) { + // If we have an otherWindow defined, make sure the message is coming from there + if (this.otherWindow && event.source !== this.otherWindow) { + return; + } + // Do some validation on event.data to make sure that we have received a real message + if (!event.data) { + return; + } + var message = event.data; + if (!MessageTypeChecks_1.isMessage(message)) { + return; + } + // Check the declared message type, validate the message, and call an appropriate hander if one exists + switch (message.msgType) { + case MessageTypes_1.MessageType.Initialize: { + if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) { + return; + } + this.initializeMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.CommandResponse: { + if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) { + return; + } + this.commandResponseMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Command: { + if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) { + return; + } + this.commandMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Notification: { + if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) { + return; + } + this.notificationMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Handshake: { + if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) { + return; + } + this.handshakeMessageHandler(message, event.source); + break; + } + default: + // Just ignore this since we don't know how to handle the message type + } + }; + CrossFrameMessenger.prototype.setOtherWindow = function (otherWindow) { + this.otherWindow = otherWindow; + }; + CrossFrameMessenger.prototype.setOtherWindowOrigin = function (origin) { + this.otherWindowOrigin = origin; + }; + return CrossFrameMessenger; +}()); +exports.CrossFrameMessenger = CrossFrameMessenger; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js": +/*!*******************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***! + \*******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of the PreparedMessage interface used to post messages between + * two frames using window.postMessage + */ +var CrossFramePreparedMessage = /** @class */ (function () { + /** + * Creates an instance of CrossFramePreparedMessage. + * @param _message The message to be sent + * @param _target The target window where the message will be sent + * @param _origin The targetOrigin where this message can be received + */ + function CrossFramePreparedMessage(_message, _target, _origin) { + this._message = _message; + this._target = _target; + this._origin = _origin; + } + Object.defineProperty(CrossFramePreparedMessage.prototype, "messageGuid", { + get: function () { return this._message.msgGuid; }, + enumerable: true, + configurable: true + }); + CrossFramePreparedMessage.prototype.send = function () { + this._target.postMessage(this._message, this._origin); + return this; + }; + return CrossFramePreparedMessage; +}()); +exports.CrossFramePreparedMessage = CrossFramePreparedMessage; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js": +/*!***********************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js ***! + \***********************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var guid = __webpack_require__(/*! guid */ "../../../node_modules/guid/guid.js"); +var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +/* tslint:disable no-any */ +function isMessage(data) { + if (!data) { + return false; + } + var message = data; + if (!message || !message.msgGuid || !message.msgType) { + return false; + } + if (!guid.isGuid(message.msgGuid)) { + return false; + } + if (typeof message.msgType !== 'string') { + return false; + } + var messageTypes = [MessageTypes_1.MessageType.Command, MessageTypes_1.MessageType.CommandResponse, MessageTypes_1.MessageType.Initialize, MessageTypes_1.MessageType.Notification, MessageTypes_1.MessageType.Handshake]; + if (messageTypes.indexOf(message.msgType) < 0) { + return false; + } + return true; +} +exports.isMessage = isMessage; +function isVersion(versionNumber) { + if (!versionNumber) { + return false; + } + var v = versionNumber; + if (typeof v !== 'object') { + return false; + } + if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') { + return false; + } + return true; +} +exports.isVersion = isVersion; +function isInitMessage(message) { + if (!isMessage(message)) { + return false; + } + var initMessage = message; + if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { + return false; + } + if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) { + return false; + } + if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) { + return false; + } + return true; +} +exports.isInitMessage = isInitMessage; +function isCommandResponseMessage(message) { + if (!isMessage(message)) { + return false; + } + var crMessage = message; + if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { + return false; + } + if (!guid.isGuid(crMessage.commandGuid)) { + return false; + } + if (!crMessage.data && !crMessage.error) { + return false; + } + return true; +} +exports.isCommandResponseMessage = isCommandResponseMessage; +function isCommandMessage(message) { + if (!isMessage(message)) { + return false; + } + var commandMessage = message; + if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { + return false; + } + if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') { + return false; + } + if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') { + return false; + } + return true; +} +exports.isCommandMessage = isCommandMessage; +function isNotificationMessage(message) { + if (!isMessage(message)) { + return false; + } + var notificationMessage = message; + if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { + return false; + } + if (!notificationMessage.data) { + return false; + } + if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') { + return false; + } + return true; +} +exports.isNotificationMessage = isNotificationMessage; +function isHandshakeMessage(message) { + if (!isMessage(message)) { + return false; + } + var handshakeMessage = message; + if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { + return false; + } + return true; +} +exports.isHandshakeMessage = isHandshakeMessage; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js": +/*!****************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***! + \****************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enum defining the 4 different types of messages we have defined + */ +var MessageType; +(function (MessageType) { + MessageType["Initialize"] = "initialize"; + MessageType["Notification"] = "notification"; + MessageType["Command"] = "command"; + MessageType["CommandResponse"] = "command-response"; + MessageType["Handshake"] = "v-handshake"; + MessageType["Ack"] = "v-ack"; +})(MessageType = exports.MessageType || (exports.MessageType = {})); + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js": +/*!*******************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***! + \*******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and internal version number +*/ +var IdentityVersionConverter = /** @class */ (function () { + function IdentityVersionConverter() { + } + IdentityVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + return { + verb: verb, + parameters: parameters + }; + }; + IdentityVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + return executeResponse; + }; + IdentityVersionConverter.prototype.downgradeNotification = function (notification) { + return notification; + }; + return IdentityVersionConverter; +}()); +exports.IdentityVersionConverter = IdentityVersionConverter; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": +/*!*******************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***! + \*******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. The only + * mode it supports is external's version <= platform's version. When executing + * commands, it is used to upgrade the external representation to what platform knows on the way in + * and downgrade the representations on the way out. Similarly for notifications, it can + * downgrade those on the way from platform to external. + */ +var StackingVersionConverter = /** @class */ (function () { + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalMajorVersion The major version of the internal contract api-external-js is using + * @param _platformMajorVersion The major version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + function StackingVersionConverter(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { + this._externalMajorVersion = _externalMajorVersion; + this._platformMajorVersion = _platformMajorVersion; + this._upgradeExecuteTranslations = _upgradeExecuteTranslations; + this._downgradeExecuteTranslations = _downgradeExecuteTranslations; + this._downgradeNotificationTranslations = _downgradeNotificationTranslations; + if (this._externalMajorVersion > this._platformMajorVersion) { + throw new Error("Cannot convert between external version " + this._externalMajorVersion + " and " + this._platformMajorVersion); + } + } + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + StackingVersionConverter.fromData = function (externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { + return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); + }; + StackingVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + // Perform the upgrade of the verb and parameters to the level that platform is using + var upgraded = { verb: verb, parameters: parameters }; + for (var _i = 0, _a = this._upgradeExecuteTranslations; _i < _a.length; _i++) { + var upgradeTranslation = _a[_i]; + upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); + } + return upgraded; + }; + StackingVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + // Downgrade the response to what the external module is expecting + var downgraded = executeResponse; + for (var _i = 0, _a = this._downgradeExecuteTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + }; + StackingVersionConverter.prototype.downgradeNotification = function (notification) { + // Downgrade the notification to what the external module is expecting + var downgraded = notification; + for (var _i = 0, _a = this._downgradeNotificationTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + }; + return StackingVersionConverter; +}()); +exports.StackingVersionConverter = StackingVersionConverter; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js": +/*!******************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js ***! + \******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); +var IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); +var VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); +/** + * @returns true if lhs < rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionLessThan(lhs, rhs) { + if (lhs.major > rhs.major) { + return false; + } + if (lhs.major < rhs.major) { + return true; + } + return (lhs.minor < rhs.minor); +} +exports.VersionLessThan = VersionLessThan; +/** + * @returns true if lhs == rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionEqualTo(lhs, rhs) { + return (lhs.major === rhs.major) && (lhs.minor === rhs.minor); +} +exports.VersionEqualTo = VersionEqualTo; +// A mapping from an older client version of internal-contract to the current platform version of this contract. +// Each version bump can have an array of translations to perform in order. Notice that this is +// different than the major upgrades/downgrades above because it handles both major and minor version changes. +// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". +exports.ExecuteMinorUpgrades = { + 1: { + 9: [], + } +}; +exports.ExecuteMinorDowngrades = { + 1: { + 5: [VersionTranslations_1.DowngradeWorksheetNames], + 9: [], + } +}; +exports.NotificationMinorDowngrades = { + 1: { + 9: [], + 10: [VersionTranslations_1.DowngradeFlipboardZoneID] + } +}; +/** + * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract + * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion, + * an error will be thrown because we won't know how to do those conversions. + * This converter can handle both major and minor updates when the platform version is greater than external version. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateVersionConverter(externalVersion, platformVersion) { + return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades); +} +exports.CreateVersionConverter = CreateVersionConverter; +/** + * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and + * notification arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + * @param upgrades MajorMinorTranslators for upgrades + * @param downgrades MajorMinorTranslators for downgrades + * @param notificationDowngrades MajorMinorTranslators for notification downgrades + */ +function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { + var externalMajorVersion = externalVersion.major; + var externalMinorVersion = externalVersion.minor; + var platformMajorVersion = platformVersion.major; + if (externalMajorVersion > platformMajorVersion) { + throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + } + // If we are using the exact same versions (major.minor), just use the identity converter + if (VersionEqualTo(externalVersion, platformVersion)) { + return new IdentityVersionConverter_1.IdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + var neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); + var neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); + var neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); + // We want to apply the downgrades in reverse order in case of dependencies between them + neededExecuteDowngrades.reverse(); + neededNotificationDowngrades.reverse(); + return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades); +} +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { + var neededTranslations = []; + for (var major = externalMajorVersion; major <= platformMajorVersion; major++) { + if (major in majorMinorTranslators) { + var start = (major === externalMajorVersion) ? externalMinorVersion : 0; + var maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); + for (var minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[major]) { + neededTranslations.push.apply(neededTranslations, majorMinorTranslators[major][minor]); + } + } + } + } + return neededTranslations; +} +function GetMaximumMinorIndex(minorVersions) { + return minorVersions.map(function (a) { return Number(a); }).reduce(function (a, b) { return a > b ? a : b; }); +} +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/VersionTranslations.js": +/*!**************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***! + \**************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../../api-internal-contract-js/lib/src/contract/Notifications.js"); +// This is where we will start to define some of these translations. +// When modifying existing models, add the requisite conversion functions here, then use them +// in the VersionConverterFactory implementation. Import old versions as you would any other module +// 0 <-> Translations +// Uncomment this line to import from the V0 definition of the API +// import * as V0 from '@tableau-api-internal-contract-js_v0'; +// 1 <-> 2 Translations +// Uncomment this line to import from the V1 definition of the API +// import * as V1 from '@tableau-api-internal-contract-js_v1'; +function DowngradeWorksheetNames(executeResponse) { + // Fix the dashboard friendly name issue. The structures are compatible, + // so we still return the original reply, but we copy the SheetInfo.name + // into the DashboardZone.name, where v1 wants to find it. + var bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionDashboardInfo !== undefined) { + bootstrapInfo.extensionDashboardInfo.zones.forEach(function (zone) { + if (zone.sheetInfo) { + zone.name = zone.sheetInfo.name; + } + }); + } + return executeResponse; +} +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +function DowngradeFlipboardZoneID(notification) { + // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. + // When running against a newer server, if flipboardZoneId is absent, set it to default(0). + if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { + var visualModel = notification.data; + if (visualModel.flipboardZoneID === undefined) { + visualModel.flipboardZoneID = 0; + } + } + return notification; +} +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js": +/*!************************************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***! + \************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and external version number +*/ +var ExternalIdentityVersionConverter = /** @class */ (function () { + function ExternalIdentityVersionConverter() { + } + ExternalIdentityVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + return { + verb: verb, + parameters: parameters + }; + }; + ExternalIdentityVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + return executeResponse; + }; + ExternalIdentityVersionConverter.prototype.upgradeNotification = function (notification) { + return notification; + }; + return ExternalIdentityVersionConverter; +}()); +exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js": +/*!************************************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***! + \************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. This converter + * supports external's version(minor) >= platform's version(minor). When executing + * commands, it is used to downgrade the external representation to what platform knows on the way in + * and upgrade the representations on the way out. + */ +var ExternalStackingVersionConverter = /** @class */ (function () { + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _downgradeExecuteCallTranslations Ordered list of the translations to perform when downgrading cmd parameters + * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed + * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events + */ + function ExternalStackingVersionConverter(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { + this._externalVersion = _externalVersion; + this._platformVersion = _platformVersion; + this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; + this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; + this._upgradeNotificationTranslations = _upgradeNotificationTranslations; + if (this._externalVersion.major > this._platformVersion.major) { + throw new Error("Cannot convert between external version " + this._externalVersion.major + "\n and " + this._platformVersion.major); + } + } + ExternalStackingVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + // Perform the downgrade of the verb and parameters to the level that platform is using + var downgraded = { verb: verb, parameters: parameters }; + for (var _i = 0, _a = this._downgradeExecuteCallTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); + } + return downgraded; + }; + ExternalStackingVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + // Perform the upgrade of the response to what the external module is expecting + var upgraded = executeResponse; + for (var _i = 0, _a = this._upgradeExecuteReturnTranslations; _i < _a.length; _i++) { + var upgradeTranslation = _a[_i]; + upgraded = upgradeTranslation(upgraded, verb, parameters); + } + return upgraded; + }; + ExternalStackingVersionConverter.prototype.upgradeNotification = function (notification) { + // Perform the upgrade of notification to what the external module is expecting + var upgraded = notification; + for (var _i = 0, _a = this._upgradeNotificationTranslations; _i < _a.length; _i++) { + var upgradeNotification = _a[_i]; + upgraded = upgradeNotification(upgraded); + } + return upgraded; + }; + return ExternalStackingVersionConverter; +}()); +exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js": +/*!***********************************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js ***! + \***********************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); +var ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); +var ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); +var ExternalVersionTranslations_1 = __webpack_require__(/*! ./ExternalVersionTranslations */ "../../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js"); +// A mapping from the current client version of internal-contract to an older platform version of the contract. +// Each version bump can have an array of translations to perform in order. +// These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the +// client/external side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'. +exports.ExecuteMinorDowngradeCallExternal = { + 1: { + 9: [], + 13: [ExternalVersionTranslations_1.DowngradeUnderlyingTableDataAsync, ExternalVersionTranslations_1.DowngradeLogicalTableDataAsync], + } +}; +exports.ExecuteMinorUpgradeReturnExternal = { + 1: { + 9: [ExternalVersionTranslations_1.UpgradeDataTableTypes], + 29: [ExternalVersionTranslations_1.UpgradeDataTableRowsAndColumns], + } +}; +exports.ExecuteMinorUpgradeNotification = { + 1: { + 9: [] // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket + } +}; +/** + * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade + * the contract between the two versions which are specified. If externalMajorVersion is less than + * platformMajorVersion, an ExternalIdentityVersionConverter will be returned. + * Handles upgrade/downgrade for both major and minor updates. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) { + return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification); +} +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +/** + * Implementation of CreateExternalCompatibleVersionConverterWithTranslators. + * This function takes the upgrade, downgrade arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal contract which the external module is using + * @param platformVersion VersionNumber of the internal contract which the platform is using + * @param upgrades MajorMinorTranslators for response upgrades + * @param downgrades MajorMinorTranslators for execute call downgrades + */ +function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { + var externalMajorVersion = externalVersion.major; + var platformMajorVersion = platformVersion.major; + var platformMinorVersion = platformVersion.minor; + // This check is present in VersionConverterFactory. We throw the same error here as well. + // Hence we only need to check the minor versions for translations. + if (externalMajorVersion > platformMajorVersion) { + throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + } + if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { + return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + var neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); + var neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); + var neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); + // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version + neededExecuteCallDowngrade.reverse(); + return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); +} +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; +function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { + var neededTranslations = []; + if (platformMajorVersion in majorMinorTranslators) { + var start = platformMinorVersion; + var maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); + for (var minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[platformMajorVersion]) { + neededTranslations.push.apply(neededTranslations, majorMinorTranslators[platformMajorVersion][minor]); + } + } + } + return neededTranslations; +} + + +/***/ }), + +/***/ "../../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js": +/*!*******************************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js ***! + \*******************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var JsApiInternalContract_1 = __webpack_require__(/*! ../../JsApiInternalContract */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +// 1.2 -> 1.0 Translations +// Uncomment this line to import from the V1 definition of the API +// import * as V1 from '@tableau-api-internal-contract-js_v1'; +/** + * Prior to 2019.2 (internal-contract v1.9), DataValue.value were all strings. + * Go through all DataValue objects. If we have a string, but the type should not be a string, + * convert it to the correct type. The type of DataValue.value is 'any' in the contract, so + * this change doesn't need any updates to classes or types. +*/ +function UpgradeDataTableTypes(executeResponse, verb, parameters) { + if (!executeResponse) { + return executeResponse; + } + var oldUnderlyingDataTable = executeResponse.result; + if (oldUnderlyingDataTable.data !== undefined && oldUnderlyingDataTable.isSummary !== undefined) { + convertDataValues(oldUnderlyingDataTable.data); + return executeResponse; + } + var oldSelectedMarksTable = executeResponse.result; + if (oldSelectedMarksTable.data !== undefined && Array.isArray(oldSelectedMarksTable.data)) { + oldSelectedMarksTable.data.forEach(function (marksTable) { + convertDataValues(marksTable); + }); + return executeResponse; + } + return executeResponse; +} +exports.UpgradeDataTableTypes = UpgradeDataTableTypes; +/** + * Prior to 2020.2 (internal-contract v1.13 and older), worksheet.getUnderlyingTableDataAsync doesn't exist. + * Map it to the older GetUnderlyingData verb and validate the the logical table Id. + **/ +function DowngradeUnderlyingTableDataAsync(verb, parameters) { + if (verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData) { + validateParametersForObjectModel(verb, parameters); + verb = JsApiInternalContract_1.VerbId.GetUnderlyingData; + } + return { + verb: verb, + parameters: parameters + }; +} +exports.DowngradeUnderlyingTableDataAsync = DowngradeUnderlyingTableDataAsync; +/** + * Prior to 2020.2 (internal-contract v1.13 and older), datasource.getLogicalTableDataAsync doesn't exist. + * Map it to the older GetDataSourceData verb and validate the the logical table Id. + **/ +function DowngradeLogicalTableDataAsync(verb, parameters) { + if (verb === JsApiInternalContract_1.VerbId.GetLogicalTableData) { + validateParametersForObjectModel(verb, parameters); + verb = JsApiInternalContract_1.VerbId.GetDataSourceData; + } + return { + verb: verb, + parameters: parameters + }; +} +exports.DowngradeLogicalTableDataAsync = DowngradeLogicalTableDataAsync; +function convertDataValues(table) { + // dataTable is a two-dimensional array of data. First index is the row, second is the column. + if (table === undefined || table.dataTable === undefined || !Array.isArray(table.dataTable)) { + return; + } + table.dataTable.forEach(function (row) { + row.forEach(function (dataValue, columnIndex) { + var value = dataValue.value; + if (value !== null) { + dataValue.value = JsApiInternalContract_1.DataTypeConverter.convertValueAsStringToValue(value, table.headers[columnIndex].dataType); + } + }); + }); +} +// ToDo: TFS1069027 Refactor input verbs & parameters in api-internal-contract Upgrade/Downgrade framework +function validateParametersForObjectModel(verb, parameters) { + if (parameters[JsApiInternalContract_1.ParameterId.LogicalTableId] !== JsApiInternalContract_1.ApiShowDataTableSentinel.SingleTableId) { + throw new Error("Invalid logical table id passed to " + verb + "."); + } +} +/** + * Prior to 2021.2 (internal-contract v1.29 and below), getSummaryDataAsync did not support maxRows, + * and any get...DataAsync did not support columnsToIncludeById. + * Trim result to maxRows if it is included in the parameters for getSummaryDataAsync + * Trim columns to columnsToInclude if included in the parameters for any get...DataAsync +*/ +function UpgradeDataTableRowsAndColumns(executeResponse, verb, parameters) { + if (isGetSummaryDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.MaxRows]) { + executeResponse = adjustDataRowLength(executeResponse, parameters[JsApiInternalContract_1.ParameterId.MaxRows]); + } + if (isGetTableDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]) { + executeResponse = adjustDataColumns(executeResponse, parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]); + } + return executeResponse; +} +exports.UpgradeDataTableRowsAndColumns = UpgradeDataTableRowsAndColumns; +function isGetSummaryDataVerb(verb) { + return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData; +} +function isGetTableDataVerb(verb) { + return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData + || verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData + || verb === JsApiInternalContract_1.VerbId.GetLogicalTableData + || verb === JsApiInternalContract_1.VerbId.GetDataSourceData + || verb === JsApiInternalContract_1.VerbId.GetUnderlyingData; +} +function adjustDataRowLength(executeResponse, maxRows) { + var underlyingDataTable = executeResponse.result; + if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable)) { + return executeResponse; + } + if (maxRows > 0 && maxRows < underlyingDataTable.data.dataTable.length) { + underlyingDataTable.data.dataTable.length = maxRows; + } + return executeResponse; +} +function adjustDataColumns(executeResponse, columnsToInclude) { + if (columnsToInclude.length === 0) { + return executeResponse; + } + // verify that we have a valid UnderlyingDataTable + var underlyingDataTable = executeResponse.result; + if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable) || !Array.isArray(underlyingDataTable.data.headers)) { + return executeResponse; + } + // 1. filter the headers to only columnsToInclude + // 2. use the new headers to filter all rows + // 3. update the indices in our new headers + var newHeaders = underlyingDataTable.data.headers.filter(function (header, index) { return columnsToInclude.find(function (name) { return name === header.fieldName; }); }); + underlyingDataTable.data.dataTable.forEach(function (row, index) { + underlyingDataTable.data.dataTable[index] + = row.filter(function (value, valueIndex) { return newHeaders.findIndex(function (header) { return header.index === valueIndex; }) !== -1; }); + }); + var newIndex = 0; + underlyingDataTable.data.headers = newHeaders.map(function (header) { header.index = newIndex++; return header; }); + return executeResponse; +} + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared.js": +/*!******************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// Export everything which had been previously in the api-shared module +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +var Dashboard_1 = __webpack_require__(/*! ./ApiShared/Dashboard */ "../../api-shared-js/lib/src/ApiShared/Dashboard.js"); +exports.Dashboard = Dashboard_1.Dashboard; +var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +exports.EventListenerManager = EventListenerManager_1.EventListenerManager; +var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +exports.TableauError = TableauError_1.TableauError; +var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../../api-shared-js/lib/src/ApiShared/ApiVersion.js"); +exports.ApiVersion = ApiVersion_1.ApiVersion; +var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +exports.VersionNumber = VersionNumber_1.VersionNumber; +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; +var TableauEvent_1 = __webpack_require__(/*! ./ApiShared/Events/TableauEvent */ "../../api-shared-js/lib/src/ApiShared/Events/TableauEvent.js"); +exports.TableauEvent = TableauEvent_1.TableauEvent; +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +exports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl; +var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +exports.DashboardImpl = DashboardImpl_1.DashboardImpl; +var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase; +var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +exports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers; +__export(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js")); +__export(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js")); +__export(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js")); +var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/ApiVersion.js": +/*!*****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/ApiVersion.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +/** + * This is the singleton wrapper of VersionNumber + */ +var ApiVersion = /** @class */ (function () { + function ApiVersion() { + } + Object.defineProperty(ApiVersion, "Instance", { + /** + * Gets the singleton instance of the version number. + */ + get: function () { + return ApiVersion._instance; + }, + enumerable: true, + configurable: true + }); + ApiVersion.SetVersionNumber = function (numString, isAlpha) { + ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); + }; + return ApiVersion; +}()); +exports.ApiVersion = ApiVersion; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/ConnectionSummary.js": +/*!************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***! + \************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of a connection summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +var ConnectionSummary = /** @class */ (function () { + function ConnectionSummary(_connectionInfo) { + this._connectionInfo = _connectionInfo; + } + Object.defineProperty(ConnectionSummary.prototype, "name", { + get: function () { + return this._connectionInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "id", { + get: function () { + return this._connectionInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "serverURI", { + get: function () { + return this._connectionInfo.serverURI; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "type", { + get: function () { + return this._connectionInfo.type; + }, + enumerable: true, + configurable: true + }); + return ConnectionSummary; +}()); +exports.ConnectionSummary = ConnectionSummary; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js": +/*!*************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js ***! + \*************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +// Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153 +function inIframe(thisWindow) { + try { + return thisWindow.self !== thisWindow.parent; + } + catch (e) { + return true; + } +} +/** + * Attempts to bootstrap the extension with a cross-frame parent where Tableau is running + * + * @param thisWindow The window which we are running in (injected for unit testing purposes) + * @param internalContractVersion The version number of the internal contract we are using + * @returns A promise which is doing the actual bootstrapping + */ +function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { + return new Promise(function (resolve, reject) { + var parent; + // Normally, we are running inside an iframe. The exception to this is + // when we are running as an extension inside a dialog as part of the UINamespace + // functionality. In that case, we want the opener of this window rather than the parent. + if (!inIframe(thisWindow)) { + parent = thisWindow.opener; + } + else { + parent = thisWindow.parent; + } + if (!parent) { + reject('This extension is not running inside an iframe, desktop, or popup window. Initialization failed.'); + } + // Create the messenger which will do he communication between this window and our parent + // Since we don't know where we are running yet, we have to make this initial origin '*'. Once + // we have successfully initialized our extension, we will limit where we send messages + var messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); + // Prepare to send an initialization message to the parent frame + var initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); + // When we receive a response back from the parent, we check to make sure the guids match and then we know + // that the parent is aware of us and we can start communicating + messenger.setCommandResponseMessageHandler(function (msg) { + // Verify we are getting a response from our initialize message + if (msg.commandGuid === initializationMessage.messageGuid) { + // The versioning of the dispatcher happens on the other side of our frame, and + // in a wrapper on this side. This one doesn't have any version knowledge. + var dispatcherFactory = function () { return new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); }; + resolve(dispatcherFactory); + } + }); + // Now that our handlers are ready, start listening and send our initialization message + messenger.startListening(); + initializationMessage.send(); + }); +} +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js": +/*!**************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***! + \**************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * This is an implementation of the InternalApiDispatcher interface which functions by passing messages + * across a frame boundary. This is usually between the code where our javscript library has been included + * by a 3rd party dev and another frame where Tableau server has content. + */ +var CrossFrameDispatcher = /** @class */ (function () { + /** + * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate + * @param _messenger an instantiated and listening messenger object + */ + function CrossFrameDispatcher(_messenger) { + this._messenger = _messenger; + // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame, + // these promises can be either resolved or rejected + this._pendingPromises = {}; + // The collection of notification handlers which have been registered with this dispatcher + this._notificationHandlers = []; + if (!this._messenger) { + throw 'Missing messenger object'; + } + // Set up our message handlers. We only care about incoming notifications and command responses + this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)); + this._messenger.setNotificationMessageHandler(this.onNotification.bind(this)); + } + ////// Start InternalApiDispatcher implementation + CrossFrameDispatcher.prototype.execute = function (verb, parameters) { + var _this = this; + // To execute a verb, we first prepare a command message and then define a promise. + var preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); + var promise = new Promise(function (resolve, reject) { + // Save off the pending promise by the messageGuid we are about to send. When a response is + // received, we'll be able to resolve this promise with the result + _this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject }; + }); + // Actually send the message and return the promise + preparedMessage.send(); + return promise; + }; + CrossFrameDispatcher.prototype.registerNotificationHandler = function (handler) { + this._notificationHandlers.push(handler); + }; + CrossFrameDispatcher.prototype.unregisterNotificationHandler = function (handler) { + this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); + }; + ////// End InternalApiDispatcher implementation + CrossFrameDispatcher.prototype.onCommandResponse = function (response) { + // We got a command response, look through the pending promises and resolve + if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { + return; // We don't have any reference to this command, just return + } + var pendingPromise = this._pendingPromises[response.commandGuid]; + // If we have an error defined, reject the promise + if (response.error) { + pendingPromise.reject(response.error); + } + // If we have data defined, resolve the promise + if (response.data) { + pendingPromise.resolve({ result: response.data }); + } + // Clean up our pending promises object + delete this._pendingPromises[response.commandGuid]; + }; + CrossFrameDispatcher.prototype.onNotification = function (notificationMessage) { + // Go through each notification handler we have registered and let them know a notification came in + for (var _i = 0, _a = this._notificationHandlers; _i < _a.length; _i++) { + var handler = _a[_i]; + try { + handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data }); + } + catch (e) { + // Ignore this. Wrap in try/catch so if one handler errors, the other still get the message + } + } + }; + return CrossFrameDispatcher; +}()); +exports.CrossFrameDispatcher = CrossFrameDispatcher; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Dashboard.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Dashboard.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Sheet_1 = __webpack_require__(/*! ./Sheet */ "../../api-shared-js/lib/src/ApiShared/Sheet.js"); +var Dashboard = /** @class */ (function (_super) { + __extends(Dashboard, _super); + function Dashboard(_dashboardImpl) { + var _this = _super.call(this, _dashboardImpl) || this; + _this._dashboardImpl = _dashboardImpl; + _dashboardImpl.initializeWithPublicInterfaces(_this); + return _this; + } + Object.defineProperty(Dashboard.prototype, "worksheets", { + get: function () { + return this._dashboardImpl.worksheets; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "objects", { + get: function () { + return this._dashboardImpl.objects; + }, + enumerable: true, + configurable: true + }); + Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) { + return this._dashboardImpl.setZoneVisibilityAsync(zoneVisibilityMap); + }; + return Dashboard; +}(Sheet_1.Sheet)); +exports.Dashboard = Dashboard; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/DashboardObject.js": +/*!**********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/DashboardObject.js ***! + \**********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + * This does not follow the Impl pattern as it is just a property bag. + */ +var DashboardObject = /** @class */ (function () { + function DashboardObject(_dashboard, _type, _position, _size, _worksheet, _name, _isFloating, _isVisible, _id) { + this._dashboard = _dashboard; + this._type = _type; + this._position = _position; + this._size = _size; + this._worksheet = _worksheet; + this._name = _name; + this._isFloating = _isFloating; + this._isVisible = _isVisible; + this._id = _id; + } + Object.defineProperty(DashboardObject.prototype, "dashboard", { + get: function () { + return this._dashboard; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "position", { + get: function () { + return this._position; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "size", { + get: function () { + return this._size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "worksheet", { + get: function () { + return this._worksheet; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "isFloating", { + get: function () { + return this._isFloating; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "isVisible", { + get: function () { + return this._isVisible; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "id", { + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + return DashboardObject; +}()); +exports.DashboardObject = DashboardObject; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/DataSource.js": +/*!*****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/DataSource.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var DataSource = /** @class */ (function () { + function DataSource(_dataSourceImpl) { + this._dataSourceImpl = _dataSourceImpl; + } + Object.defineProperty(DataSource.prototype, "name", { + get: function () { + return this._dataSourceImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "id", { + get: function () { + return this._dataSourceImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "fields", { + get: function () { + return this._dataSourceImpl.fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "extractUpdateTime", { + get: function () { + return this._dataSourceImpl.extractUpdateTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "isExtract", { + get: function () { + return this._dataSourceImpl.isExtract; + }, + enumerable: true, + configurable: true + }); + DataSource.prototype.refreshAsync = function () { + return this._dataSourceImpl.refreshAsync(); + }; + DataSource.prototype.getActiveTablesAsync = function () { + console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); + return this._dataSourceImpl.getActiveTablesAsync(); + }; + DataSource.prototype.getConnectionSummariesAsync = function () { + return this._dataSourceImpl.getConnectionSummariesAsync(); + }; + DataSource.prototype.getUnderlyingDataAsync = function (options) { + console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + + 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); + return this._dataSourceImpl.getUnderlyingDataAsync(options); + }; + DataSource.prototype.getLogicalTablesAsync = function () { + return this._dataSourceImpl.getLogicalTablesAsync(); + }; + DataSource.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); + }; + return DataSource; +}()); +exports.DataSource = DataSource; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js": +/*!**************************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js ***! + \**************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the external-api-contract to the enums used + * in the internal-api-contract, which developers code against. + */ +var ExternalToInternalEnumMappings = /** @class */ (function () { + function ExternalToInternalEnumMappings() { + } + ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter((_a = {}, + _a[api_external_contract_js_1.FilterDomainType.Relevant] = api_internal_contract_js_1.FilterDomainType.Relevant, + _a[api_external_contract_js_1.FilterDomainType.Database] = api_internal_contract_js_1.FilterDomainType.Database, + _a)); + ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter((_b = {}, + _b[api_external_contract_js_1.FilterNullOption.AllValues] = api_internal_contract_js_1.FilterNullOption.AllValues, + _b[api_external_contract_js_1.FilterNullOption.NonNullValues] = api_internal_contract_js_1.FilterNullOption.NonNullValues, + _b[api_external_contract_js_1.FilterNullOption.NullValues] = api_internal_contract_js_1.FilterNullOption.NullValues, + _b)); + ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_c = {}, + _c[api_external_contract_js_1.FilterUpdateType.Add] = api_internal_contract_js_1.FilterUpdateType.Add, + _c[api_external_contract_js_1.FilterUpdateType.All] = api_internal_contract_js_1.FilterUpdateType.All, + _c[api_external_contract_js_1.FilterUpdateType.Remove] = api_internal_contract_js_1.FilterUpdateType.Remove, + _c[api_external_contract_js_1.FilterUpdateType.Replace] = api_internal_contract_js_1.FilterUpdateType.Replace, + _c)); + ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter((_d = {}, + _d[api_external_contract_js_1.ZoneVisibilityType.Show] = true, + _d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false, + _d)); + ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_e = {}, + _e[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, + _e[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + _e[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, + _e)); + return ExternalToInternalEnumMappings; +}()); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; +/* tslint:enable:typedef */ + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js": +/*!**************************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js ***! + \**************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the internal-api-contract to the enums used + * in the external-api-contract, which developers code against. + */ +var InternalToExternalEnumMappings = /** @class */ (function () { + function InternalToExternalEnumMappings() { + } + InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter((_a = {}, + _a[api_internal_contract_js_1.ExtensionContext.Desktop] = api_external_contract_js_1.ExtensionContext.Desktop, + _a[api_internal_contract_js_1.ExtensionContext.Server] = api_external_contract_js_1.ExtensionContext.Server, + _a)); + InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter((_b = {}, + _b[api_internal_contract_js_1.ExtensionMode.Authoring] = api_external_contract_js_1.ExtensionMode.Authoring, + _b[api_internal_contract_js_1.ExtensionMode.Viewing] = api_external_contract_js_1.ExtensionMode.Viewing, + _b)); + InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter((_c = {}, + _c[api_internal_contract_js_1.ColumnType.Continuous] = api_external_contract_js_1.ColumnType.Continuous, + _c[api_internal_contract_js_1.ColumnType.Discrete] = api_external_contract_js_1.ColumnType.Discrete, + _c)); + InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter((_d = {}, + _d[api_internal_contract_js_1.FieldAggregationType.Attr] = api_external_contract_js_1.FieldAggregationType.Attr, + _d[api_internal_contract_js_1.FieldAggregationType.Avg] = api_external_contract_js_1.FieldAggregationType.Avg, + _d[api_internal_contract_js_1.FieldAggregationType.Count] = api_external_contract_js_1.FieldAggregationType.Count, + _d[api_internal_contract_js_1.FieldAggregationType.Countd] = api_external_contract_js_1.FieldAggregationType.Countd, + _d[api_internal_contract_js_1.FieldAggregationType.Day] = api_external_contract_js_1.FieldAggregationType.Day, + _d[api_internal_contract_js_1.FieldAggregationType.End] = api_external_contract_js_1.FieldAggregationType.End, + _d[api_internal_contract_js_1.FieldAggregationType.Hour] = api_external_contract_js_1.FieldAggregationType.Hour, + _d[api_internal_contract_js_1.FieldAggregationType.InOut] = api_external_contract_js_1.FieldAggregationType.InOut, + _d[api_internal_contract_js_1.FieldAggregationType.Kurtosis] = api_external_contract_js_1.FieldAggregationType.Kurtosis, + _d[api_internal_contract_js_1.FieldAggregationType.Max] = api_external_contract_js_1.FieldAggregationType.Max, + _d[api_internal_contract_js_1.FieldAggregationType.Mdy] = api_external_contract_js_1.FieldAggregationType.Mdy, + _d[api_internal_contract_js_1.FieldAggregationType.Median] = api_external_contract_js_1.FieldAggregationType.Median, + _d[api_internal_contract_js_1.FieldAggregationType.Min] = api_external_contract_js_1.FieldAggregationType.Min, + _d[api_internal_contract_js_1.FieldAggregationType.Minute] = api_external_contract_js_1.FieldAggregationType.Minute, + _d[api_internal_contract_js_1.FieldAggregationType.MonthYear] = api_external_contract_js_1.FieldAggregationType.MonthYear, + _d[api_internal_contract_js_1.FieldAggregationType.None] = api_external_contract_js_1.FieldAggregationType.None, + _d[api_internal_contract_js_1.FieldAggregationType.Qtr] = api_external_contract_js_1.FieldAggregationType.Qtr, + _d[api_internal_contract_js_1.FieldAggregationType.Quart1] = api_external_contract_js_1.FieldAggregationType.Quart1, + _d[api_internal_contract_js_1.FieldAggregationType.Quart3] = api_external_contract_js_1.FieldAggregationType.Quart3, + _d[api_internal_contract_js_1.FieldAggregationType.Second] = api_external_contract_js_1.FieldAggregationType.Second, + _d[api_internal_contract_js_1.FieldAggregationType.Skewness] = api_external_contract_js_1.FieldAggregationType.Skewness, + _d[api_internal_contract_js_1.FieldAggregationType.Stdev] = api_external_contract_js_1.FieldAggregationType.Stdev, + _d[api_internal_contract_js_1.FieldAggregationType.Stdevp] = api_external_contract_js_1.FieldAggregationType.Stdevp, + _d[api_internal_contract_js_1.FieldAggregationType.Sum] = api_external_contract_js_1.FieldAggregationType.Sum, + _d[api_internal_contract_js_1.FieldAggregationType.TruncDay] = api_external_contract_js_1.FieldAggregationType.TruncDay, + _d[api_internal_contract_js_1.FieldAggregationType.TruncHour] = api_external_contract_js_1.FieldAggregationType.TruncHour, + _d[api_internal_contract_js_1.FieldAggregationType.TruncMinute] = api_external_contract_js_1.FieldAggregationType.TruncMinute, + _d[api_internal_contract_js_1.FieldAggregationType.TruncMonth] = api_external_contract_js_1.FieldAggregationType.TruncMonth, + _d[api_internal_contract_js_1.FieldAggregationType.TruncQtr] = api_external_contract_js_1.FieldAggregationType.TruncQtr, + _d[api_internal_contract_js_1.FieldAggregationType.TruncSecond] = api_external_contract_js_1.FieldAggregationType.TruncSecond, + _d[api_internal_contract_js_1.FieldAggregationType.TruncWeek] = api_external_contract_js_1.FieldAggregationType.TruncWeek, + _d[api_internal_contract_js_1.FieldAggregationType.TruncYear] = api_external_contract_js_1.FieldAggregationType.TruncYear, + _d[api_internal_contract_js_1.FieldAggregationType.User] = api_external_contract_js_1.FieldAggregationType.User, + _d[api_internal_contract_js_1.FieldAggregationType.Var] = api_external_contract_js_1.FieldAggregationType.Var, + _d[api_internal_contract_js_1.FieldAggregationType.Varp] = api_external_contract_js_1.FieldAggregationType.Varp, + _d[api_internal_contract_js_1.FieldAggregationType.Week] = api_external_contract_js_1.FieldAggregationType.Week, + _d[api_internal_contract_js_1.FieldAggregationType.Weekday] = api_external_contract_js_1.FieldAggregationType.Weekday, + _d[api_internal_contract_js_1.FieldAggregationType.Year] = api_external_contract_js_1.FieldAggregationType.Year, + _d)); + InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter((_e = {}, + _e[api_internal_contract_js_1.FieldRoleType.Dimension] = api_external_contract_js_1.FieldRoleType.Dimension, + _e[api_internal_contract_js_1.FieldRoleType.Measure] = api_external_contract_js_1.FieldRoleType.Measure, + _e[api_internal_contract_js_1.FieldRoleType.Unknown] = api_external_contract_js_1.FieldRoleType.Unknown, + _e)); + InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, + _f[api_internal_contract_js_1.SheetType.Dashboard] = api_external_contract_js_1.SheetType.Dashboard, + _f[api_internal_contract_js_1.SheetType.Story] = api_external_contract_js_1.SheetType.Story, + _f[api_internal_contract_js_1.SheetType.Worksheet] = api_external_contract_js_1.SheetType.Worksheet, + _f)); + InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter((_g = {}, + _g[api_internal_contract_js_1.DashboardObjectType.Extension] = api_external_contract_js_1.DashboardObjectType.Extension, + _g[api_internal_contract_js_1.DashboardObjectType.Blank] = api_external_contract_js_1.DashboardObjectType.Blank, + _g[api_internal_contract_js_1.DashboardObjectType.Image] = api_external_contract_js_1.DashboardObjectType.Image, + _g[api_internal_contract_js_1.DashboardObjectType.Legend] = api_external_contract_js_1.DashboardObjectType.Legend, + _g[api_internal_contract_js_1.DashboardObjectType.PageFilter] = api_external_contract_js_1.DashboardObjectType.PageFilter, + _g[api_internal_contract_js_1.DashboardObjectType.ParameterControl] = api_external_contract_js_1.DashboardObjectType.ParameterControl, + _g[api_internal_contract_js_1.DashboardObjectType.QuickFilter] = api_external_contract_js_1.DashboardObjectType.QuickFilter, + _g[api_internal_contract_js_1.DashboardObjectType.Text] = api_external_contract_js_1.DashboardObjectType.Text, + _g[api_internal_contract_js_1.DashboardObjectType.Title] = api_external_contract_js_1.DashboardObjectType.Title, + _g[api_internal_contract_js_1.DashboardObjectType.WebPage] = api_external_contract_js_1.DashboardObjectType.WebPage, + _g[api_internal_contract_js_1.DashboardObjectType.Worksheet] = api_external_contract_js_1.DashboardObjectType.Worksheet, + _g)); + InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter((_h = {}, + _h[api_internal_contract_js_1.DataType.Bool] = api_external_contract_js_1.DataType.Bool, + _h[api_internal_contract_js_1.DataType.Date] = api_external_contract_js_1.DataType.Date, + _h[api_internal_contract_js_1.DataType.DateTime] = api_external_contract_js_1.DataType.DateTime, + _h[api_internal_contract_js_1.DataType.Float] = api_external_contract_js_1.DataType.Float, + _h[api_internal_contract_js_1.DataType.Int] = api_external_contract_js_1.DataType.Int, + _h[api_internal_contract_js_1.DataType.String] = api_external_contract_js_1.DataType.String, + _h)); + InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_j = {}, + _j[api_internal_contract_js_1.FilterUpdateType.Add] = api_external_contract_js_1.FilterUpdateType.Add, + _j[api_internal_contract_js_1.FilterUpdateType.All] = api_external_contract_js_1.FilterUpdateType.All, + _j[api_internal_contract_js_1.FilterUpdateType.Remove] = api_external_contract_js_1.FilterUpdateType.Remove, + _j[api_internal_contract_js_1.FilterUpdateType.Replace] = api_external_contract_js_1.FilterUpdateType.Replace, + _j)); + InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter((_k = {}, + _k[api_internal_contract_js_1.DomainRestrictionType.All] = api_external_contract_js_1.ParameterValueType.All, + _k[api_internal_contract_js_1.DomainRestrictionType.List] = api_external_contract_js_1.ParameterValueType.List, + _k[api_internal_contract_js_1.DomainRestrictionType.Range] = api_external_contract_js_1.ParameterValueType.Range, + _k)); + InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter((_l = {}, + _l[api_internal_contract_js_1.DateStepPeriod.Years] = api_external_contract_js_1.PeriodType.Years, + _l[api_internal_contract_js_1.DateStepPeriod.Quarters] = api_external_contract_js_1.PeriodType.Quarters, + _l[api_internal_contract_js_1.DateStepPeriod.Months] = api_external_contract_js_1.PeriodType.Months, + _l[api_internal_contract_js_1.DateStepPeriod.Weeks] = api_external_contract_js_1.PeriodType.Weeks, + _l[api_internal_contract_js_1.DateStepPeriod.Days] = api_external_contract_js_1.PeriodType.Days, + _l[api_internal_contract_js_1.DateStepPeriod.Hours] = api_external_contract_js_1.PeriodType.Hours, + _l[api_internal_contract_js_1.DateStepPeriod.Minutes] = api_external_contract_js_1.PeriodType.Minutes, + _l[api_internal_contract_js_1.DateStepPeriod.Seconds] = api_external_contract_js_1.PeriodType.Seconds, + _l)); + InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_m = {}, + _m[api_internal_contract_js_1.DateRangeType.Current] = api_external_contract_js_1.DateRangeType.Current, + _m[api_internal_contract_js_1.DateRangeType.Last] = api_external_contract_js_1.DateRangeType.Last, + _m[api_internal_contract_js_1.DateRangeType.LastN] = api_external_contract_js_1.DateRangeType.LastN, + _m[api_internal_contract_js_1.DateRangeType.Next] = api_external_contract_js_1.DateRangeType.Next, + _m[api_internal_contract_js_1.DateRangeType.NextN] = api_external_contract_js_1.DateRangeType.NextN, + _m[api_internal_contract_js_1.DateRangeType.ToDate] = api_external_contract_js_1.DateRangeType.ToDate, + _m)); + InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter((_o = {}, + _o[api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED] = api_external_contract_js_1.ErrorCodes.APINotInitialized, + _o[api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR] = api_external_contract_js_1.ErrorCodes.VisibilityError, + _o), api_external_contract_js_1.ErrorCodes.InternalError); + InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter((_p = {}, + _p[api_internal_contract_js_1.FilterType.Categorical] = api_external_contract_js_1.FilterType.Categorical, + _p[api_internal_contract_js_1.FilterType.Range] = api_external_contract_js_1.FilterType.Range, + _p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate, + _p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical, + _p)); + return InternalToExternalEnumMappings; +}()); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; +/* tslint:enable:typedef */ + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/EventListenerManager.js": +/*!***************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/EventListenerManager.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Class designed to register and unregister handlers from a user. Only those events + * which are added via AddNewEventType will be supported by this instance + */ +var EventListenerManager = /** @class */ (function () { + function EventListenerManager() { + this._eventListenerManagers = {}; + } + EventListenerManager.prototype.addEventListener = function (eventType, handler) { + if (!this._eventListenerManagers.hasOwnProperty(eventType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, "Cannot add event, unsupported event type: " + eventType); + } + return this._eventListenerManagers[eventType].addEventListener(handler); + }; + EventListenerManager.prototype.removeEventListener = function (eventType, handler) { + if (!this._eventListenerManagers.hasOwnProperty(eventType)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, "Cannot remove event, unsupported event type: " + eventType); + } + return this._eventListenerManagers[eventType].removeEventListener(handler); + }; + EventListenerManager.prototype.addNewEventType = function (eventManager) { + this._eventListenerManagers[eventManager.eventType] = eventManager; + }; + return EventListenerManager; +}()); +exports.EventListenerManager = EventListenerManager; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Events/FilterChangedEvent.js": +/*!********************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Events/FilterChangedEvent.js ***! + \********************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "../../api-shared-js/lib/src/ApiShared/Events/TableauWorksheetEvent.js"); +var FilterChangedEvent = /** @class */ (function (_super) { + __extends(FilterChangedEvent, _super); + function FilterChangedEvent(worksheet, _fieldName) { + var _this = _super.call(this, api_external_contract_js_1.TableauEventType.FilterChanged, worksheet) || this; + _this._fieldName = _fieldName; + return _this; + } + Object.defineProperty(FilterChangedEvent.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + FilterChangedEvent.prototype.getFilterAsync = function () { + var _this = this; + return this._worksheet.getFiltersAsync().then(function (filters) { + // TODO: Filtering of the filters should eventually be done platform side. + var eventedFilter = filters.find(function (filter) { return (filter.fieldName === _this._fieldName); }); + if (!eventedFilter) { + // We shouldn't hit this unless the filter was removed from the worksheet + // after the event was raised. + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, "cannot find filter: " + _this._fieldName); + } + return eventedFilter; + }); + }; + return FilterChangedEvent; +}(TableauWorksheetEvent_1.TableauWorksheetEvent)); +exports.FilterChangedEvent = FilterChangedEvent; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Events/MarksSelectedEvent.js": +/*!********************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Events/MarksSelectedEvent.js ***! + \********************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "../../api-shared-js/lib/src/ApiShared/Events/TableauWorksheetEvent.js"); +var MarksSelectedEvent = /** @class */ (function (_super) { + __extends(MarksSelectedEvent, _super); + function MarksSelectedEvent(worksheet) { + return _super.call(this, api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet) || this; + } + MarksSelectedEvent.prototype.getMarksAsync = function () { + return this.worksheet.getSelectedMarksAsync(); + }; + return MarksSelectedEvent; +}(TableauWorksheetEvent_1.TableauWorksheetEvent)); +exports.MarksSelectedEvent = MarksSelectedEvent; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Events/ParameterChangedEvent.js": +/*!***********************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Events/ParameterChangedEvent.js ***! + \***********************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "../../api-shared-js/lib/src/ApiShared/Events/TableauSheetEvent.js"); +var ParameterChangedEvent = /** @class */ (function (_super) { + __extends(ParameterChangedEvent, _super); + function ParameterChangedEvent(_globalFieldName, sheet) { + var _this = _super.call(this, api_external_contract_js_1.TableauEventType.ParameterChanged, sheet) || this; + _this._globalFieldName = _globalFieldName; + return _this; + } + ParameterChangedEvent.prototype.getParameterAsync = function () { + var _this = this; + // Call down to our service to get the parameter back via its field name + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */); + return service.findParameterByGlobalFieldNameAsync(this._globalFieldName, this.sheet).then(function (parameter) { + if (parameter === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, "Cannot find parameter: " + _this._globalFieldName); + } + return parameter; + }); + }; + return ParameterChangedEvent; +}(TableauSheetEvent_1.TableauSheetEvent)); +exports.ParameterChangedEvent = ParameterChangedEvent; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Events/TableauEvent.js": +/*!**************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Events/TableauEvent.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var TableauEvent = /** @class */ (function () { + function TableauEvent(type) { + this._type = type; + } + Object.defineProperty(TableauEvent.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + return TableauEvent; +}()); +exports.TableauEvent = TableauEvent; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Events/TableauSheetEvent.js": +/*!*******************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Events/TableauSheetEvent.js ***! + \*******************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "../../api-shared-js/lib/src/ApiShared/Events/TableauEvent.js"); +var TableauSheetEvent = /** @class */ (function (_super) { + __extends(TableauSheetEvent, _super); + function TableauSheetEvent(type, sheet) { + var _this = _super.call(this, type) || this; + _this._sheet = sheet; + return _this; + } + Object.defineProperty(TableauSheetEvent.prototype, "sheet", { + get: function () { + return this._sheet; + }, + enumerable: true, + configurable: true + }); + return TableauSheetEvent; +}(TableauEvent_1.TableauEvent)); +exports.TableauSheetEvent = TableauSheetEvent; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Events/TableauWorksheetEvent.js": +/*!***********************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Events/TableauWorksheetEvent.js ***! + \***********************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "../../api-shared-js/lib/src/ApiShared/Events/TableauSheetEvent.js"); +var TableauWorksheetEvent = /** @class */ (function (_super) { + __extends(TableauWorksheetEvent, _super); + function TableauWorksheetEvent(type, _worksheet) { + var _this = _super.call(this, type, _worksheet) || this; + _this._worksheet = _worksheet; + return _this; + } + Object.defineProperty(TableauWorksheetEvent.prototype, "worksheet", { + get: function () { + return this._worksheet; + }, + enumerable: true, + configurable: true + }); + return TableauWorksheetEvent; +}(TableauSheetEvent_1.TableauSheetEvent)); +exports.TableauWorksheetEvent = TableauWorksheetEvent; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Field.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Field.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var ErrorHelpers_1 = __webpack_require__(/*! ./Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Field = /** @class */ (function () { + function Field(_fieldImpl) { + this._fieldImpl = _fieldImpl; + } + Object.defineProperty(Field.prototype, "name", { + get: function () { + return this._fieldImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "id", { + get: function () { + return this._fieldImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "description", { + get: function () { + return this._fieldImpl.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "aggregation", { + get: function () { + return this._fieldImpl.aggregation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "dataSource", { + get: function () { + return this._fieldImpl.dataSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "role", { + get: function () { + return this._fieldImpl.role; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isHidden", { + get: function () { + return this._fieldImpl.isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isGenerated", { + get: function () { + return this._fieldImpl.isGenerated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isCalculatedField", { + get: function () { + return this._fieldImpl.isCalculatedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "columnType", { + get: function () { + throw ErrorHelpers_1.ErrorHelpers.apiNotImplemented('Field.columnType'); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isCombinedField", { + get: function () { + return this._fieldImpl.isCombinedField; + }, + enumerable: true, + configurable: true + }); + return Field; +}()); +exports.Field = Field; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js": +/*!*************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var DashboardObject_1 = __webpack_require__(/*! ../DashboardObject */ "../../api-shared-js/lib/src/ApiShared/DashboardObject.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var Point_1 = __webpack_require__(/*! ../Point */ "../../api-shared-js/lib/src/ApiShared/Point.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +var Size_1 = __webpack_require__(/*! ../Size */ "../../api-shared-js/lib/src/ApiShared/Size.js"); +var Worksheet_1 = __webpack_require__(/*! ../Worksheet */ "../../api-shared-js/lib/src/ApiShared/Worksheet.js"); +var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +var DashboardImpl = /** @class */ (function (_super) { + __extends(DashboardImpl, _super); + function DashboardImpl(_info, _sheetPath) { + var _this = _super.call(this, new SheetInfoImpl_1.SheetInfoImpl(_info.name, api_external_contract_js_1.SheetType.Dashboard, new Size_1.Size(_info.size.h, _info.size.w))) || this; + _this._info = _info; + _this._sheetPath = _sheetPath; + return _this; + } + Object.defineProperty(DashboardImpl.prototype, "worksheets", { + get: function () { + return this._worksheets; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "objects", { + get: function () { + return this._objects; + }, + enumerable: true, + configurable: true + }); + DashboardImpl.prototype.initializeWithPublicInterfaces = function (dashboard) { + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dashboard, 'dashboard'); + this._worksheets = new Array(); + this._objects = new Array(); + // Process all the zones which are contained in this dashboard + for (var _i = 0, _a = this._info.zones; _i < _a.length; _i++) { + var zone = _a[_i]; + var worksheet = undefined; + var zoneSize = new Size_1.Size(zone.height, zone.width); + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) { + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; + var sheetInfo = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize); + var vizId = { + worksheet: worksheetName, + dashboard: this._info.name, + storyboard: this._sheetPath.storyboard, + flipboardZoneID: this._sheetPath.flipboardZoneID, + storyPointID: this._sheetPath.storyPointID + }; + var worksheetImpl = new WorksheetImpl_1.WorksheetImpl(sheetInfo, vizId, dashboard); + worksheet = new Worksheet_1.Worksheet(worksheetImpl); + this._worksheets.push(worksheet); + } + var zonePoint = new Point_1.Point(zone.x, zone.y); + var dashboardObject = new DashboardObject_1.DashboardObject(dashboard, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheet, zone.name, (zone.isFloating !== undefined) ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false + (zone.isVisible !== undefined) ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true + zone.zoneId); + this._objects.push(dashboardObject); + } + }; + DashboardImpl.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) { + var zoneService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("zone-service" /* Zone */); + return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.objects, zoneVisibilityMap); + }; + return DashboardImpl; +}(SheetImpl_1.SheetImpl)); +exports.DashboardImpl = DashboardImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js": +/*!**************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +var ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); +var Field_1 = __webpack_require__(/*! ../Field */ "../../api-shared-js/lib/src/ApiShared/Field.js"); +var TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../../api-shared-js/lib/src/ApiShared/TableSummary.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var DataSourceImpl = /** @class */ (function () { + function DataSourceImpl(_dataSourceInfo) { + var _this = this; + this._dataSourceInfo = _dataSourceInfo; + this._fields = _dataSourceInfo.fields.map(function (fieldModel) { + var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this); + return new Field_1.Field(fieldImpl); + }); + } + Object.defineProperty(DataSourceImpl.prototype, "name", { + get: function () { + return this._dataSourceInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "id", { + get: function () { + return this._dataSourceInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "extractUpdateTime", { + get: function () { + return this._dataSourceInfo.extractUpdateTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "fields", { + get: function () { + return this._fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "isExtract", { + get: function () { + return this._dataSourceInfo.isExtract; + }, + enumerable: true, + configurable: true + }); + DataSourceImpl.prototype.refreshAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return dataSourceService.refreshAsync(this._dataSourceInfo.id); + }; + DataSourceImpl.prototype.getConnectionSummariesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) { + return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); }); + }); + }; + DataSourceImpl.prototype.getActiveTablesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) { + return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); }); + }); + }; + DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.initializeWithPublicInterfaces = function (dataSource) { + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); + this._fields = this._dataSourceInfo.fields.map(function (fieldModel) { + var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); + return new Field_1.Field(fieldImpl); + }); + }; + DataSourceImpl.prototype.getLogicalTablesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) { + return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + }); + }; + return DataSourceImpl; +}()); +exports.DataSourceImpl = DataSourceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var FieldImpl = /** @class */ (function () { + function FieldImpl(_fieldInfo, _parentDataSource) { + this._fieldInfo = _fieldInfo; + this._parentDataSource = _parentDataSource; + } + Object.defineProperty(FieldImpl.prototype, "name", { + get: function () { + return this._fieldInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "id", { + get: function () { + return this._fieldInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "description", { + get: function () { + return this._fieldInfo.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "aggregation", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "dataSource", { + get: function () { + return this._parentDataSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "role", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isHidden", { + get: function () { + return this._fieldInfo.isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isGenerated", { + get: function () { + return this._fieldInfo.isGenerated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isCalculatedField", { + get: function () { + return this._fieldInfo.isCalculatedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isCombinedField", { + get: function () { + return this._fieldInfo.isCombinedField; + }, + enumerable: true, + configurable: true + }); + return FieldImpl; +}()); +exports.FieldImpl = FieldImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js": +/*!*************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "../../api-shared-js/lib/src/ApiShared/Events/ParameterChangedEvent.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./SingleEventManagerImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ParameterImpl = /** @class */ (function () { + function ParameterImpl(parameterInfo) { + this.setParameterInfo(parameterInfo); + } + Object.defineProperty(ParameterImpl.prototype, "name", { + get: function () { + return this._parameterInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "currentValue", { + get: function () { + return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "dataType", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "id", { + get: function () { + return this._globalFieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "allowableValues", { + get: function () { + return this._allowableValues; + }, + enumerable: true, + configurable: true + }); + ParameterImpl.prototype.changeValueAsync = function (newValue) { + var _this = this; + ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); + var coercedValue = Param_1.Param.serializeParameterValue(newValue); + var parametersService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */); + return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) { + _this.setParameterInfo(parameterInfo); + return _this.currentValue; + }); + }; + /** + * Helper method which goes through and registers each event type this impl knows about + * with the NotificationService. It returns an array of SingleEventManager objects which + * can then be passed to an EventListenerManager to handle user registration / unregistration. + * + * @param sheet The sheet object which will be included with the event notifications + * @returns {Array} Collection of event managers to pass to an EventListenerManager + */ + ParameterImpl.prototype.initializeEvents = function (sheet) { + var _this = this; + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); + var results = new Array(); + var notificationService; + try { + notificationService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + // Initialize all of the event managers we'll need (one for each event type) + var parameterEvent = new SingleEventManagerImpl_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.ParameterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, function (model) { + var fieldName = model; + return fieldName === _this._globalFieldName; + }, function (fieldName) { + parameterEvent.triggerEvent(function () { return new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet); }); + }); + results.push(parameterEvent); + return results; + }; + ParameterImpl.prototype.setParameterInfo = function (parameterInfo) { + this._parameterInfo = parameterInfo; + this._globalFieldName = parameterInfo.fieldName; + var type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); + var listValues; + var minValue; + var maxValue; + var stepSize; + var dateStepPeriod; + if (type === api_external_contract_js_1.ParameterValueType.List) { + var values = parameterInfo.allowableValues || []; + listValues = values.map(function (val) { return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType); }); + } + else if (type === api_external_contract_js_1.ParameterValueType.Range) { + minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType); + maxValue = parameterInfo.maxValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.maxValue, parameterInfo.dataType); + stepSize = parameterInfo.stepSize; + dateStepPeriod = parameterInfo.dateStepPeriod && + InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(parameterInfo.dateStepPeriod); + } + this._allowableValues = { + type: type, + allowableValues: listValues, + minValue: minValue, + maxValue: maxValue, + stepSize: stepSize, + dateStepPeriod: dateStepPeriod + }; + }; + return ParameterImpl; +}()); +exports.ParameterImpl = ParameterImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js": +/*!*********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var SheetImpl = /** @class */ (function () { + function SheetImpl(_sheetInfoImpl) { + this._sheetInfoImpl = _sheetInfoImpl; + } + Object.defineProperty(SheetImpl.prototype, "name", { + get: function () { + return this._sheetInfoImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "sheetType", { + get: function () { + return this._sheetInfoImpl.sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "sheetPath", { + get: function () { + return this._sheetInfoImpl.sheetPath; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "size", { + get: function () { + return this._sheetInfoImpl.sheetSize; + }, + enumerable: true, + configurable: true + }); + SheetImpl.prototype.findParameterAsync = function (parameterName, sheet) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(sheet, 'sheet'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */); + return service.findParameterByNameAsync(parameterName, sheet); + }; + SheetImpl.prototype.getParametersAsync = function (sheet) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(sheet, 'sheet'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("parameters-service" /* Parameters */); + return service.getParametersForSheetAsync(this.sheetPath, sheet); + }; + return SheetImpl; +}()); +exports.SheetImpl = SheetImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js": +/*!*************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var SheetInfoImpl = /** @class */ (function () { + function SheetInfoImpl(_name, _sheetType, _sheetSize) { + this._name = _name; + this._sheetType = _sheetType; + this._sheetSize = _sheetSize; + } + Object.defineProperty(SheetInfoImpl.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetSize", { + get: function () { + return this._sheetSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetType", { + get: function () { + return this._sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetPath", { + get: function () { + return { + sheetName: this.name, + isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard + // TODO - Stories + }; + }, + enumerable: true, + configurable: true + }); + return SheetInfoImpl; +}()); +exports.SheetInfoImpl = SheetInfoImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js": +/*!**********************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***! + \**********************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * This class implements the SingleEventManager interface for a single type of Tableau event + * + * @template TEventType The Tableau event type this class specializes + */ +var SingleEventManagerImpl = /** @class */ (function () { + function SingleEventManagerImpl(eventType) { + this._eventType = eventType; + this._handlers = []; + } + Object.defineProperty(SingleEventManagerImpl.prototype, "eventType", { + get: function () { + return this._eventType; + }, + enumerable: true, + configurable: true + }); + SingleEventManagerImpl.prototype.addEventListener = function (handler) { + var _this = this; + this._handlers.push(handler); + return function () { return _this.removeEventListener(handler); }; + }; + SingleEventManagerImpl.prototype.removeEventListener = function (handler) { + var beforeCount = this._handlers.length; + this._handlers = this._handlers.filter(function (h) { return h !== handler; }); + return beforeCount > this._handlers.length; + }; + SingleEventManagerImpl.prototype.triggerEvent = function (eventGenerator) { + for (var _i = 0, _a = this._handlers; _i < _a.length; _i++) { + var handler = _a[_i]; + try { + var eventModel = eventGenerator(); + handler(eventModel); + } + catch (e) { + // Since this handler could be outside our control, just catch anything it throws and continue on + continue; + } + } + }; + return SingleEventManagerImpl; +}()); +exports.SingleEventManagerImpl = SingleEventManagerImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js": +/*!*************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var DataSource_1 = __webpack_require__(/*! ../DataSource */ "../../api-shared-js/lib/src/ApiShared/DataSource.js"); +var DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./SingleEventManagerImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +var FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "../../api-shared-js/lib/src/ApiShared/Events/FilterChangedEvent.js"); +var MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "../../api-shared-js/lib/src/ApiShared/Events/MarksSelectedEvent.js"); +var GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +var visualIdsAreEqual = function (a, b) { + return a && b && + a.worksheet === b.worksheet && + a.dashboard === b.dashboard && + a.storyboard === b.storyboard && + a.storyPointID === b.storyPointID; +}; +var WorksheetImpl = /** @class */ (function (_super) { + __extends(WorksheetImpl, _super); + function WorksheetImpl(sheetInfoImpl, _visualId, _parentDashboard) { + var _this = _super.call(this, sheetInfoImpl) || this; + _this._visualId = _visualId; + _this._parentDashboard = _parentDashboard; + return _this; + } + Object.defineProperty(WorksheetImpl.prototype, "parentDashboard", { + get: function () { + return this._parentDashboard; + }, + enumerable: true, + configurable: true + }); + /** + * Helper method which goes through and registers each event type this impl knows about + * with the NotificationService. It returns an array of SingleEventManager objects which + * can then be passed to an EventListenerManager to handle user registration / unregistration. + * + * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications + * @returns {Array} Collection of event managers to pass to an EventListenerManager + */ + WorksheetImpl.prototype.initializeEvents = function (worksheet) { + var _this = this; + var results = new Array(); + var notificationService; + try { + notificationService = ServiceRegistry_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + // Initialize all of the event managers we'll need (one for each event type) + var marksEvent = new SingleEventManagerImpl_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, function (model) { + var visualId = model; + return visualIdsAreEqual(visualId, _this.visualId); + }, function (viz) { + marksEvent.triggerEvent(function () { return new MarksSelectedEvent_1.MarksSelectedEvent(worksheet); }); + }); + var filterEvent = new SingleEventManagerImpl_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, function (model) { + var filterEventResponse = model; + return _this.visualId.worksheet === filterEventResponse.visualId.worksheet; + }, function (event) { + filterEvent.triggerEvent(function () { return new FilterChangedEvent_1.FilterChangedEvent(worksheet, event.fieldName); }); + }); + results.push(marksEvent); + results.push(filterEvent); + // TODO - other event types + return results; + }; + Object.defineProperty(WorksheetImpl.prototype, "visualId", { + get: function () { + return this._visualId; + }, + enumerable: true, + configurable: true + }); + WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, api_external_contract_js_1.FilterUpdateType, 'FilterUpdateType'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */); + return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); + }; + WorksheetImpl.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions'); + if (filterOptions.nullOption) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(filterOptions.nullOption, api_external_contract_js_1.FilterNullOption, 'FilterNullOption'); + } + else { + ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max); + } + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */); + return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); + }; + WorksheetImpl.prototype.clearFilterAsync = function (fieldName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */); + return service.clearFilterAsync(this.visualId, fieldName); + }; + WorksheetImpl.prototype.getDataSourcesAsync = function () { + var _this = this; + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return service.getDataSourcesAsync(this.visualId).then(function (result) { + var dataSchema = result; + var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name]; + var dataSources = []; + // First, add the primary datasource. By convention, it comes first in the returned array. + var primaryId = worksheetDataSourceInfo.primaryDataSource; + dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); + // Then, loop through any secondary data sources and add them. + for (var _i = 0, _a = worksheetDataSourceInfo.referencedDataSourceList; _i < _a.length; _i++) { + var secondaryId = _a[_i]; + if (secondaryId !== primaryId) { + dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); + } + } + return dataSources; + }); + }; + WorksheetImpl.prototype.getFiltersAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */); + return service.getFiltersAsync(this.visualId); + }; + WorksheetImpl.prototype.getSelectedMarksAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + return service.getSelectedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.getHighlightedMarksAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + return service.getHighlightedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.getSummaryDataAsync = function (options) { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + return service.getSummaryColumnsInfoAsync(this.visualId); + }; + WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getUnderlyingTablesAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) { + return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + }); + }; + WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.clearSelectedMarksAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("selection-service" /* Selection */); + return service.clearSelectedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("selection-service" /* Selection */); + return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); + }; + WorksheetImpl.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("selection-service" /* Selection */); + return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); + }; + WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { + var dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo); + var dataSource = new DataSource_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + }; + return WorksheetImpl; +}(SheetImpl_1.SheetImpl)); +exports.WorksheetImpl = WorksheetImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/LogicalTable.js": +/*!*******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/LogicalTable.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of a logical table. + * This does not follow the Impl pattern as it is just a property bag. + */ +var LogicalTable = /** @class */ (function () { + function LogicalTable(_logicalTable) { + this._logicalTable = _logicalTable; + } + Object.defineProperty(LogicalTable.prototype, "id", { + get: function () { + return this._logicalTable.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(LogicalTable.prototype, "caption", { + get: function () { + return this._logicalTable.caption; + }, + enumerable: true, + configurable: true + }); + return LogicalTable; +}()); +exports.LogicalTable = LogicalTable; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Models/FilterModels.js": +/*!**************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Filter = /** @class */ (function () { + function Filter(_worksheetName, _fieldName, _filterType, _fieldId) { + this._worksheetName = _worksheetName; + this._fieldName = _fieldName; + this._filterType = _filterType; + this._fieldId = _fieldId; + } + Object.defineProperty(Filter.prototype, "worksheetName", { + get: function () { + return this._worksheetName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "filterType", { + get: function () { + return this._filterType; + }, + enumerable: true, + configurable: true + }); + Filter.prototype.getFieldAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("data-source-service" /* DataSourceService */); + return service.getFieldAsync(this._fieldId); + }; + return Filter; +}()); +exports.Filter = Filter; +var CategoricalFilter = /** @class */ (function (_super) { + __extends(CategoricalFilter, _super); + function CategoricalFilter(worksheetName, fieldName, fieldId, filterType, _appliedValues, _isExcludeMode, _isAllSelected) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId) || this; + _this._appliedValues = _appliedValues; + _this._isExcludeMode = _isExcludeMode; + _this._isAllSelected = _isAllSelected; + return _this; + } + Object.defineProperty(CategoricalFilter.prototype, "isAllSelected", { + get: function () { + return this._isAllSelected; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalFilter.prototype, "appliedValues", { + get: function () { + return this._appliedValues; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalFilter.prototype, "isExcludeMode", { + get: function () { + return this._isExcludeMode; + }, + enumerable: true, + configurable: true + }); + CategoricalFilter.prototype.getDomainAsync = function (domainType) { + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */); + return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); + }; + return CategoricalFilter; +}(Filter)); +exports.CategoricalFilter = CategoricalFilter; +var RangeFilter = /** @class */ (function (_super) { + __extends(RangeFilter, _super); + function RangeFilter(worksheetName, fieldName, fieldId, filterType, _min, _max, _includeNullValues) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId) || this; + _this._min = _min; + _this._max = _max; + _this._includeNullValues = _includeNullValues; + return _this; + } + Object.defineProperty(RangeFilter.prototype, "minValue", { + get: function () { + return this._min; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeFilter.prototype, "maxValue", { + get: function () { + return this._max; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeFilter.prototype, "includeNullValues", { + get: function () { + return this._includeNullValues; + }, + enumerable: true, + configurable: true + }); + RangeFilter.prototype.getDomainAsync = function (domainType) { + var service = ServiceRegistry_1.ApiServiceRegistry.instance.getService("filter-service" /* Filter */); + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); + }; + return RangeFilter; +}(Filter)); +exports.RangeFilter = RangeFilter; +var RelativeDateFilter = /** @class */ (function (_super) { + __extends(RelativeDateFilter, _super); + function RelativeDateFilter(worksheetName, fieldName, fieldId, filterType, _anchorDate, _periodType, _rangeType, _rangeN) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId) || this; + _this._anchorDate = _anchorDate; + _this._periodType = _periodType; + _this._rangeType = _rangeType; + _this._rangeN = _rangeN; + return _this; + } + Object.defineProperty(RelativeDateFilter.prototype, "anchorDate", { + get: function () { + return this._anchorDate; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "periodType", { + get: function () { + return this._periodType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "rangeType", { + get: function () { + return this._rangeType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "rangeN", { + get: function () { + return this._rangeN; + }, + enumerable: true, + configurable: true + }); + return RelativeDateFilter; +}(Filter)); +exports.RelativeDateFilter = RelativeDateFilter; +var CategoricalDomain = /** @class */ (function () { + function CategoricalDomain(_values, _domainType) { + this._values = _values; + this._domainType = _domainType; + } + Object.defineProperty(CategoricalDomain.prototype, "values", { + get: function () { + return this._values; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalDomain.prototype, "type", { + get: function () { + return this._domainType; + }, + enumerable: true, + configurable: true + }); + return CategoricalDomain; +}()); +exports.CategoricalDomain = CategoricalDomain; +var RangeDomain = /** @class */ (function () { + function RangeDomain(_min, _max, _domainType) { + this._min = _min; + this._max = _max; + this._domainType = _domainType; + } + Object.defineProperty(RangeDomain.prototype, "type", { + get: function () { + return this._domainType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeDomain.prototype, "min", { + get: function () { + return this._min; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeDomain.prototype, "max", { + get: function () { + return this._max; + }, + enumerable: true, + configurable: true + }); + return RangeDomain; +}()); +exports.RangeDomain = RangeDomain; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js": +/*!***************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/GetDataModels.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var DataTable = /** @class */ (function () { + function DataTable(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { + this._data = _data; + this._columns = _columns; + this._totalRowCount = _totalRowCount; + this._isTotalRowCountLimited = _isTotalRowCountLimited; + this._isSummaryData = _isSummaryData; + this._marksInfo = _marksInfo; + this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table'; + } + Object.defineProperty(DataTable.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "columns", { + get: function () { + return this._columns; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "marksInfo", { + get: function () { + return this._marksInfo; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "totalRowCount", { + get: function () { + return this._totalRowCount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "isTotalRowCountLimited", { + get: function () { + return this._isTotalRowCountLimited; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "isSummaryData", { + get: function () { + return this._isSummaryData; + }, + enumerable: true, + configurable: true + }); + return DataTable; +}()); +exports.DataTable = DataTable; +var MarkInfo = /** @class */ (function () { + function MarkInfo(_type, _color, _tupleId) { + this._type = _type; + this._color = _color; + this._tupleId = _tupleId; + } + Object.defineProperty(MarkInfo.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkInfo.prototype, "color", { + get: function () { + return this._color; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkInfo.prototype, "tupleId", { + get: function () { + return this._tupleId; + }, + enumerable: true, + configurable: true + }); + return MarkInfo; +}()); +exports.MarkInfo = MarkInfo; +var Column = /** @class */ (function () { + function Column(_fieldName, _fieldId, _dataType, _isReferenced, _index) { + this._fieldName = _fieldName; + this._fieldId = _fieldId; + this._dataType = _dataType; + this._isReferenced = _isReferenced; + this._index = _index; + } + Object.defineProperty(Column.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "dataType", { + get: function () { + return this._dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "isReferenced", { + get: function () { + return this._isReferenced; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "index", { + get: function () { + return this._index; + }, + enumerable: true, + configurable: true + }); + return Column; +}()); +exports.Column = Column; +var DataValue = /** @class */ (function () { + /* tslint:disable:no-any */ + function DataValue(_value, _nativeValue, _formattedValue) { + this._value = _value; + this._nativeValue = _nativeValue; + this._formattedValue = _formattedValue; + } + Object.defineProperty(DataValue.prototype, "value", { + get: function () { + return this._value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataValue.prototype, "nativeValue", { + get: function () { + return this._nativeValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataValue.prototype, "formattedValue", { + get: function () { + return this._formattedValue; + }, + enumerable: true, + configurable: true + }); + return DataValue; +}()); +exports.DataValue = DataValue; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js": +/*!*****************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! + \*****************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Selection Model. + */ +var SelectionModel = /** @class */ (function () { + function SelectionModel() { + } + return SelectionModel; +}()); +exports.SelectionModel = SelectionModel; +/** + * Value based selection model. Meant for hierarchical, range and categorical selections. + */ +var ValueSelectionModel = /** @class */ (function (_super) { + __extends(ValueSelectionModel, _super); + function ValueSelectionModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.selectValues = []; + return _this; + } + return ValueSelectionModel; +}(SelectionModel)); +exports.ValueSelectionModel = ValueSelectionModel; +/** + * Hierarchical value selection model + */ +var HierarchicalSelectionModel = /** @class */ (function (_super) { + __extends(HierarchicalSelectionModel, _super); + function HierarchicalSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return HierarchicalSelectionModel; +}(ValueSelectionModel)); +exports.HierarchicalSelectionModel = HierarchicalSelectionModel; +/** + * Range based value selection model + */ +var RangeSelectionModel = /** @class */ (function (_super) { + __extends(RangeSelectionModel, _super); + function RangeSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return RangeSelectionModel; +}(SelectionModel)); +exports.RangeSelectionModel = RangeSelectionModel; +/** + * Dimension value selection model + */ +var DimensionSelectionModel = /** @class */ (function (_super) { + __extends(DimensionSelectionModel, _super); + function DimensionSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return DimensionSelectionModel; +}(ValueSelectionModel)); +exports.DimensionSelectionModel = DimensionSelectionModel; +/** + * Tuple based selection model + */ +var TupleSelectionModel = /** @class */ (function () { + function TupleSelectionModel() { + this.objectIds = []; + } + return TupleSelectionModel; +}()); +exports.TupleSelectionModel = TupleSelectionModel; +/** + * Container class to populate all the selection models when parsing input + */ +var SelectionModelsContainer = /** @class */ (function () { + function SelectionModelsContainer() { + this.hierModelArr = []; + this.dimModelArr = []; + this.quantModelArr = []; + } + return SelectionModelsContainer; +}()); +exports.SelectionModelsContainer = SelectionModelsContainer; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Parameter.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Parameter.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var EventListenerManager_1 = __webpack_require__(/*! ./EventListenerManager */ "../../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +/** + * Implementation of the Parameter contract. Calls down to the impl + * class for almost all of the work it does. + */ +var Parameter = /** @class */ (function (_super) { + __extends(Parameter, _super); + function Parameter(parameterImpl, sheet) { + var _this = _super.call(this) || this; + _this.parameterImpl = parameterImpl; + // Initialize our event handling for this class + _this.parameterImpl.initializeEvents(sheet).forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Parameter.prototype, "name", { + get: function () { + return this.parameterImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "currentValue", { + get: function () { + return this.parameterImpl.currentValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "dataType", { + get: function () { + return this.parameterImpl.dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "allowableValues", { + get: function () { + return this.parameterImpl.allowableValues; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "id", { + get: function () { + return this.parameterImpl.id; + }, + enumerable: true, + configurable: true + }); + Parameter.prototype.changeValueAsync = function (newValue) { + return this.parameterImpl.changeValueAsync(newValue); + }; + return Parameter; +}(EventListenerManager_1.EventListenerManager)); +exports.Parameter = Parameter; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Point.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Point.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Point = /** @class */ (function () { + function Point(_x, _y) { + this._x = _x; + this._y = _y; + } + Object.defineProperty(Point.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Point.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true + }); + return Point; +}()); +exports.Point = Point; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/GetDataService.js": +/*!******************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***! + \******************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Defines which type of getData call to make. + */ +var GetDataType; +(function (GetDataType) { + GetDataType["Summary"] = "summary"; + GetDataType["Underlying"] = "underlying"; +})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js": +/*!*****************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***! + \*****************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); +var FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); +var GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); +var NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +var ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); +var SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); +var ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); +function registerAllSharedServices(dispatcher, platformVersion) { + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, platformVersion)); + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.instance.registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher)); +} +exports.registerAllSharedServices = registerAllSharedServices; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js": +/*!*******************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***! + \*******************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceRegistryImpl = /** @class */ (function () { + function ServiceRegistryImpl() { + this._services = {}; + } + ServiceRegistryImpl.prototype.registerService = function (service) { + this._services[service.serviceName] = service; + }; + ServiceRegistryImpl.prototype.getService = function (serviceName) { + if (!this._services.hasOwnProperty(serviceName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Service not registered: " + serviceName); + } + return this._services[serviceName]; + }; + return ServiceRegistryImpl; +}()); +/** + * static class used for getting access to the single instance + * of the ApiServiceRegistry + */ +var ApiServiceRegistry = /** @class */ (function () { + // Private to avoid anyone constructing this + function ApiServiceRegistry() { + } + Object.defineProperty(ApiServiceRegistry, "instance", { + /** + * Gets the singleton instance of the ServiceRegistry + */ + get: function () { + if (!window.__tableauApiServiceRegistry) { + ApiServiceRegistry.setInstance(new ServiceRegistryImpl()); + } + if (!window.__tableauApiServiceRegistry) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed'); + } + return window.__tableauApiServiceRegistry; + }, + enumerable: true, + configurable: true + }); + /** + * Helper method to override the registry instance. Can be used by unit tests + * + * @param {ServiceRegistry} serviceRegistry The new registry + */ + ApiServiceRegistry.setInstance = function (serviceRegistry) { + window.__tableauApiServiceRegistry = serviceRegistry; + }; + return ApiServiceRegistry; +}()); +exports.ApiServiceRegistry = ApiServiceRegistry; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js": +/*!******************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! + \******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var Field_1 = __webpack_require__(/*! ../../Field */ "../../api-shared-js/lib/src/ApiShared/Field.js"); +var FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +var DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../../api-shared-js/lib/src/ApiShared/DataSource.js"); +var DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +exports.SENTINEL_LOGICAL_TABLE_INFO = { + id: InternalContract.ApiShowDataTableSentinel.SingleTableId, + caption: InternalContract.ApiShowDataTableSentinel.SingleTableCaption +}; +var DataSourceServiceImpl = /** @class */ (function (_super) { + __extends(DataSourceServiceImpl, _super); + function DataSourceServiceImpl(dispatcher, _platformVersion) { + var _this = _super.call(this, dispatcher) || this; + _this._platformVersion = _platformVersion; + return _this; + } + Object.defineProperty(DataSourceServiceImpl.prototype, "serviceName", { + get: function () { + return "data-source-service" /* DataSourceService */; + }, + enumerable: true, + configurable: true + }); + DataSourceServiceImpl.prototype.refreshAsync = function (dataSourceId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a[api_internal_contract_js_1.ParameterId.DeltaTimeMs] = 0, + _a[api_internal_contract_js_1.ParameterId.ShouldRefreshDS] = true, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then(function (response) { + return; + }); + }; + DataSourceServiceImpl.prototype.getActiveTablesAsync = function (dataSourceId) { + var _a; + var joinParameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, _a); + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then(function (joinResponse) { + var tableInfos = joinResponse.result; + // getActiveTables is unsupported for cubes and GA. We do not have a connection type property + // available from the platform (intentionally, to reduce code churn as new connections are added). + // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource. + if (tableInfos.tables.length === 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, "getActiveTables is not supported for: " + dataSourceId); + } + return tableInfos.tables; + }); + }; + DataSourceServiceImpl.prototype.getDataSourcesAsync = function (visualId) { + var _a; + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then(function (response) { + var dataSchema = response.result; + return dataSchema; + }); + }; + DataSourceServiceImpl.prototype.getConnectionSummariesAsync = function (dataSourceId) { + var _a; + var params = (_a = {}, _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, _a); + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then(function (response) { + var descriptionSummaries = response.result; + return descriptionSummaries; + }); + }; + DataSourceServiceImpl.prototype.getFieldAsync = function (globalfieldName) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FieldId] = globalfieldName, _a); + return this.execute(verb, parameters).then(function (response) { + var dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; + var field = response.result[api_internal_contract_js_1.ParameterId.Field]; + return _this.convertField(field, _this.convertDataSource(dataSource)); + }); + }; + DataSourceServiceImpl.prototype.getLogicalTablesAsync = function (dataSourceId) { + var _a; + if (!this.isObjectModelSupportedByPlatform()) { + /** + * This sentinel ID can be passed to datasource.getLogicalTableData. + * Once the desktop is upgraded to a version that supports object model, + * the sentinel ID will automatically fetch the upgraded table. + * */ + return new Promise(function (resolve) { + return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); + }); + } + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then(function (response) { + return response.result; + }); + }; + DataSourceServiceImpl.prototype.getUnderlyingTablesAsync = function (visualId) { + var _a; + if (!this.isObjectModelSupportedByPlatform()) { + /** + * This sentinel ID can be passed to worksheet.getUnderlyingTableData. + * Once the desktop is upgraded to a version that supports object model, + * the sentinel ID will automatically fetch the upgraded table. + * */ + return new Promise(function (resolve) { + return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); + }); + } + var params = (_a = {}, _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then(function (response) { + return response.result; + }); + }; + DataSourceServiceImpl.prototype.convertField = function (field, dataSource) { + return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); + }; + DataSourceServiceImpl.prototype.convertDataSource = function (dataSource) { + return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource)); + }; + DataSourceServiceImpl.prototype.isObjectModelSupportedByPlatform = function () { + var platformVersionNoObjectModelSupport = { major: 1, minor: 13, fix: 0 }; + return InternalContract.VersionLessThan(platformVersionNoObjectModelSupport, this._platformVersion); + }; + return DataSourceServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.DataSourceServiceImpl = DataSourceServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js": +/*!**************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js ***! + \**************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../../api-shared-js/lib/src/ApiShared.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var FilterServiceImpl = /** @class */ (function (_super) { + __extends(FilterServiceImpl, _super); + function FilterServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(FilterServiceImpl.prototype, "serviceName", { + get: function () { + return "filter-service" /* Filter */; + }, + enumerable: true, + configurable: true + }); + FilterServiceImpl.prototype.applyFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { + var verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + if (!Array.isArray(values)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyFilterAsync must be an array'); + } + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = + (filterOptions === undefined || filterOptions.isExcludeMode === undefined) ? false : filterOptions.isExcludeMode; + return this.execute(verb, parameters).then(function (response) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyRangeFilterAsync = function (visualId, fieldName, filterOptions) { + var verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + var parameters = {}; + if (filterOptions.min !== undefined && filterOptions.min !== null) { + var min = void 0; + if (filterOptions.min instanceof Date) { + min = Param_1.Param.serializeDateForPlatform(filterOptions.min); + } + else { + min = filterOptions.min; + } + parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min; + } + if (filterOptions.max !== undefined && filterOptions.max !== null) { + var max = void 0; + if (filterOptions.max instanceof Date) { + max = Param_1.Param.serializeDateForPlatform(filterOptions.max); + } + else { + max = filterOptions.max; + } + parameters[api_internal_contract_js_1.ParameterId.FilterRangeMax] = max; + } + // The null option is used with min+max for 'include-range' or 'include-range-or-null' + if (filterOptions.nullOption) { + parameters[api_internal_contract_js_1.ParameterId.FilterRangeNullOption] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.nullOptions.convert(filterOptions.nullOption); + } + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then(function (response) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.clearFilterAsync = function (visualId, fieldName) { + var verb = api_internal_contract_js_1.VerbId.ClearFilter; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + return this.execute(verb, parameters).then(function (resposne) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.getFiltersAsync = function (visualId) { + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetFilters; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then(function (response) { + var filters = response.result; + return _this.convertDomainFilters(filters); + }); + }; + FilterServiceImpl.prototype.getCategoricalDomainAsync = function (worksheetName, fieldId, domainType) { + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then(function (response) { + var domain = response.result; + return _this.convertCategoricalDomain(domain, domainType); + }); + }; + FilterServiceImpl.prototype.getRangeDomainAsync = function (worksheetName, fieldId, domainType) { + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then(function (response) { + var domain = response.result; + return _this.convertRangeDomain(domain, domainType); + }); + }; + // Helper Methods + FilterServiceImpl.prototype.convertDomainFilters = function (domainFilters) { + var _this = this; + var filters = []; + domainFilters.forEach(function (domainFilter) { + switch (domainFilter.filterType) { + case api_internal_contract_js_1.FilterType.Categorical: { + var filter = domainFilter; + if (filter) { + filters.push(_this.convertCategoricalFilter(filter)); + } + else { + throw new Error('Invalid Categorical Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.Range: { + var filter = domainFilter; + if (filter) { + filters.push(_this.convertRangeFilter(filter)); + } + else { + throw new Error('Invalid Range Filter'); + } + break; + } + case api_internal_contract_js_1.FilterType.RelativeDate: { + var filter = domainFilter; + if (filter) { + filters.push(_this.convertRelativeDateFilter(filter)); + } + else { + throw new Error('Invalid Relative Date Filter'); + } + break; + } + default: { + break; + } + } + }); + return filters; + }; + FilterServiceImpl.prototype.convertCategoricalFilter = function (domainFilter) { + var appliedValues = domainFilter.values.map(function (dv) { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); + }); + return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); + }; + FilterServiceImpl.prototype.convertRangeFilter = function (domainFilter) { + var minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); + var maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); + return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, minValue, maxValue, domainFilter.includeNullValues); + }; + FilterServiceImpl.prototype.convertRelativeDateFilter = function (domainFilter) { + var anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); + return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); + }; + FilterServiceImpl.prototype.convertCategoricalDomain = function (domain, domainType) { + var values = domain.values.map(function (domainDv) { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); + }); + return new FilterModels_1.CategoricalDomain(values, domainType); + }; + FilterServiceImpl.prototype.convertRangeDomain = function (domain, domainType) { + var min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); + var max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); + return new FilterModels_1.RangeDomain(min, max, domainType); + }; + return FilterServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.FilterServiceImpl = FilterServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": +/*!***************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! + \***************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +var GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../../api-shared-js/lib/src/ApiShared.js"); +var GetDataServiceImpl = /** @class */ (function (_super) { + __extends(GetDataServiceImpl, _super); + function GetDataServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(GetDataServiceImpl.prototype, "serviceName", { + get: function () { + return "get-data-service" /* GetData */; + }, + enumerable: true, + configurable: true + }); + GetDataServiceImpl.prototype.getMaxRowLimit = function () { + return 10000; + }; + GetDataServiceImpl.prototype.getLimitedMaxRows = function (requestedRows) { + var rowCountLimit = this.getMaxRowLimit() + 1; + return (requestedRows > 0 && requestedRows < rowCountLimit) ? requestedRows : rowCountLimit; + }; + GetDataServiceImpl.prototype.getUnderlyingDataAsync = function (visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) { + var _this = this; + // Create all of our parameters + var verb = getType === GetDataService_1.GetDataType.Summary ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; + var requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows) : maxRows; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases; + parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection; + parameters[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns; + parameters[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById); + parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows; + parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption); + return this.execute(verb, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, responseData.isSummary); + }); + }; + GetDataServiceImpl.prototype.getSummaryColumnsInfoAsync = function (visualId) { + var _a; + // Create all the parameters for GetDataType of Summary with 1 row, and only native values + // Then return just the columns + var verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = true, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = true, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = true, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = 1, + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + _a); + return this.execute(verb, parameters).then(function (response) { + var underlyingDataTable = response.result; + var dataTable = underlyingDataTable.data; + var columns = dataTable.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + return columns; + }); + }; + GetDataServiceImpl.prototype.getSelectedMarksAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, _a); + return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then(function (response) { + var responseData = response.result; + return { + data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }) + }; + }); + }; + GetDataServiceImpl.prototype.getHighlightedMarksAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, _a); + return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then(function (response) { + var responseData = response.result; + return { + data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }) + }; + }); + }; + GetDataServiceImpl.prototype.getDataSourceDataAsync = function (dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows), + _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = this.verifyIncludeColumnArray(columnsToInclude), + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getLogicalTableDataAsync = function (datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = columnsToInclude, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getUnderlyingTableDataAsync = function (visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.verifyIncludeColumnArray = function (columns) { + // columns must be a valid array + if (!Array.isArray(columns)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); + } + // Remove any duplicates from the input array + var columnsAsSet = new Set(columns); + return Array.from(columnsAsSet); + }; + GetDataServiceImpl.prototype.processResultsTable = function (responseData, isSummary) { + var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + // TODO This should be controlled by a flag indicating whether this api will respond marks info or not + var marks; + if (responseData.marks) { + marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + } + // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. + // Remove the last element so we always return MaxRowLimit + var isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; + if (isTotalRowCountLimited) { + responseData.dataTable.length -= 1; + } + var table = responseData.dataTable.map(function (row) { + return row.map(function (cell, index) { + return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); + }); + }); + if (marks) { + return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks); + } + return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary); + }; + return GetDataServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.GetDataServiceImpl = GetDataServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": +/*!********************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! + \********************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Registration = /** @class */ (function () { + function Registration(_filterFn, _callbackFn) { + this._filterFn = _filterFn; + this._callbackFn = _callbackFn; + // Nothing Here + } + Registration.prototype.onNotification = function (notificationModel) { + if (this._filterFn(notificationModel)) { + this._callbackFn(notificationModel); + } + }; + return Registration; +}()); +var NotificationServiceImpl = /** @class */ (function () { + function NotificationServiceImpl(dispatcher) { + this.dispatcher = dispatcher; + this._handlers = {}; + this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); + } + Object.defineProperty(NotificationServiceImpl.prototype, "serviceName", { + get: function () { + return "notification-service" /* Notification */; + }, + enumerable: true, + configurable: true + }); + NotificationServiceImpl.prototype.registerHandler = function (id, filterFn, handler) { + var _this = this; + var handlers = this._handlers[id] || new Array(); + var registration = new Registration(filterFn, handler); + handlers.push(registration); + this._handlers[id] = handlers; + return function () { return _this.removeRegistration(id, registration); }; + }; + NotificationServiceImpl.prototype.hasHandlersForNotificationType = function (id) { + return this._handlers.hasOwnProperty(id); + }; + NotificationServiceImpl.prototype.onNotification = function (notification) { + if (!this.hasHandlersForNotificationType(notification.notificationId)) { + return; + } + // Go through and check for all the handlers of this particular notification + this._handlers[notification.notificationId].forEach(function (h) { return h.onNotification(notification.data); }); + }; + NotificationServiceImpl.prototype.removeRegistration = function (id, registration) { + if (!this.hasHandlersForNotificationType(id)) { + return; + } + this._handlers[id] = this._handlers[id].filter(function (reg) { return reg !== registration; }); + }; + return NotificationServiceImpl; +}()); +exports.NotificationServiceImpl = NotificationServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": +/*!******************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! + \******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +var Parameter_1 = __webpack_require__(/*! ../../Parameter */ "../../api-shared-js/lib/src/ApiShared/Parameter.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ParametersServiceImpl = /** @class */ (function (_super) { + __extends(ParametersServiceImpl, _super); + function ParametersServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ParametersServiceImpl.prototype, "serviceName", { + get: function () { + return "parameters-service" /* Parameters */; + }, + enumerable: true, + configurable: true + }); + ParametersServiceImpl.prototype.getParametersForSheetAsync = function (sheetPath, sheet) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.SheetPath] = sheetPath, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, parameters).then(function (response) { + // TODO - Check for error + var result = response.result; + return result.map(function (parameterInfo) { + var impl = new ParameterImpl_1.ParameterImpl(parameterInfo); + return new Parameter_1.Parameter(impl, sheet); + }); + }); + }; + ParametersServiceImpl.prototype.changeParameterValueAsync = function (fieldName, newValue) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName, + _a[api_internal_contract_js_1.ParameterId.ParameterValue] = newValue, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + ParametersServiceImpl.prototype.findParameterByNameAsync = function (name, sheet) { + return this.findParameterAsync(sheet, name, undefined); + }; + ParametersServiceImpl.prototype.findParameterByGlobalFieldNameAsync = function (fieldName, sheet) { + return this.findParameterAsync(sheet, undefined, fieldName); + }; + ParametersServiceImpl.prototype.findParameterAsync = function (sheet, name, fieldName) { + var parameters = {}; + if (name !== undefined) { + parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name; + } + else if (fieldName !== undefined) { + parameters[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName; + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter'); + } + return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then(function (response) { + var instanceOfParameterInfo = function (object) { + return 'fieldName' in object; + }; + // We need to check to see if we got a valid response back again + if (instanceOfParameterInfo(response.result)) { + var result = response.result; + var impl = new ParameterImpl_1.ParameterImpl(result); + return new Parameter_1.Parameter(impl, sheet); + } + else { + return undefined; + } + }); + }; + return ParametersServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ParametersServiceImpl = ParametersServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": +/*!*****************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! + \*****************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var SelectionServiceImpl = /** @class */ (function (_super) { + __extends(SelectionServiceImpl, _super); + function SelectionServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SelectionServiceImpl.prototype, "serviceName", { + get: function () { + return "selection-service" /* Selection */; + }, + enumerable: true, + configurable: true + }); + /** + * Method to clear all the selected marks for the given worksheet. + * + * @param visualId + */ + SelectionServiceImpl.prototype.clearSelectedMarksAsync = function (visualId) { + var _a; + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, _a); + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then(function (response) { + return; // Expecting an empty model and hence the void response. + }); + }; + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param selectionCriteria + * @param selectionUpdateType + */ + SelectionServiceImpl.prototype.selectMarksByValueAsync = function (visualId, selectionCriterias, selectionUpdateType) { + var _a; + if (selectionCriterias.length === 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); + } + var selectionType = this.validateSelectionUpdateType(selectionUpdateType); + var selectionModelContainer = this.parseSelectionMarks(selectionCriterias); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, + _a); + if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr; + } + if (selectionModelContainer.quantModelArr && selectionModelContainer.quantModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.QuantRangeSelectionModels] = selectionModelContainer.quantModelArr; + } + if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) { + parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr; + } + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + // TODO Investigate the error response with multiple output params and throw error accordingly. + }); + }; + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param MarkInfo + * @param selectionUpdateType + */ + SelectionServiceImpl.prototype.selectMarksByIdAsync = function (visualId, marks, selectionUpdateType) { + var _a; + if (marks.length === 0) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); + } + var selectionType = this.validateSelectionUpdateType(selectionUpdateType); + var selectionModelContainer = this.parseSelectionIds(marks); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, + _a[api_internal_contract_js_1.ParameterId.Selection] = selectionModelContainer.selection, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + // TODO Investigate the error response with multiple output params and throw error accordingly. + }); + }; + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + SelectionServiceImpl.prototype.parseSelectionIds = function (marks) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (var i = 0; i < marks.length; i++) { + var tupleId = marks[i].tupleId; + if (tupleId !== undefined && tupleId !== null) { // If tuple id is provided use that instead of pair + ids.push(tupleId.toString()); // collect the tuple ids + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'tupleId parsing error'); + } + } + if (ids.length !== 0) { // tuple ids based selection + var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + }; + /** + * Method to prepare the pres models for selection by values. + * + * Supports 3 types for selection: + * 1) Hierarchical value based selection + * 2) Range value based selection + * 3) Dimension value based selection + * + * @param marks + */ + SelectionServiceImpl.prototype.parseSelectionMarks = function (selectionCriterias) { + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (var i = 0; i < selectionCriterias.length; i++) { + var st = selectionCriterias[i]; + if (!(st.fieldName && (st.value !== undefined && st.value !== null))) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Selection Criteria parsing error'); + } + var catRegex = new RegExp('(\[[A-Za-z0-9]+]).*', 'g'); + var rangeOption = st.value; + if (catRegex.test(st.fieldName)) { // Hierarchical value selection + var hierModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.hierModelArr.push(hierModel); + } + else if (rangeOption.min !== undefined + && rangeOption.max !== undefined) { // Range value selection + var quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); + selectionModelContainer.quantModelArr.push(quantModel); + } + else { // Dimension value selection + var dimModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.dimModelArr.push(dimModel); + } + } + return selectionModelContainer; + }; + /** + * Method to transform the key value pair into value based pres model object. + * + * @param valueSelectionModel + * @param fieldName + * @param value + */ + SelectionServiceImpl.prototype.addToParamsList = function (fieldName, value) { + var valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); + var markValues = []; + if (value instanceof Array) { + var valueArr = value; + for (var i = 0; i < valueArr.length; i++) { + markValues.push(Param_1.Param.serializeParameterValue(valueArr[i])); + } + } + else { + markValues.push(Param_1.Param.serializeParameterValue(value)); + } + valueSelectionModel.qualifiedFieldCaption = fieldName; + valueSelectionModel.selectValues = markValues; + return valueSelectionModel; + }; + /** + * Method to transform the key value pair into range based selection pres model. + * + * TODO: Need to handle the parsing of date type values. + * + * @param valueSelectionModel + * @param fieldName + * @param value + */ + SelectionServiceImpl.prototype.addToRangeParamsList = function (fieldName, value) { + var rangeSelectionModel = new SelectionModels_1.RangeSelectionModel(); + rangeSelectionModel.qualifiedFieldCaption = fieldName; + if (value.max !== undefined && value.max !== null) { + rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max); + } + if (value.min !== undefined && value.min !== null) { + rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min); + } + rangeSelectionModel.included = this.validateNullOptionType(value.nullOption); + return rangeSelectionModel; + }; + /** + * Method to validate the selection update type. + * + * @param selectionUpdateType + */ + SelectionServiceImpl.prototype.validateSelectionUpdateType = function (selectionUpdateType) { + if (selectionUpdateType === api_external_contract_js_1.SelectionUpdateType.Replace) { + return api_internal_contract_js_1.SelectionUpdateType.Replace; + } + else if (selectionUpdateType === api_external_contract_js_1.SelectionUpdateType.Add) { + return api_internal_contract_js_1.SelectionUpdateType.Add; + } + else if (selectionUpdateType === api_external_contract_js_1.SelectionUpdateType.Remove) { + return api_internal_contract_js_1.SelectionUpdateType.Remove; + } + return api_internal_contract_js_1.SelectionUpdateType.Replace; + }; + /** + * Method to validate the include type for range selection. + * + * @param nullOption + */ + SelectionServiceImpl.prototype.validateNullOptionType = function (nullOption) { + if (nullOption) { + if (nullOption === api_external_contract_js_1.FilterNullOption.NullValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull; + } + else if (nullOption === api_external_contract_js_1.FilterNullOption.NonNullValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNonNull; + } + else if (nullOption === api_external_contract_js_1.FilterNullOption.AllValues) { + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + } + } + return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + }; + return SelectionServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.SelectionServiceImpl = SelectionServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js": +/*!************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js ***! + \************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/** + * Each ServceImpl should extend this base class for the sake of + * proper error handling. This base handles the conversion + * from internal errors to external errors that we throw to developers + */ +var ServiceImplBase = /** @class */ (function () { + function ServiceImplBase(_dispatcher) { + this._dispatcher = _dispatcher; + } + ServiceImplBase.prototype.execute = function (verb, params) { + return this._dispatcher.execute(verb, params).catch(function (error) { + // Any internal error that comes from the dispatcher should be converted + // to an external error using the enum mapper for error codes. + var internalError = error; + var externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); + throw new TableauError_1.TableauError(externalErrorCode, internalError.message); + }); + }; + return ServiceImplBase; +}()); +exports.ServiceImplBase = ServiceImplBase; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js": +/*!************************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! + \************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ZoneServiceImpl = /** @class */ (function (_super) { + __extends(ZoneServiceImpl, _super); + function ZoneServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ZoneServiceImpl.prototype, "serviceName", { + get: function () { + return "zone-service" /* Zone */; + }, + enumerable: true, + configurable: true + }); + ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardObjects, zoneVisibilityMap) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, + _a[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap] = {}, + _a); + // zoneVisibilityMap can be either an object or a Map - convert it to a Map + var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); + parameterAsMap.forEach(function (value, key) { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardObjects, Number.parseInt(key, 10)); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.ZoneVisibilityType, 'ZoneVisibilityType'); + parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); + }); + return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then(function (response) { + return; + }); + }; + return ZoneServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ZoneServiceImpl = ZoneServiceImpl; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Sheet.js": +/*!************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Sheet.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var EventListenerManager_1 = __webpack_require__(/*! ./EventListenerManager */ "../../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +var Sheet = /** @class */ (function (_super) { + __extends(Sheet, _super); + function Sheet(_sheetImpl) { + var _this = _super.call(this) || this; + _this._sheetImpl = _sheetImpl; + return _this; + } + Object.defineProperty(Sheet.prototype, "name", { + get: function () { + return this._sheetImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Sheet.prototype, "sheetType", { + get: function () { + return this._sheetImpl.sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Sheet.prototype, "size", { + get: function () { + return this._sheetImpl.size; + }, + enumerable: true, + configurable: true + }); + Sheet.prototype.findParameterAsync = function (parameterName) { + return this._sheetImpl.findParameterAsync(parameterName, this); + }; + Sheet.prototype.getParametersAsync = function () { + return this._sheetImpl.getParametersAsync(this); + }; + return Sheet; +}(EventListenerManager_1.EventListenerManager)); +exports.Sheet = Sheet; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Size.js": +/*!***********************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Size.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var Size = /** @class */ (function () { + function Size(_height, _width) { + this._height = _height; + this._width = _width; + } + Object.defineProperty(Size.prototype, "height", { + get: function () { + return this._height; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Size.prototype, "width", { + get: function () { + return this._width; + }, + enumerable: true, + configurable: true + }); + return Size; +}()); +exports.Size = Size; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/TableSummary.js": +/*!*******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/TableSummary.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of a table summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +var TableSummary = /** @class */ (function () { + function TableSummary(_tableInfo) { + this._tableInfo = _tableInfo; + } + Object.defineProperty(TableSummary.prototype, "name", { + get: function () { + return this._tableInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "id", { + get: function () { + return this._tableInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "connectionId", { + get: function () { + return this._tableInfo.connectionId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "customSQL", { + get: function () { + return this._tableInfo.customSQL; + }, + enumerable: true, + configurable: true + }); + return TableSummary; +}()); +exports.TableSummary = TableSummary; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/TableauError.js": +/*!*******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/TableauError.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Custom error class that extends the default JavaScript Error object. + * This allows us to provide a field with a specific error code + * so that developers can more easily programmatically respond + * to error scenarios. + */ +var TableauError = /** @class */ (function (_super) { + __extends(TableauError, _super); + function TableauError(_errorCode, message) { + var _this = _super.call(this, _errorCode + ": " + message) || this; + _this._errorCode = _errorCode; + /*tslint:disable-next-line */ + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force + // the proto chain to be built correctly. See the github link above for details. + Object.setPrototypeOf(_this, TableauError.prototype); + return _this; + } + Object.defineProperty(TableauError.prototype, "errorCode", { + get: function () { + return this._errorCode; + }, + enumerable: true, + configurable: true + }); + return TableauError; +}(Error)); +exports.TableauError = TableauError; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js": +/*!*****************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***! + \*****************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over + * in the platform. + */ +var DataValueFactory = /** @class */ (function () { + function DataValueFactory() { + } + DataValueFactory.MakeParameterDataValue = function (internalDataValue, dataType) { + // Parameter values are all strings, convert from string to value + return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue); + }; + DataValueFactory.MakeFilterDataValue = function (internalDataValue) { + // Filters already have native type in value, just use that for nativeValue also + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); + }; + DataValueFactory.MakeTableDataValue = function (internalDataValue, dataType) { + // DataTables contain boolean | number | string | date as string | '%null% + // convertValueToNativeValue converts dates as string to dates, and any special to null + // (boolean, numbers, strings are passed through) + // Because of IncludeDataValuesOption - we can have undefined values, which are different than any special + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined + ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType) + : undefined, internalDataValue.formattedValue); + }; + return DataValueFactory; +}()); +exports.DataValueFactory = DataValueFactory; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js": +/*!**************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * This class converts from a source enum value to destination enum + * value given a mapping from source to destination when constructed. + * + * Note: This exact same class is defined in api-core. Given its small + * nature, it is not worth having in a separate project to share this between + * api-core and api-shared. If more utility functionality is added that is used by api-core + * and api-shared but has no other dependecies, a utiltity project might be merited, + * and this class could be moved. + */ +var EnumConverter = /** @class */ (function () { + function EnumConverter(_mappings, _defaultVal) { + this._mappings = _mappings; + this._defaultVal = _defaultVal; + } + EnumConverter.prototype.convert = function (enumVal, throwIfMissing) { + if (throwIfMissing === void 0) { throwIfMissing = ShouldThrow.Yes; } + if (this._mappings.hasOwnProperty(enumVal)) { + return this._mappings[enumVal]; + } + if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { + return this._defaultVal; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Enum Mapping not found for: " + enumVal); + }; + return EnumConverter; +}()); +exports.EnumConverter = EnumConverter; +var ShouldThrow; +(function (ShouldThrow) { + ShouldThrow["Yes"] = "yes"; + ShouldThrow["No"] = "no"; +})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {})); + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": +/*!*************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var Param_1 = __webpack_require__(/*! ./Param */ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * This class is used to construct common errors throughout the external + * projects (api-shared, extensions-api, etc.). It has some duplication with + * the ErrorHelpers class in api-core, but is separate due to the need to throw + * an external TableauError vs. an InternalTableauError. + */ +var ErrorHelpers = /** @class */ (function () { + function ErrorHelpers() { + } + /** + * Throws with code InternalError. + * + * @param apiName name of api that was called. + */ + ErrorHelpers.apiNotImplemented = function (apiName) { + return new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, apiName + " API not yet implemented."); + }; + /** + * Throws an internal error if argument is null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyInternalValue = function (argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, argumentValue + " is invalid value for: " + argumentName); + } + }; + /** + * Throws an InvalidParameter error if argument is null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyParameter = function (argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, argumentValue + " is invalid value for parameter: " + argumentName); + } + }; + /** + * Throws an InvalidParameter error if argument is not the specified type. + * For objects, it just tests that it is an object + * + * @param argumentValue value to verify + * @param expectedType expected result of typeof + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyParameterType = function (argumentValue, expectedType, argumentName) { + if (typeof (argumentValue) !== expectedType) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, argumentValue + " has invalid type for parameter: " + argumentName + "."); + } + }; + /** + * Throws an InvalidParameter error if argument is empty string, null or undefined. + * + * @param argumentValue value to verify + * @param argumentName name of argument to verify + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyStringParameter = function (argumentValue, argumentName) { + if (argumentValue === null || argumentValue === undefined || argumentValue === '') { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, argumentValue + " is invalid value for paramter: " + argumentName); + } + }; + /** + * Verifies passed value is a valid value for that enum. + * Throws an InvalidParameter error if the enum value is not valid. + * + * String enums are {string : string} dictionaries which are not reverse mappable + * This is an ugly workaround + * + * @param enumValue value to verify + * @param enumType enum to verify against + * @param enumName enum name for clear error message + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyEnumValue = function (enumValue, enumType, enumName) { + var isValid = false; + Object.keys(enumType).forEach(function (enumKey) { + if (enumType[enumKey] === enumValue.toString()) { + isValid = true; + } + }); + if (!isValid) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, enumValue + " is invalid value for enum: " + enumName + "."); + } + }; + /** + * Verifies the params min and max for applying range filter. + * Throws with error code InvalidParameter if range is invalid. + * + * @param min range min + * @param max range max + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyRangeParamType = function (min, max) { + if (!min && !max) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Unexpected invalid param value, at least one of min or max is required.'); + } + if (min && !Param_1.Param.isTypeNumber(min) && !Param_1.Param.isTypeDate(min)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter min.'); + } + if (max && !Param_1.Param.isTypeNumber(max) && !Param_1.Param.isTypeDate(max)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter max.'); + } + if (min && max && typeof (min) !== typeof (max)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Unexpected invalid param value, parameters min and max should be of the same type.'); + } + }; + /** + * Verifies that the zoneId is present in the current dashboard. + * Throws with error code InvalidParameter if either condition is false. + * + * @param dashboardObjects An array of all DashboardObjects in the current dashboard + * @param zoneID ZoneId to be validated + */ + ErrorHelpers.verifyZoneIsValid = function (dashboardObjects, zoneID) { + var isValid = dashboardObjects.some(function (dashboardObject) { + return dashboardObject.id === zoneID; + }); + if (!isValid) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Unexpected invalid param value, Zone Id: " + zoneID + " is not present in dashboard."); + } + }; + return ErrorHelpers; +}()); +exports.ErrorHelpers = ErrorHelpers; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Utils/Param.js": +/*!******************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Utils/Param.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param = /** @class */ (function () { + function Param() { + } + /** + * serializes the date into the format that the server expects. + * @param date the date to serialize + */ + Param.serializeDateForPlatform = function (date) { + var year = date.getUTCFullYear(); + var month = date.getUTCMonth() + 1; + var day = date.getUTCDate(); + var hh = date.getUTCHours(); + var mm = date.getUTCMinutes(); + var sec = date.getUTCSeconds(); + return year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; + }; + Param.serializeBooleanForPlatform = function (bool) { + return bool ? 'true' : 'false'; + }; + Param.serializeNumberForPlatform = function (num) { + return num.toString(10); + }; + /** + * Verifies the input is a number + */ + /* tslint:disable:no-any */ + Param.isTypeNumber = function (input) { + return typeof (input) === 'number' || input instanceof Number; + }; + /* tslint:enable:no-any */ + /** + * Verifies the input is a Date + */ + /* tslint:disable:no-any */ + Param.isTypeDate = function (input) { + return input instanceof Date; + }; + /* tslint:enable:no-any */ + /* tslint:disable-next-line:no-any */ + Param.isTypeString = function (input) { + return typeof (input) === 'string' || input instanceof String; + }; + /* tslint:disable-next-line:no-any */ + Param.isTypeBool = function (input) { + return typeof (input) === 'boolean' || input instanceof Boolean; + }; + /* tslint:disable-next-line:no-any */ + Param.serializeParameterValue = function (value) { + if (Param.isTypeNumber(value)) { + return Param.serializeNumberForPlatform(value); + } + else if (Param.isTypeDate(value)) { + return Param.serializeDateForPlatform(value); + } + else if (Param.isTypeBool(value)) { + return Param.serializeBooleanForPlatform(value); + } + else if (Param.isTypeString(value)) { + return value; + } + else { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Unexpected invalid value for: " + value); + } + }; + /** + * Verifies that the parameter is already a Map, or converts an object to a Map. + * If the parameter is an object, we convert it to a Map using Object.entries. + * @throws if the parameter is not an object or Map + */ + // tslint:disable-next-line:no-any + Param.convertParameterToMap = function (param, paramName) { + ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName); + if (Array.isArray(param)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Expecting object or Map for: " + paramName + "."); + } + return param instanceof Map ? param : new Map(Object.entries(param)); + }; + return Param; +}()); +exports.Param = Param; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/VersionNumber.js": +/*!********************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/VersionNumber.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Represents the current version of the extensions library + * and extensions-api-types library + */ +var VersionNumber = /** @class */ (function () { + // private constructor so everyone uses the singleton instance + // build numbers have this form: M.m.f-pre.N + function VersionNumber(versionString, isAlpha) { + var partStr = versionString.split('-'); + this.build = this.getBuildNumber(partStr[1]); + versionString = partStr[0]; + var parts = versionString.split('.').map(function (p) { return parseInt(p, 10); }); + if (parts.length !== 3) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Invalid version number: " + versionString); + } + this.major = parts[0]; + this.minor = parts[1]; + this.fix = parts[2]; + this.isAlpha = isAlpha; + } + VersionNumber.prototype.getBuildNumber = function (preReleaseString) { + var noBuildNumber = -1; + if (!preReleaseString) { + return noBuildNumber; + } + // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' + var partStr = preReleaseString.split('.'); + return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; + }; + Object.defineProperty(VersionNumber.prototype, "formattedValue", { + get: function () { + return this.major + "." + this.minor + "." + this.fix; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(VersionNumber.prototype, "fullFormattedValue", { + get: function () { + return this.major + "." + this.minor + "." + this.fix + "-pre." + this.build; + }, + enumerable: true, + configurable: true + }); + return VersionNumber; +}()); +exports.VersionNumber = VersionNumber; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/ApiShared/Worksheet.js": +/*!****************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/ApiShared/Worksheet.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Sheet_1 = __webpack_require__(/*! ./Sheet */ "../../api-shared-js/lib/src/ApiShared/Sheet.js"); +var Worksheet = /** @class */ (function (_super) { + __extends(Worksheet, _super); + function Worksheet(_worksheetImpl) { + var _this = _super.call(this, _worksheetImpl) || this; + _this._worksheetImpl = _worksheetImpl; + // Call to initialize events and then call down to the event listener manager to handle things + _this._worksheetImpl.initializeEvents(_this).forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Worksheet.prototype, "parentDashboard", { + get: function () { + return this._worksheetImpl.parentDashboard; + }, + enumerable: true, + configurable: true + }); + Worksheet.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); + }; + Worksheet.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) { + return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); + }; + Worksheet.prototype.clearFilterAsync = function (fieldName) { + return this._worksheetImpl.clearFilterAsync(fieldName); + }; + Worksheet.prototype.getDataSourcesAsync = function () { + return this._worksheetImpl.getDataSourcesAsync(); + }; + Worksheet.prototype.getFiltersAsync = function () { + return this._worksheetImpl.getFiltersAsync(); + }; + Worksheet.prototype.getSelectedMarksAsync = function () { + return this._worksheetImpl.getSelectedMarksAsync(); + }; + Worksheet.prototype.getHighlightedMarksAsync = function () { + return this._worksheetImpl.getHighlightedMarksAsync(); + }; + Worksheet.prototype.getSummaryDataAsync = function (options) { + return this._worksheetImpl.getSummaryDataAsync(options); + }; + Worksheet.prototype.getSummaryColumnsInfoAsync = function () { + return this._worksheetImpl.getSummaryColumnsInfoAsync(); + }; + Worksheet.prototype.getUnderlyingDataAsync = function (options) { + console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + + 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); + return this._worksheetImpl.getUnderlyingDataAsync(options); + }; + Worksheet.prototype.getUnderlyingTablesAsync = function () { + return this._worksheetImpl.getUnderlyingTablesAsync(); + }; + Worksheet.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); + }; + Worksheet.prototype.clearSelectedMarksAsync = function () { + return this._worksheetImpl.clearSelectedMarksAsync(); + }; + Worksheet.prototype.selectMarksByIDAsync = function (marksInfo, updateType) { + return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); + }; + Worksheet.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); + }; + Worksheet.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); + }; + return Worksheet; +}(Sheet_1.Sheet)); +exports.Worksheet = Worksheet; + + +/***/ }), + +/***/ "../../api-shared-js/lib/src/VersionedExternalApiDispatcher.js": +/*!***************************************************************************************************************************!*\ + !*** /builds/extensibility/extensions-and-embedding-api/packages/api-shared-js/lib/src/VersionedExternalApiDispatcher.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input + * internal contract to the version that this module is built against + * + * @class VersionedExternalApiDispatcher + * @implements {InternalApiDispatcher} + */ +var VersionedExternalApiDispatcher = /** @class */ (function () { + /** + * Creates a new instance of the VersionedExternalApiDispatcher + * We have multiple version converting dispatchers that work together. + * If needed, the VersionedExternalApiDispatcher wraps either the InternalApiDispatcher (desktop) + * or the CrossFrameDispatcher (server). + * The Internal/CrossFrame dispatchers handle an updated platform with an older external library. + * (The CrossFrameDispatcher sends messages across the frame, and it is handled by the PresLayerHandler.) + * Meanwhile, the VersionedExternalApiDispatcher handles an updated external library with an older platform. + + * @param _apiDelegateDispatcher The delegate that does the actual work. + * @param platformVersionNumber The version of the internal contract which the platform module is using. + * This number will be used to figure out how to downgrade incoming commands and upgrade the results + */ + function VersionedExternalApiDispatcher(_apiDelegateDispatcher, platformVersionNumber) { + var _this = this; + this._apiDelegateDispatcher = _apiDelegateDispatcher; + this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); + this._notificationHandlers = []; + _apiDelegateDispatcher.registerNotificationHandler(function (notification) { + if (_this._notificationHandlers.length === 0) { + return; + } + var upgradedNotification = _this._versionConverter.upgradeNotification(notification); + _this._notificationHandlers.forEach(function (handler) { + handler(upgradedNotification); + }); + }); + } + VersionedExternalApiDispatcher.needsVersionConverter = function (platformVersion) { + // If our platform is less than external library version, then we need a converter + return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + }; + VersionedExternalApiDispatcher.prototype.execute = function (verb, parameters) { + var _this = this; + try { + var downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); + return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then(function (response) { + var upgradeResponse = _this._versionConverter.upgradeExecuteReturn(response, verb, parameters); + return upgradeResponse; + }); + } + catch (e) { + return Promise.reject(e); + } + }; + VersionedExternalApiDispatcher.prototype.registerNotificationHandler = function (handler) { + this._notificationHandlers.push(handler); + }; + VersionedExternalApiDispatcher.prototype.unregisterNotificationHandler = function (handler) { + this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); + }; + return VersionedExternalApiDispatcher; +}()); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi.js": +/*!***********************************!*\ + !*** ../lib/src/ExtensionsApi.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +// The following polyfills are needed for IE11 +__webpack_require__(/*! core-js/es/promise */ "../../../node_modules/core-js/es/promise/index.js"); +__webpack_require__(/*! core-js/es/map */ "../../../node_modules/core-js/es/map/index.js"); +__webpack_require__(/*! core-js/es/array/find */ "../../../node_modules/core-js/es/array/find.js"); +__webpack_require__(/*! core-js/es/array/from */ "../../../node_modules/core-js/es/array/from.js"); +__webpack_require__(/*! core-js/es/object/assign */ "../../../node_modules/core-js/es/object/assign.js"); +__webpack_require__(/*! core-js/es/object/entries */ "../../../node_modules/core-js/es/object/entries.js"); +__webpack_require__(/*! core-js/es/object/set-prototype-of */ "../../../node_modules/core-js/es/object/set-prototype-of.js"); +__webpack_require__(/*! core-js/es/number/is-nan */ "../../../node_modules/core-js/es/number/is-nan.js"); +__webpack_require__(/*! core-js/es/number/is-integer */ "../../../node_modules/core-js/es/number/is-integer.js"); +__webpack_require__(/*! core-js/es/number/parse-int */ "../../../node_modules/core-js/es/number/parse-int.js"); +__webpack_require__(/*! core-js/es/number/parse-float */ "../../../node_modules/core-js/es/number/parse-float.js"); +// Due to the way we configured webpack, we should be exporting things which will be under +// a global variable called "tableau". Export everything we want to be visible under tableau +// from this file. +var ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "../lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); +var Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "../lib/src/ExtensionsApi/Namespaces/Extensions.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var isAlpha = typeof EXTENSION_VERSION_IS_ALPHA !== 'undefined' ? EXTENSION_VERSION_IS_ALPHA : false; +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.5.0-pre.28" : undefined, isAlpha); +var extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); +exports.extensions = new Extensions_1.Extensions(extensionImpl); +// Export Enums +// These show up under the tableau object. I.e. tableau.ExtensionContext.Server +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +exports.ExtensionContext = api_external_contract_js_1.ExtensionContext; +exports.ExtensionMode = api_external_contract_js_1.ExtensionMode; +exports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType; +exports.ColumnType = api_external_contract_js_1.ColumnType; +exports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType; +exports.DataType = api_external_contract_js_1.DataType; +exports.DateRangeType = api_external_contract_js_1.DateRangeType; +exports.EncodingType = api_external_contract_js_1.EncodingType; +exports.ErrorCodes = api_external_contract_js_1.ErrorCodes; +exports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType; +exports.FieldRoleType = api_external_contract_js_1.FieldRoleType; +exports.FilterDomainType = api_external_contract_js_1.FilterDomainType; +exports.FilterType = api_external_contract_js_1.FilterType; +exports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType; +exports.FilterNullOption = api_external_contract_js_1.FilterNullOption; +exports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption; +exports.MarkType = api_external_contract_js_1.MarkType; +exports.ParameterValueType = api_external_contract_js_1.ParameterValueType; +exports.PeriodType = api_external_contract_js_1.PeriodType; +exports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType; +exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; +exports.SheetType = api_external_contract_js_1.SheetType; +exports.SortDirection = api_external_contract_js_1.SortDirection; +exports.TableauEventType = api_external_contract_js_1.TableauEventType; +exports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType; +exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Impl/ExtensionsImpl.js": +/*!*******************************************************!*\ + !*** ../lib/src/ExtensionsApi/Impl/ExtensionsImpl.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "../lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); +var Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "../lib/src/ExtensionsApi/Namespaces/Environment.js"); +var RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "../lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); +var Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "../lib/src/ExtensionsApi/Namespaces/Settings.js"); +var SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "../lib/src/ExtensionsApi/Impl/SettingsImpl.js"); +var api_shared_js_2 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "../lib/src/ExtensionsApi/Namespaces/UI.js"); +var UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "../lib/src/ExtensionsApi/Impl/UIImpl.js"); +var api_shared_js_3 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var api_shared_js_4 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "../lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); +var ExtensionsImpl = /** @class */ (function () { + function ExtensionsImpl() { + } + ExtensionsImpl.prototype.initializeAsync = function (isExtensionDialog, contextMenuCallbacks) { + var _this = this; + if (!this._initializationPromise) { + this._initializationPromise = new Promise(function (resolve, reject) { + var initOptions = { isAlpha: api_shared_js_3.ApiVersion.Instance.isAlpha }; + // First thing we want to do is check to see if there is a desktop dispatcher already registered for us + if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { + // Running in a pre-2019.3 desktop, use our legacy dispatcher promise + var desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); + desktopDispatcherPromise.then(function (dispatcherFactory) { + return _this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks); + }) + .then(function (openPayload) { + resolve(openPayload); + }).catch(function (error) { + reject(error); + }); + } + else { + // We must be running in server, so we should try to kick of the server dispatcher bootstrapping + var onDispatcherReceivedCallback_1 = _this.onDispatcherReceived.bind(_this); + api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions).then(function (factory) { + return onDispatcherReceivedCallback_1(factory, isExtensionDialog, contextMenuCallbacks); + }).then(function (openPayload) { + resolve(openPayload); + }).catch(function (error) { + reject(error); + }); + } + }); + } + return this._initializationPromise; + }; + ExtensionsImpl.prototype.onDispatcherReceived = function (dispatcherFactory, isExtensionDialog, contextMenuFunctions) { + var _this = this; + var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + // Call to register all the services which will use the newly initialized dispatcher + RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); + // Get the initialization service and initialize this extension + var initializationService = api_shared_js_1.ApiServiceRegistry.instance.getService("InitializationService" /* InitializationService */); + var callbackMapKeys = (contextMenuFunctions) ? Object.keys(contextMenuFunctions) : []; + return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then(function (result) { + if (!result.extensionInstance.locator.dashboardPath) { + throw new api_shared_js_2.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); + } + // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and + // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 + var platformVersion = result.extensionEnvironment.platformVersion + ? result.extensionEnvironment.platformVersion + : { major: 1, minor: 9, fix: 0 }; + // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform. + if (api_shared_js_4.VersionedExternalApiDispatcher.needsVersionConverter(platformVersion)) { + dispatcher = new api_shared_js_4.VersionedExternalApiDispatcher(dispatcher, platformVersion); + } + // Registration of services must happen before initializing content and environment + api_shared_js_1.registerAllSharedServices(dispatcher, platformVersion); + RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); + _this.dashboardContent = _this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); + _this.environment = new Environment_1.Environment(result.extensionEnvironment); + _this.settings = _this.initializeSettings(result.extensionSettingsInfo); + _this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); + // After initialization has completed, setup listeners for the callback functions that + // are meant to be triggered whenever a context menu item is clicked. + _this.initializeContextMenuCallbacks(contextMenuFunctions); + // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the + // developer, we just ingore that string. In the case of initializing from an extension dialog, this string + // is an optional payload sent from the parent extension. + return result.extensionDialogPayload; + }); + }; + ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) { + var dashboardImpl = new api_shared_js_1.DashboardImpl(info, sheetPath); + var dashboard = new api_shared_js_1.Dashboard(dashboardImpl); + return new DashboardContent_1.DashboardContent(dashboard); + }; + ExtensionsImpl.prototype.initializeSettings = function (settingsInfo) { + var settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); + return new Settings_1.Settings(settingsImpl); + }; + ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) { + var notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, function (model) { + // Let through any context menu event, these are already filtered on api-core + // based on the extension locator. + return true; + }, function (event) { + // Execute the function associated with this context menu ID + if (contextMenuFunctions) { + if (!contextMenuFunctions[event.id]) { + throw new api_shared_js_2.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Received unexpected context menu Id from event: " + event.id); + } + contextMenuFunctions[event.id](); + } + }); + }; + return ExtensionsImpl; +}()); +exports.ExtensionsImpl = ExtensionsImpl; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js": +/*!**************************************************************************!*\ + !*** ../lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. + * It supports running a newer external library against a pre 2019.3 desktop. + * Starting in 2019.3, we have a merged bootstrap style for both desktop and server. + * In addition, the alpha checking that is happening here is not necessary in external-api-js + * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts) + * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to + * tableau beta release versions. + * @deprecated + */ +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) { + // tslint:disable-next-line:no-console + console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.'); + window.__warningIssued = true; + } + else if (options && options.isAlpha && window.__platformIsOfficialRelease) { + window.__tableauDesktopDispatcher.then(function (dispatcherFactory) { + var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); + }).catch(); + } + // this will be undefined if promise is rejected or throws + return window.__tableauDesktopDispatcher; + } + LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise; + /** + * @param options + */ + function hasDesktopApiDispatcherPromise(options) { + return !!getDesktopDispatcherPromise(options); + } + LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise; +})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {})); + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Impl/SettingsImpl.js": +/*!*****************************************************!*\ + !*** ../lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var SettingsChangedEvent = /** @class */ (function (_super) { + __extends(SettingsChangedEvent, _super); + function SettingsChangedEvent(_newSettings) { + var _this = _super.call(this, api_external_contract_js_1.TableauEventType.SettingsChanged) || this; + _this._newSettings = _newSettings; + return _this; + } + Object.defineProperty(SettingsChangedEvent.prototype, "newSettings", { + get: function () { + return this._newSettings; + }, + enumerable: true, + configurable: true + }); + return SettingsChangedEvent; +}(api_shared_js_1.TableauEvent)); +var SettingsImpl = /** @class */ (function () { + function SettingsImpl(settingsInfo) { + // Since promises can't be introspected for state, keep a variable that + // indicates a save is in progress, so that set/erase can't be called during a save. + this._saveInProgress = false; + this.initializeSettings(settingsInfo); + } + SettingsImpl.prototype.erase = function (key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + // Only make a modification if we have the key already + if (this._currentSettings[key]) { + this.verifySettingsAreUnlocked(); + delete this._currentSettings[key]; + this._isModified = true; + } + }; + SettingsImpl.prototype.get = function (key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + return this._currentSettings[key]; + }; + SettingsImpl.prototype.getAll = function () { + // Returns a mutable copy of the settings + return Object.assign({}, this._currentSettings); + }; + Object.defineProperty(SettingsImpl.prototype, "isModified", { + get: function () { + return this._isModified; + }, + enumerable: true, + configurable: true + }); + SettingsImpl.prototype.saveAsync = function () { + var _this = this; + this.verifySettingsAreUnlocked(); + // Just resolve immediately if settings are unchanged + if (!this._isModified) { + return Promise.resolve(this._currentSettings); + } + this._saveInProgress = true; + // Use the settings service to save settings to twb + var settingsService = api_shared_js_1.ApiServiceRegistry.instance.getService("SettingsService" /* SettingsService */); + return settingsService.saveSettingsAsync(this._currentSettings).then(function (newSettings) { + _this._saveInProgress = false; + _this._isModified = false; + if (_this._currentSettings === undefined) { + _this._currentSettings = newSettings; + } + else { + Object.assign(_this._currentSettings, newSettings); + } + return newSettings; + }, function (reason) { + _this._saveInProgress = false; + return Promise.reject(reason); + }); + }; + SettingsImpl.prototype.set = function (key, value) { + api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. + api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. + this.verifySettingsAreUnlocked(); + this._currentSettings[key] = value; + this._isModified = true; + }; + /** + * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + SettingsImpl.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + var notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + var settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SettingsChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, function (model) { + return true; + }, function (event) { + _this._currentSettings = event.newSettings; + settingsChangedEvent.triggerEvent(function () { return new SettingsChangedEvent(event.newSettings); }); + }); + results.push(settingsChangedEvent); + return results; + }; + SettingsImpl.prototype.initializeSettings = function (settingsInfo) { + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); + this._currentSettings = settingsInfo.settingsValues; + // Reset the isModified flag + this._isModified = false; + }; + /** + * This helper should be called before any local update to this.currentSettings. + * Checks if a current save call is still in progress and throws an error if so. + */ + SettingsImpl.prototype.verifySettingsAreUnlocked = function () { + if (this._saveInProgress) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); + } + }; + SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; + return SettingsImpl; +}()); +exports.SettingsImpl = SettingsImpl; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Impl/UIImpl.js": +/*!***********************************************!*\ + !*** ../lib/src/ExtensionsApi/Impl/UIImpl.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var UIImpl = /** @class */ (function () { + function UIImpl() { + } + UIImpl.prototype.displayDialogAsync = function (url, payload, options) { + var uiService = api_shared_js_1.ApiServiceRegistry.instance.getService("UIService" /* UIService */); + var notificationService = api_shared_js_1.ApiServiceRegistry.instance.getService("notification-service" /* Notification */); + return new Promise(function (resolve, reject) { + uiService.displayDialogAsync(url, payload || '', options).then(function () { + var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function (model) { + return true; // Let through any dialog update event + }, function (event) { + if (event.isCloseEvent) { + resolve(event.closePayload); + } + else { + reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.')); + } + unregisterFn(); + }); + }).catch(function (error) { + reject(error); + }); + }); + }; + UIImpl.prototype.closeDialog = function (payload) { + var uiService = api_shared_js_1.ApiServiceRegistry.instance.getService("UIService" /* UIService */); + uiService.closeDialog(payload); + }; + return UIImpl; +}()); +exports.UIImpl = UIImpl; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Namespaces/DashboardContent.js": +/*!***************************************************************!*\ + !*** ../lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of the external DashboardContent namespace. + * This does not follow the Impl pattern as DashboardContent is + * currently just a (single) property bag. + */ +var DashboardContent = /** @class */ (function () { + function DashboardContent(_dashboard) { + this._dashboard = _dashboard; + } + Object.defineProperty(DashboardContent.prototype, "dashboard", { + get: function () { + return this._dashboard; + }, + enumerable: true, + configurable: true + }); + return DashboardContent; +}()); +exports.DashboardContent = DashboardContent; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Namespaces/Environment.js": +/*!**********************************************************!*\ + !*** ../lib/src/ExtensionsApi/Namespaces/Environment.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external environment namespace. + * Environment does not follow the Impl pattern as it is + * just a property bag. + */ +var Environment = /** @class */ (function () { + function Environment(extensionEnvironment) { + this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build) + this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext); + this._language = extensionEnvironment.extensionLanguage; + this._locale = extensionEnvironment.extensionLocale; + this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode); + this._operatingSystem = extensionEnvironment.operatingSystem; + this._tableauVersion = extensionEnvironment.tableauVersion; + } + Object.defineProperty(Environment.prototype, "apiVersion", { + get: function () { + return this._apiVersion; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "context", { + get: function () { + return this._context; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "language", { + get: function () { + return this._language; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "locale", { + get: function () { + return this._locale; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "mode", { + get: function () { + return this._mode; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "operatingSystem", { + get: function () { + return this._operatingSystem; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "tableauVersion", { + get: function () { + return this._tableauVersion; + }, + enumerable: true, + configurable: true + }); + return Environment; +}()); +exports.Environment = Environment; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Namespaces/Extensions.js": +/*!*********************************************************!*\ + !*** ../lib/src/ExtensionsApi/Namespaces/Extensions.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of the external Extensions namespace. + */ +var Extensions = /** @class */ (function () { + function Extensions(extensionImpl) { + this.extensionImpl = extensionImpl; + this.extensionImpl = extensionImpl; + } + Object.defineProperty(Extensions.prototype, "dashboardContent", { + get: function () { + return this.extensionImpl.dashboardContent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "environment", { + get: function () { + return this.extensionImpl.environment; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "settings", { + get: function () { + return this.extensionImpl.settings; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "ui", { + get: function () { + return this.extensionImpl.ui; + }, + enumerable: true, + configurable: true + }); + Extensions.prototype.initializeAsync = function (contextMenuCallbacks) { + return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); + }; + Extensions.prototype.initializeDialogAsync = function () { + return this.extensionImpl.initializeAsync(true); + }; + return Extensions; +}()); +exports.Extensions = Extensions; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Namespaces/Settings.js": +/*!*******************************************************!*\ + !*** ../lib/src/ExtensionsApi/Namespaces/Settings.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external settings namespace. + */ +var Settings = /** @class */ (function (_super) { + __extends(Settings, _super); + function Settings(_settingsImpl) { + var _this = _super.call(this) || this; + _this._settingsImpl = _settingsImpl; + // Initialize our event handling for this class + _this._settingsImpl.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Settings.prototype.erase = function (key) { + this._settingsImpl.erase(key); + }; + Settings.prototype.get = function (key) { + return this._settingsImpl.get(key); + }; + Settings.prototype.getAll = function () { + return this._settingsImpl.getAll(); + }; + Object.defineProperty(Settings.prototype, "isModified", { + get: function () { + return this._settingsImpl.isModified; + }, + enumerable: true, + configurable: true + }); + Settings.prototype.saveAsync = function () { + return this._settingsImpl.saveAsync(); + }; + Settings.prototype.set = function (key, value) { + this._settingsImpl.set(key, value); + }; + return Settings; +}(api_shared_js_1.EventListenerManager)); +exports.Settings = Settings; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Namespaces/UI.js": +/*!*************************************************!*\ + !*** ../lib/src/ExtensionsApi/Namespaces/UI.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Implementation of the external UI namespace. + */ +var UI = /** @class */ (function () { + function UI(_impl) { + this._impl = _impl; + } + UI.prototype.displayDialogAsync = function (url, payload, options) { + return this._impl.displayDialogAsync(url, payload, options); + }; + UI.prototype.closeDialog = function (payload) { + this._impl.closeDialog(payload); + }; + return UI; +}()); +exports.UI = UI; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InitializationServiceImpl = /** @class */ (function (_super) { + __extends(InitializationServiceImpl, _super); + function InitializationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(InitializationServiceImpl.prototype, "serviceName", { + get: function () { + return "InitializationService" /* InitializationService */; + }, + enumerable: true, + configurable: true + }); + InitializationServiceImpl.prototype.initializeDashboardExtensionsAsync = function (isExtensionDialog, contextMenuIds) { + var _a; + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds] = contextMenuIds, + _a[api_internal_contract_js_1.ParameterId.IsExtensionDialog] = isExtensionDialog, + _a); + return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then(function (response) { + // TODO - Validate return value + var result = response.result; + return result; + }); + }; + return InitializationServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.InitializationServiceImpl = InitializationServiceImpl; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": +/*!*********************************************************************!*\ + !*** ../lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_2 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var SettingsServiceImpl = /** @class */ (function (_super) { + __extends(SettingsServiceImpl, _super); + function SettingsServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SettingsServiceImpl.prototype, "serviceName", { + get: function () { + return "SettingsService" /* SettingsService */; + }, + enumerable: true, + configurable: true + }); + SettingsServiceImpl.prototype.saveSettingsAsync = function (settings) { + var _a; + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.SettingsValues] = settings, _a); + return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then(function (value) { + var result = value.result; + if (!result || !result.settingsValues) { + throw new api_shared_js_2.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); + } + return (result.settingsValues); + }); + }; + return SettingsServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.SettingsServiceImpl = SettingsServiceImpl; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": +/*!***************************************************************!*\ + !*** ../lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var DEFAULT_DIALOG_HEIGHT = 400; // in pixels +var DEFAULT_DIALOG_WIDTH = 600; // in pixels +var UIServiceImpl = /** @class */ (function (_super) { + __extends(UIServiceImpl, _super); + function UIServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(UIServiceImpl.prototype, "serviceName", { + get: function () { + return "UIService" /* UIService */; + }, + enumerable: true, + configurable: true + }); + UIServiceImpl.prototype.displayDialogAsync = function (url, payload, options) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = url, + _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload, + _a); + var h = ((options) && (options.height)) ? options.height : DEFAULT_DIALOG_HEIGHT; + var w = ((options) && (options.width)) ? options.width : DEFAULT_DIALOG_WIDTH; + // On the platform side, we do something reasonable regardess of whether the passed + // height and width are too large or too small. But this likely indicates a developer error, + // so we throw an error here to help with debugging. + if (h <= 0 || w <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Size parameters for displayDialogAsync must be positive'); + } + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogH] = h; + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w; + return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then(function (response) { + var dialogResult = response.result; + switch (dialogResult) { + case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.'); + case api_internal_contract_js_1.ExtensionDialogResult.InvalidDomain: + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidDomainDialog, 'The url of an extension dialog must match the domain of the parent extension.'); + default: // Success case + return; + } + }); + }; + UIServiceImpl.prototype.closeDialog = function (payload) { + var _a; + var parameters = (payload) ? (_a = {}, _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload, _a) : {}; + return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(function (response) { + return; + }); + }; + return UIServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.UIServiceImpl = UIServiceImpl; + + +/***/ }), + +/***/ "../lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js": +/*!**************************************************************************!*\ + !*** ../lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../../api-shared-js/lib/src/ApiShared.js"); +var InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "../lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); +var SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "../lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); +var UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "../lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); +function registerAllExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.instance.registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher)); + api_shared_js_1.ApiServiceRegistry.instance.registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher)); +} +exports.registerAllExtensionsServices = registerAllExtensionsServices; +function registerInitializationExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.instance.registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher)); +} +exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices; + + +/***/ }), + +/***/ "../node_modules/webpack/buildin/global.js": +/*!*************************************************!*\ + !*** ../node_modules/webpack/buildin/global.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly9idWlsZHMvZXh0ZW5zaWJpbGl0eS9leHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvL2J1aWxkcy9leHRlbnNpYmlsaXR5L2V4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8vYnVpbGRzL2V4dGVuc2liaWxpdHkvZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaS9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZXJuYWxDb250cmFjdC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9zcmMvU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvY29udHJhY3QvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvY29udHJhY3QvTm90aWZpY2F0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9jb250cmFjdC9QYXJhbWV0ZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL2NvbnRyYWN0L1ZlcmJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL21lc3NhZ2luZy9NZXNzYWdlVHlwZUNoZWNrcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL0FwaVNoYXJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvQXBpVmVyc2lvbi50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZUJvb3RzdHJhcC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9EYXNoYm9hcmRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0RhdGFTb3VyY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9FdmVudHMvTWFya3NTZWxlY3RlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9FdmVudHMvUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9FdmVudHMvVGFibGVhdVNoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0V2ZW50cy9UYWJsZWF1V29ya3NoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ZpZWxkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvRmllbGRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW5mb0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL0ltcGwvU2luZ2xlRXZlbnRNYW5hZ2VySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvSW1wbC9Xb3Jrc2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Mb2dpY2FsVGFibGUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL01vZGVscy9HZXREYXRhTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9QYXJhbWV0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0RhdGFTb3VyY2VTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9HZXREYXRhU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9ab25lU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9TaXplLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9UYWJsZVN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi9zcmMvQXBpU2hhcmVkL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvRW51bUNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVXRpbHMvRXJyb3JIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0FwaVNoYXJlZC9VdGlscy9QYXJhbS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uL3NyYy9BcGlTaGFyZWQvV29ya3NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vc3JjL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL3NyYy9FeHRlbnNpb25zQXBpLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9TZXR0aW5nc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1VJSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRW52aXJvbm1lbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi8uLi8uLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1NldHRpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vLi4vLi4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9VSS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvVUlTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uLy4uLy4uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFD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RyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxLQUFLLElBQUcsK0NBQTRCLENBQUMsS0FBSztRQUN4RSxHQUFDLCtDQUE0QixDQUFDLE1BQU0sSUFBRywrQ0FBNEIsQ0FBQyxNQUFNO1FBQzFFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxHQUFHLElBQUcsK0NBQTRCLENBQUMsR0FBRztRQUNwRSxHQUFDLCtDQUE0QixDQUFDLElBQUksSUFBRywrQ0FBNEIsQ0FBQyxJQUFJO1FBQ3RFLEdBQUMsK0NBQTRCLENBQUMsS0FBSyxJQUFHLCtDQUE0QixDQUFDLEtBQUs7UUFDeEUsR0FBQywrQ0FBNEIsQ0FBQyxRQUFRLElBQUcsK0NBQTRCLENBQUMsUUFBUTtRQUM5RSxHQUFDLCtDQUE0QixDQUFDLEdBQUcsSUFBRywrQ0FBNEIsQ0FBQyxHQUFHO1FBQ3BFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxNQUFNLElBQUcsK0NBQTRCLENBQUMsTUFBTTtRQUMxRSxHQUFDLCtDQUE0QixDQUFDLEdBQUcsSUFBRywrQ0FBNEIsQ0FBQyxHQUFHO1FBQ3BFLEdBQUMsK0NBQTRCLENBQUMsTUFBTSxJQUFHLCtDQUE0QixDQUFDLE1BQU07UUFDMUUsR0FBQywrQ0FBNEIsQ0FBQyxTQUFTLElBQUcsK0NBQTRCLENBQUMsU0FBUztRQUNoRixHQUFDLCtDQUE0QixDQUFDLElBQUksSUFBRywrQ0FBNEIsQ0FBQyxJQUFJO1FBQ3RFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxNQUFNLElBQUcsK0NBQTRCLENBQUMsTUFBTTtRQUMxRSxHQUFDLCtDQUE0QixDQUFDLE1BQU0sSUFBRywrQ0FBNEIsQ0FBQyxNQUFNO1FBQzFFLEdBQUMsK0NBQTRCLENBQUMsTUFB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Q0FBQyxXQUFHLEdBQUMsc0NBQVcsQ0FBQyxzQkFBc0IsSUFBRyxPQUFPLE1BQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV2RyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFRO1lBQy9ELE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDSCxvQkFBQztBQUFELENBQUMsQ0E3Q2tDLCtCQUFlLEdBNkNqRDtBQTdDWSxzQ0FBYTs7Ozs7Ozs7Ozs7Ozs7O0FDZjFCLG9IQUE0RDtBQUU1RCxxS0FBNkU7QUFDN0UsbUpBQWlFO0FBQ2pFLGlJQUFxRDtBQUVyRCxTQUFnQiw2QkFBNkIsQ0FBQyxVQUFpQztJQUM3RSxrQ0FBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUkseUNBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNqRixrQ0FBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksNkJBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFIRCxzRUFHQztBQUVELFNBQWdCLHdDQUF3QyxDQUFDLFVBQWlDO0lBQ3hGLGtDQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxxREFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFGRCw0RkFFQzs7Ozs7Ozs7Ozs7O0FDaEJEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QyIsImZpbGUiOiJ0YWJsZWF1LmV4dGVuc2lvbnMuMS41LjAtcHJlLjI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC1leHRlbnNpb25zL1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuLi9saWIvc3JjL0V4dGVuc2lvbnNBcGkuanNcIik7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnZmluZCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuZnJvbTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk1hcDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc0ludGVnZXI7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc05hTjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWZsb2F0Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIucGFyc2VGbG9hdDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLnBhcnNlSW50O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuYXNzaWduO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmVudHJpZXM7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFueScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhpdCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxudmFyIFVOU0NPUEFCTEVTID0gd2VsbEtub3duU3ltYm9sKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmlmIChBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSB7XG4gIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoQXJyYXlQcm90b3R5cGUsIFVOU0NPUEFCTEVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBjcmVhdGUobnVsbClcbiAgfSk7XG59XG5cbi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgJyArIChuYW1lID8gbmFtZSArICcgJyA6ICcnKSArICdpbnZvY2F0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyYXRvck1ldGhvZCkpKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IG5ldyBDKCk7XG4gICAgZm9yICg7IShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4LCBmaWx0ZXJPdXQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgSVNfRklMVEVSX09VVCA9IFRZUEUgPT0gNztcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9PVVQgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlck91dFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyT3V0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlck91dDogY3JlYXRlTWV0aG9kKDcpXG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBuby10aHJvdy1saXRlcmFsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDtcbiAgICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7XG4gICAgICAgICAgaW5kZXg6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXMgPSBzdGF0ZS5sYXN0LFxuICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZW1vdmVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXN0YXRlLmZpcnN0KSBzdGF0ZS5maXJzdCA9IGVudHJ5O1xuICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplKys7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplKys7XG4gICAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09ICdGJykgc3RhdGUuaW5kZXhbaW5kZXhdID0gZW50cnk7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgLy8gZmFzdCBjYXNlXG4gICAgICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gICAgICB2YXIgZW50cnk7XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTtcbiAgICAgIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7XG4gICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBkYXRhID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDtcbiAgICAgICAgICBpZiAoc3RhdGUubGFzdCA9PSBlbnRyeSkgc3RhdGUubGFzdCA9IHByZXY7XG4gICAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplLS07XG4gICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7XG4gIHZhciBJU19NQVAgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ01hcCcpICE9PSAtMTtcbiAgdmFyIElTX1dFQUsgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ1dlYWsnKSAhPT0gLTE7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7XG4gIHZhciBleHBvcnRlZCA9IHt9O1xuXG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7XG4gICAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdnZXQnID8gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICB2YXIgUkVQTEFDRSA9IGlzRm9yY2VkKFxuICAgIENPTlNUUlVDVE9SX05BTUUsXG4gICAgdHlwZW9mIE5hdGl2ZUNvbnN0cnVjdG9yICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpO1xuICAgIH0pKVxuICApO1xuXG4gIGlmIChSRVBMQUNFKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0ZvcmNlZChDT05TVFJVQ1RPUl9OQU1FLCB0cnVlKSkge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgIC8vIGVhcmx5IGltcGxlbWVudGF0aW9ucyBub3Qgc3VwcG9ydHMgY2hhaW5pbmdcbiAgICB2YXIgSEFTTlRfQ0hBSU5JTkcgPSBpbnN0YW5jZVtBRERFUl0oSVNfV0VBSyA/IHt9IDogLTAsIDEpICE9IGluc3RhbmNlO1xuICAgIC8vIFY4IH4gQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihpdGVyYWJsZSk7IH0pO1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGl0ZXJhYmxlKSB7XG4gICAgICAgIGFuSW5zdGFuY2UoZHVtbXksIENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IgfSwgZXhwb3J0ZWQpO1xuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7IH07XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3NvZihnbG9iYWwucHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3QodXNlckFnZW50KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ25hdmlnYXRvcicsICd1c2VyQWdlbnQnKSB8fCAnJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgdmVyc2lvbiA9IG1hdGNoWzBdICsgbWF0Y2hbMV07XG59IGVsc2UgaWYgKHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9IG1hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbiAmJiArdmVyc2lvbjtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9ELCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJpbmQoY2FsbCwgZ2xvYmFsW0NPTlNUUlVDVE9SXS5wcm90b3R5cGVbTUVUSE9EXSwgbGVuZ3RoKTtcbn07XG4iLCIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5ub1RhcmdldEdldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7XG4gIGlmIChHTE9CQUwpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMubm9UYXJnZXRHZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtcHJldmVudGV4dGVuc2lvbnMgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICdmdW5jdGlvbicgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aWVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG5cbi8vIG1ha2VzIHN1YmNsYXNzaW5nIHdvcmsgY29ycmVjdCBmb3Igd3JhcHBlZCBidWlsdC1pbnNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCR0aGlzLCBkdW1teSwgV3JhcHBlcikge1xuICB2YXIgTmV3VGFyZ2V0LCBOZXdUYXJnZXRQcm90b3R5cGU7XG4gIGlmIChcbiAgICAvLyBpdCBjYW4gd29yayBvbmx5IHdpdGggbmF0aXZlIGBzZXRQcm90b3R5cGVPZmBcbiAgICBzZXRQcm90b3R5cGVPZiAmJlxuICAgIC8vIHdlIGhhdmVuJ3QgY29tcGxldGVseSBjb3JyZWN0IHByZS1FUzYgd2F5IGZvciBnZXR0aW5nIGBuZXcudGFyZ2V0YCwgc28gdXNlIHRoaXNcbiAgICB0eXBlb2YgKE5ld1RhcmdldCA9IGR1bW15LmNvbnN0cnVjdG9yKSA9PSAnZnVuY3Rpb24nICYmXG4gICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmXG4gICAgaXNPYmplY3QoTmV3VGFyZ2V0UHJvdG90eXBlID0gTmV3VGFyZ2V0LnByb3RvdHlwZSkgJiZcbiAgICBOZXdUYXJnZXRQcm90b3R5cGUgIT09IFdyYXBwZXIucHJvdG90eXBlXG4gICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7XG4gIHJldHVybiAkdGhpcztcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAodHlwZW9mIHN0b3JlLmluc3BlY3RTb3VyY2UgIT0gJ2Z1bmN0aW9uJykge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsInZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xuXG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlIC0tIHNhZmVcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgZGVmaW5lUHJvcGVydHkoaXQsIE1FVEFEQVRBLCB7IHZhbHVlOiB7XG4gICAgb2JqZWN0SUQ6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcblxudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gYSBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDtcbn07XG5cbnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gdGhlIHN0b3JlIG9mIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTtcbn07XG5cbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWklORyAmJiBtZXRhLlJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFUVVJUkVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBvYmplY3RIYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCB1bmJvdW5kRnVuY3Rpb24sIG9wdGlvbnMpIHtcbiAgdmFyIHRoYXQgPSBvcHRpb25zICYmIG9wdGlvbnMudGhhdDtcbiAgdmFyIEFTX0VOVFJJRVMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuQVNfRU5UUklFUyk7XG4gIHZhciBJU19JVEVSQVRPUiA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19JVEVSQVRPUik7XG4gIHZhciBJTlRFUlJVUFRFRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JTlRFUlJVUFRFRCk7XG4gIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0LCAxICsgQVNfRU5UUklFUyArIElOVEVSUlVQVEVEKTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDtcblxuICB2YXIgc3RvcCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICBpZiAoaXRlcmF0b3IpIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIGNvbmRpdGlvbik7XG4gIH07XG5cbiAgdmFyIGNhbGxGbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChBU19FTlRSSUVTKSB7XG4gICAgICBhbk9iamVjdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZVswXSwgdmFsdWVbMV0sIHN0b3ApIDogZm4odmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICB9IHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTtcbiAgfTtcblxuICBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxGbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHtcbiAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgaWYgKHJldHVybk1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSkudmFsdWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLWFycmF5LXByb3RvdHlwZS1rZXlzIC0tIHNhZmUgKi9cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxudmFyIE5FV19JVEVSQVRPUl9QUk9UT1RZUEUgPSBJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuaWYgKCghSVNfUFVSRSB8fCBORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCcpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xuLy8gTm9kZS5qcyAxMSBzaG93cyBFeHBlcmltZW50YWxXYXJuaW5nIG9uIGdldHRpbmcgYHF1ZXVlTWljcm90YXNrYFxudmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcblxudmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghcXVldWVNaWNyb3Rhc2spIHtcbiAgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB0aGVuID0gcHJvbWlzZS50aGVuO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4uY2FsbChwcm9taXNlLCBmbHVzaCk7XG4gICAgfTtcbiAgLy8gTm9kZS5qcyB3aXRob3V0IHByb21pc2VzXG4gIH0gZWxzZSBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7XG4gIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgaWYgKCFoZWFkKSB7XG4gICAgaGVhZCA9IHRhc2s7XG4gICAgbm90aWZ5KCk7XG4gIH0gbGFzdCA9IHRhc2s7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuUHJvbWlzZTtcbiIsInZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiAhU3ltYm9sLnNoYW0gJiZcbiAgICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgKElTX05PREUgPyBWOF9WRVJTSU9OID09PSAzOCA6IFY4X1ZFUlNJT04gPiAzNyAmJiBWOF9WRVJTSU9OIDwgNDEpO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG5cbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHRyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciAkcGFyc2VGbG9hdCA9IGdsb2JhbC5wYXJzZUZsb2F0O1xudmFyIEZPUkNFRCA9IDEgLyAkcGFyc2VGbG9hdCh3aGl0ZXNwYWNlcyArICctMCcpICE9PSAtSW5maW5pdHk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKFN0cmluZyhzdHJpbmcpKTtcbiAgdmFyIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHRyaW1tZWRTdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHRyaW1tZWRTdHJpbmcuY2hhckF0KDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6ICRwYXJzZUZsb2F0O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsLnBhcnNlSW50O1xudmFyIGhleCA9IC9eWystXT8wW1h4XS87XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjI7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbShTdHJpbmcoc3RyaW5nKSk7XG4gIHJldHVybiAkcGFyc2VJbnQoUywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3QoUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IG9iamVjdEtleXMoUykuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUgKi9cbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0aWVzIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbi8vIGBPYmplY3QueyBlbnRyaWVzLCB2YWx1ZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUT19FTlRSSUVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7XG4gICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIHtcbiAgICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgc3RhdGU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICAgIH1cbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuIiwiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuIiwidmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuMTAuMScsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyBjb2RlUG9pbnRBdCwgYXQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChDT05WRVJUX1RPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBwb3MpIHtcbiAgICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgICB2YXIgZmlyc3QsIHNlY29uZDtcbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklORyA/IFMuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgMikgOiAoZmlyc3QgLSAweEQ4MDAgPDwgMTApICsgKHNlY29uZCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0XG4gIGNvZGVBdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuYXRgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0XG4gIGNoYXJBdDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyIHdoaXRlc3BhY2UgPSAnWycgKyB3aGl0ZXNwYWNlcyArICddJztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyB3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAod2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKiQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltLCB0cmltU3RhcnQsIHRyaW1FbmQsIHRyaW1MZWZ0LCB0cmltUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHtcbiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMgLS0gc3BlYyByZXF1aXJlbWVudFxuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiZcbiAgICAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiZcbiAgICBsb2NhdGlvbiAmJiBsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6JyAmJlxuICAgICFmYWlscyhwb3N0KVxuICApIHtcbiAgICBkZWZlciA9IHBvc3Q7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bihpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGNsZWFyOiBjbGVhclxufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGlucHV0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciB0ZXN0ID0ge307XG5cbnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIFN0cmluZyhrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpIHx8ICEoTkFUSVZFX1NZTUJPTCB8fCB0eXBlb2YgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID09ICdzdHJpbmcnKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgICB9XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCIvLyBhIHN0cmluZyBvZiBhbGwgdmFsaWQgdW5pY29kZSB3aGl0ZXNwYWNlc1xubW9kdWxlLmV4cG9ydHMgPSAnXFx1MDAwOVxcdTAwMEFcXHUwMDBCXFx1MDAwQ1xcdTAwMERcXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUyMDAwXFx1MjAwMVxcdTIwMDInICtcbiAgJ1xcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxudmFyICRBZ2dyZWdhdGVFcnJvciA9IGZ1bmN0aW9uIEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSkge1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIGlmICghKHRoYXQgaW5zdGFuY2VvZiAkQWdncmVnYXRlRXJyb3IpKSByZXR1cm4gbmV3ICRBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UpO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9lcnJvci1tZXNzYWdlIC0tIGV4cGVjdGVkXG4gICAgdGhhdCA9IHNldFByb3RvdHlwZU9mKG5ldyBFcnJvcih1bmRlZmluZWQpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7XG4gIH1cbiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgU3RyaW5nKG1lc3NhZ2UpKTtcbiAgdmFyIGVycm9yc0FycmF5ID0gW107XG4gIGl0ZXJhdGUoZXJyb3JzLCBlcnJvcnNBcnJheS5wdXNoLCB7IHRoYXQ6IGVycm9yc0FycmF5IH0pO1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ2Vycm9ycycsIGVycm9yc0FycmF5KTtcbiAgcmV0dXJuIHRoYXQ7XG59O1xuXG4kQWdncmVnYXRlRXJyb3IucHJvdG90eXBlID0gY3JlYXRlKEVycm9yLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3RvcjogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICRBZ2dyZWdhdGVFcnJvciksXG4gIG1lc3NhZ2U6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAnJyksXG4gIG5hbWU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAnQWdncmVnYXRlRXJyb3InKVxufSk7XG5cbi8vIGBBZ2dyZWdhdGVFcnJvcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWdncmVnYXRlLWVycm9yLWNvbnN0cnVjdG9yXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHtcbiAgQWdncmVnYXRlRXJyb3I6ICRBZ2dyZWdhdGVFcnJvclxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5maW5kO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbnZhciBGSU5EID0gJ2ZpbmQnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZyb20nKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYWJsZSk7XG59KTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBmcm9tOiBmcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5c1xuLy8gYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudmFsdWVzXG4vLyBgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVJdGVyYXRvcihBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLFxuICAgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwgLy8gdGFyZ2V0XG4gICAgaW5kZXg6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gIH0pO1xuLy8gYCVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDtcbiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCsrO1xuICBpZiAoIXRhcmdldCB8fCBpbmRleCA+PSB0YXJnZXQubGVuZ3RoKSB7XG4gICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBpbmRleCwgZG9uZTogZmFsc2UgfTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiB0YXJnZXRbaW5kZXhdLCBkb25lOiBmYWxzZSB9O1xuICByZXR1cm4geyB2YWx1ZTogW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZG9uZTogZmFsc2UgfTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJyk7XG52YXIgY29sbGVjdGlvblN0cm9uZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyBgTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVnZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogaXNJbnRlZ2VyXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTnVtYmVyLmlzTmFOYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzbmFuXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VGbG9hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZUZsb2F0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLXBhcnNlZmxvYXQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXQgfSwge1xuICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYE51bWJlci5wYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZWludFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWludCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogTnVtYmVyLnBhcnNlSW50ICE9IHBhcnNlSW50IH0sIHtcbiAgcGFyc2VJbnQ6IHBhcnNlSW50XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZlxufSk7XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogZXJyb3IgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG52YXIgUFJPTUlTRV9BTllfRVJST1IgPSAnTm8gb25lIHByb21pc2UgcmVzb2x2ZWQnO1xuXG4vLyBgUHJvbWlzZS5hbnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFueVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgYW55OiBmdW5jdGlvbiBhbnkoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIGVycm9ycy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3JzW2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBwYXRjaCBuYXRpdmUgUHJvbWlzZS5wcm90b3R5cGUgZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnNcbmlmICghSVNfUFVSRSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZSA9PSAnZnVuY3Rpb24nICYmICFOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddKSB7XG4gIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAnZmluYWxseScsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKS5wcm90b3R5cGVbJ2ZpbmFsbHknXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbic7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3RvcikgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UpIHtcbiAgICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgLy8gV2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICBpZiAoVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAgIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICBpZiAoIUlTX05PREUgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQpIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSNmaW5hbGx5IGluIHRoZSBwdXJlIHZlcnNpb24gZm9yIHByZXZlbnRpbmcgcHJvdG90eXBlIHBvbGx1dGlvblxuICBpZiAoSVNfUFVSRSAmJiAhUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZVsnZmluYWxseSddKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlQ29uc3RydWN0b3IucmVzb2x2ZSgxKTtcbiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgfTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICByZXR1cm4gIShwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlKTtcbn0pO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9IEZPUkNFRCB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICBpZiAoIUlTX1BVUkUgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlLnByb3RvdHlwZS50aGVuO1xuXG4gICAgLy8gd3JhcCBuYXRpdmUgUHJvbWlzZSN0aGVuIGZvciBuYXRpdmUgYXN5bmMgZnVuY3Rpb25zXG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBuYXRpdmVUaGVuLmNhbGwodGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NDBcbiAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcblxuICAgIC8vIHdyYXAgZmV0Y2ggcmVzdWx0XG4gICAgaWYgKHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJykgJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgICBmZXRjaDogZnVuY3Rpb24gZmV0Y2goaW5wdXQgLyogLCBpbml0ICovKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShQcm9taXNlQ29uc3RydWN0b3IsICRmZXRjaC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuXG5Qcm9taXNlV3JhcHBlciA9IGdldEJ1aWx0SW4oUFJPTUlTRSk7XG5cbi8vIHN0YXRpY3NcbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gYFByb21pc2UucmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvck1ldGhvZHMudmFsdWVzO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHtcbiAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gIT09IEFycmF5VmFsdWVzKSB0cnkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7XG4gICAgfVxuICAgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7XG4gICAgfVxuICAgIGlmIChET01JdGVyYWJsZXNbQ09MTEVDVElPTl9OQU1FXSkgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHtcbiAgICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZhbGlkYXRvciA9IG5ldyBSZWdFeHAoXCJeW2EtejAtOV17OH0tW2EtejAtOV17NH0tW2EtejAtOV17NH0tW2EtejAtOV17NH0tW2EtejAtOV17MTJ9JFwiLCBcImlcIik7XG5cbiAgZnVuY3Rpb24gZ2VuKGNvdW50KSB7XG4gICAgdmFyIG91dCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaT0wOyBpPGNvdW50OyBpKyspIHtcbiAgICAgIG91dCArPSAoKCgxK01hdGgucmFuZG9tKCkpKjB4MTAwMDApfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBHdWlkKGd1aWQpIHtcbiAgICBpZiAoIWd1aWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50OyBgdmFsdWVgIGhhcyBubyB2YWx1ZS5cIik7XG4gICAgICBcbiAgICB0aGlzLnZhbHVlID0gR3VpZC5FTVBUWTtcbiAgICBcbiAgICBpZiAoZ3VpZCAmJiBndWlkIGluc3RhbmNlb2YgR3VpZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQudG9TdHJpbmcoKTtcblxuICAgIH0gZWxzZSBpZiAoZ3VpZCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ3VpZCkgPT09IFwiW29iamVjdCBTdHJpbmddXCIgJiYgR3VpZC5pc0d1aWQoZ3VpZCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAvLyBDb21wYXJpbmcgc3RyaW5nIGB2YWx1ZWAgYWdhaW5zdCBwcm92aWRlZCBgZ3VpZGAgd2lsbCBhdXRvLWNhbGxcbiAgICAgIC8vIHRvU3RyaW5nIG9uIGBndWlkYCBmb3IgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIEd1aWQuaXNHdWlkKG90aGVyKSAmJiB0aGlzLnZhbHVlID09IG90aGVyO1xuICAgIH07XG5cbiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBHdWlkLkVNUFRZO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgfTtcblxuICBHdWlkLkVNUFRZID0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcblxuICBHdWlkLmlzR3VpZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmICh2YWx1ZSBpbnN0YW5jZW9mIEd1aWQgfHwgdmFsaWRhdG9yLnRlc3QodmFsdWUudG9TdHJpbmcoKSkpO1xuICB9O1xuXG4gIEd1aWQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBHdWlkKFtnZW4oMiksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigzKV0uam9pbihcIi1cIikpO1xuICB9O1xuXG4gIEd1aWQucmF3ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFtnZW4oMiksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigzKV0uam9pbihcIi1cIik7XG4gIH07XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gR3VpZDtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgd2luZG93Lkd1aWQgPSBHdWlkO1xuICB9XG59KSgpO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbi8vIEV4cG9ydCBldmVyeXRoaW5nIGZyb20gdGhlIHNoYXJlZCBmaWxlXG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuXG4vLyBFeHBvcnQgdGhlIG5hbWVzcGFjZXMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIGV4dGVuc2lvbnNcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50JztcbmV4cG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvTmFtZXNwYWNlcy9VSSc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgbGV0IGV4dGVuc2lvbnM6IEV4dGVuc2lvbnM7XG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcidcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZydcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEFuYWx5dGljc09iamVjdFR5cGUge1xuICAgIENsdXN0ZXIgPSAnY2x1c3RlcicsXG4gICAgRm9yZWNhc3QgPSAnZm9yZWNhc3QnLFxuICAgIFRyZW5kTGluZSA9ICd0cmVuZC1saW5lJ1xuICB9XG5cbiAgZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cydcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBhIHZhbHVlIGNhbiBoYXZlXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gICAgU3RyaW5nID0gJ3N0cmluZycsXG4gICAgSW50ID0gJ2ludCcsXG4gICAgRmxvYXQgPSAnZmxvYXQnLFxuICAgIEJvb2wgPSAnYm9vbCcsXG4gICAgRGF0ZSA9ICdkYXRlJyxcbiAgICBEYXRlVGltZSA9ICdkYXRlLXRpbWUnLFxuICAgIFNwYXRpYWwgPSAnc3BhdGlhbCdcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBkYXRlIHJhbmdlcyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlci5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAgIExhc3QgPSAnbGFzdCcsXG4gICAgTGFzdE4gPSAnbGFzdC1uJyxcbiAgICBOZXh0ID0gJ25leHQnLFxuICAgIE5leHROID0gJ25leHQtbicsXG4gICAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgICBUb0RhdGUgPSAndG8tZGF0ZSdcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gICAgQ29sdW1uID0gJ2NvbHVtbicsXG4gICAgUm93ID0gJ3JvdycsXG4gICAgUGFnZSA9ICdwYWdlJyxcbiAgICBGaWx0ZXIgPSAnZmlsdGVyJyxcbiAgICBNYXJrc1R5cGUgPSAnbWFya3MtdHlwZScsXG4gICAgTWVhc3VyZVZhbHVlcyA9ICdtZWFzdXJlLXZhbHVlcycsXG4gICAgQ29sb3IgPSAnY29sb3InLFxuICAgIFNpemUgPSAnc2l6ZScsXG4gICAgTGFiZWwgPSAnbGFiZWwnLFxuICAgIERldGFpbCA9ICdkZXRhaWwnLFxuICAgIFRvb2x0aXAgPSAndG9vbHRpcCcsXG4gICAgU2hhcGUgPSAnc2hhcGUnLFxuICAgIFBhdGggPSAncGF0aCcsXG4gICAgQW5nbGUgPSAnYW5nbGUnXG4gIH1cblxuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJ1xuICB9XG5cbiAgLyoqXG4gICAqICBUeXBlIG9mIGFnZ3JlZ2F0aW9uIG9uIGEgZmllbGQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgU3VtID0gJ3N1bScsXG4gICAgQXZnID0gJ2F2ZycsXG4gICAgTWluID0gJ21pbicsXG4gICAgTWF4ID0gJ21heCcsXG4gICAgU3RkZXYgPSAnc3RkZXYnLFxuICAgIFN0ZGV2cCA9ICdzdGRldnAnLFxuICAgIFZhciA9ICd2YXInLFxuICAgIFZhcnAgPSAndmFycCcsXG4gICAgQ291bnQgPSAnY291bnQnLFxuICAgIENvdW50ZCA9ICdjb3VudGQnLFxuICAgIE1lZGlhbiA9ICdtZWRpYW4nLFxuICAgIEF0dHIgPSAnYXR0cicsXG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBZZWFyID0gJ3llYXInLFxuICAgIFF0ciA9ICdxdHInLFxuICAgIE1vbnRoID0gJ21vbnRoJyxcbiAgICBEYXkgPSAnZGF5JyxcbiAgICBIb3VyID0gJ2hvdXInLFxuICAgIE1pbnV0ZSA9ICdtaW51dGUnLFxuICAgIFNlY29uZCA9ICdzZWNvbmQnLFxuICAgIFdlZWsgPSAnd2VlaycsXG4gICAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgICBNb250aFllYXIgPSAnbW9udGgteWVhcicsXG4gICAgTWR5ID0gJ21keScsXG4gICAgRW5kID0gJ2VuZCcsXG4gICAgVHJ1bmNZZWFyID0gJ3RydW5jLXllYXInLFxuICAgIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gICAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gICAgVHJ1bmNXZWVrID0gJ3RydW5jLXdlZWsnLFxuICAgIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gICAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICAgIFRydW5jTWludXRlID0gJ3RydW5jLW1pbnV0ZScsXG4gICAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgICBRdWFydDEgPSAncXVhcnQxJyxcbiAgICBRdWFydDMgPSAncXVhcnQzJyxcbiAgICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gICAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICAgIEluT3V0ID0gJ2luLW91dCcsXG4gICAgVXNlciA9ICd1c2VyJ1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGUgb2YgYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkUm9sZVR5cGUge1xuICAgIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICAgIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gICAgVW5rbm93biA9ICd1bmtub3duJ1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICAgIEFkZCA9ICdhZGQnLFxuICAgIEFsbCA9ICdhbGwnLFxuICAgIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gICAgUmVtb3ZlID0gJ3JlbW92ZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIHR5cGUgZm9yIGEgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9tYWluIHZhbHVlcyB0aGF0IGFyZSByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIGZpbHRlclxuICAgICAqIGkuZS4gdGhlIGRvbWFpbiBpcyByZXN0cmljdGVkIGJ5IGEgcHJldmlvdXMgZmlsdGVyXG4gICAgICovXG4gICAgUmVsZXZhbnQgPSAncmVsZXZhbnQnLFxuICAgIC8qKlxuICAgICAqIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGRvbWFpbiB2YWx1ZXMgZnJvbSBkYXRhYmFzZVxuICAgICAqL1xuICAgIERhdGFiYXNlID0gJ2RhdGFiYXNlJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJ1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWxsb3dhYmxlIHZhbHVlcy5cbiAgICogVGhpcyBpcyB1c2VkIGZvciByZXN0cmljdGluZyB0aGUgZG9tYWluIG9mIGEgcGFyYW1ldGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBQYXJhbWV0ZXJWYWx1ZVR5cGUge1xuICAgIEFsbCA9ICdhbGwnLFxuICAgIExpc3QgPSAnbGlzdCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnXG4gIH1cblxuICAvKipcbiAgICogRGF0ZSBwZXJpb2QgdXNlZCBpbiBmaWx0ZXJzIGFuZCBpbiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGVyaW9kVHlwZSB7XG4gICAgWWVhcnMgPSAneWVhcnMnLFxuICAgIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgICBNb250aHMgPSAnbW9udGhzJyxcbiAgICBXZWVrcyA9ICd3ZWVrcycsXG4gICAgRGF5cyA9ICdkYXlzJyxcbiAgICBIb3VycyA9ICdob3VycycsXG4gICAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgICBTZWNvbmRzID0gJ3NlY29uZHMnXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCdcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICAgIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICAgIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzaGVldCBhIFtbU2hlZXRdXSBvYmplY3QgcmVwcmVzZW50c1xuICAgKi9cbiAgZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBTdG9yeSA9ICdzdG9yeScsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCdcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIFNvcnREaXJlY3Rpb24ge1xuICAgIEluY3JlYXNpbmcgPSAnaW5jcmVhc2luZycsXG4gICAgRGVjcmVhc2luZyA9ICdkZWNyZWFzaW5nJ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbV29ya3NoZWV0XV0gb2JqZWN0cy4qL1xuICAgIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGFzIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbV29ya3NoZWV0XV0gb2JqZWN0cy4gKi9cbiAgICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrLXNlbGVjdGlvbi1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLiAqL1xuICAgIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyLWNoYW5nZWQnLFxuXG4gICAgLyoqIFNldHRpbmdzIGhhdmUgYmVlbiBjaGFuZ2VkIGZvciB0aGlzIGV4dGVuc2lvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tTZXR0aW5nc11dIG9iamVjdHMuICovXG4gICAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnXG4gIH1cblxuICBleHBvcnQgZW51bSBUcmVuZExpbmVNb2RlbFR5cGUge1xuICAgIExpbmVhciA9ICdsaW5lYXInLFxuICAgIExvZ2FyaXRobWljID0gJ2xvZ2FyaXRobWljJyxcbiAgICBFeHBvbmVudGlhbCA9ICdleHBvbmVudGlhbCcsXG4gICAgUG9seW5vbWlhbCA9ICdwb2x5bm9taWFsJ1xuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlIG9mIGEgem9uZS5cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqL1xuICBleHBvcnQgZW51bSBab25lVmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgem9uZSBpbiB0aGUgZGFzaGJvYXJkLiovXG4gICAgU2hvdyA9ICdzaG93JyxcblxuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9mZiB0aGUgdmlzaWJpbGl0eSBvZiBhIHpvbmUgaW4gdGhlIGRhc2hib2FyZC4qL1xuICAgIEhpZGUgPSAnaGlkZScsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHNlcnZlcyBhcyBhIGZpbHRlciBvbiB0aGUgRGF0YVZhbHVlcyByZXR1cm5lZCBmcm9tIGBnZXRTdW1tYXJ5RGF0YUFzeW5jYCxcbiAgICogYGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luY2AgYW5kIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgLlxuICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBvZiByZXR1cm5lZCBkYXRhIHZhbHVlcyBvbmx5LiBUYWJsZWF1IHZlcnNpb25zIHByaW9yIHRvIDIwMjEuMlxuICAgKiB3aWxsIHBhc3MgdGhlIGRhdGEgYWNyb3NzIGFuZCBwb3B1bGF0ZSB0aGUgRGF0YVZhbHVlIHByb3BlcnRpZXMuXG4gICAqIFBsZWFzZSBub3RlIHRoYXQgYWxsIHByb3BlcnRpZXMgbm90IHJlcXVlc3RlZCB3aWxsIGJlIGB1bmRlZmluZWRgIGluIHRoZSBEYXRhVmFsdWUgcmVzdWx0cy5cbiAgICogQHNpbmNlIDEuNS4wXG4gICAqL1xuICBleHBvcnQgZW51bSBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB7XG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzLiovXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnLFxuXG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBvbmx5IGluY2x1ZGUgdmFsdWUgYW5kIG5hdGl2ZVZhbHVlIHByb3BlcnRpZXMuKi9cbiAgICBPbmx5TmF0aXZlVmFsdWVzID0gJ29ubHktbmF0aXZlLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSBmb3JtYXR0ZWRWYWx1ZSBwcm9wZXJ0aWVzLiAqL1xuICAgIE9ubHlGb3JtYXR0ZWRWYWx1ZXMgPSAnb25seS1mb3JtYXR0ZWQtdmFsdWVzJ1xuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuXG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBlbWJlZGRpbmcgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9EYXRhVGFibGVJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FdmVudEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0ZpbHRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NlbGVjdGlvbkludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NlbGVjdGlvbkludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7XG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEFuYWx5dGljc09iamVjdFR5cGUsXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuIiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG4vLyBUaGUgZm9sbG93aW5nIHBvbHlmaWxscyBhcmUgbmVlZGVkIGZvciBJRTExXG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLWludGVnZXInO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1uYW4nO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyBUaGVzZSBhcmUgdGhlIGV4cG9ydHMgZnJvbSB0aGUgbWVzc2FnaW5nIHN0dWZmXG5cbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VEaXNwYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlTGlzdGVuZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0LlxuLy8gIFRoaXMgaXMgcHVsbGVkIGZyb20gdGhlIHBhY2thZ2UuanNvbiBmaWxlLlxuLy8gTk9URTogc2VtdmVyIHBhY2thZ2UgaXMgcHJlZmVycmVkIGhlcmUsIGJ1dCByZXF1aXJlcyB0cmFuc3BpbGVyXG4vLyAgbGlrZSBiYWJlbCBhcyBwYXJ0IG9mIG91ciB3ZWJwYWNrIGNvbmZpZy5cbi8vIGltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0ICogYXMgcGFja0pzb24gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7IEludGVybmFsVGFibGVhdUVycm9yIH0gZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuXG5sZXQgdmVyc2lvblBhcnRzO1xudHJ5IHtcbiAgdmVyc2lvblBhcnRzID0gcGFja0pzb24udmVyc2lvbi5zcGxpdCgnLicpLm1hcChwID0+IHBhcnNlSW50KHAsIDEwKSk7XG59IGNhdGNoIChlKSB7XG4gIGNvbnNvbGUuZXJyb3IoZSk7XG4gIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGludGVybmFsIGNvbnRyYWN0IHZlcnNpb24gJHtwYWNrSnNvbi52ZXJzaW9ufWApIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xufVxuXG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IHZlcnNpb25QYXJ0c1swXSxcbiAgbWlub3I6IHZlcnNpb25QYXJ0c1sxXSxcbiAgZml4OiB2ZXJzaW9uUGFydHNbMl0sXG59O1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcblxuICBwcml2YXRlIHN0YXRpYyBpc1NwZWNpYWwodmFsdWVBc1N0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gUHJpb3IgdG8gU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgY29tZSB0byB1cyBhc1xuICAgIC8vICclbnVsbCUnLCAnJWFsbCUnLCAnJXdpbGRjYXJkJScsICclbWlzc2luZyUnLi4uXG4gICAgLy8gV2hpbGUgdGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIHJldHVybiB0cnVlIGZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbnZlcnNpb24sXG4gICAgLy8gaXQgaXMgYXMgY2hlYXAgYXMgcGFzc2luZyBhcm91bmQgYSB2ZXJzaW9uIGFuZCBjaGVja2luZyB0aGF0LlxuICAgIC8vIChTZWUgRGF0YVZhbHVlRm9ybWF0dGVyLmNwcClcblxuICAgIGlmICh2YWx1ZUFzU3RyaW5nLmxlbmd0aCA+IDIgJiYgdmFsdWVBc1N0cmluZ1swXSA9PT0gJyUnICYmIHZhbHVlQXNTdHJpbmdbdmFsdWVBc1N0cmluZy5sZW5ndGggLSAxXSA9PT0gJyUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3BlY2lhbFZhbHVlSW5kaWNhdG9yOiBzdHJpbmcgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgbGV0IG5vcm1hbGl6ZWRCb29sZWFuOiBzdHJpbmcgPSBib29sZWFuU3RyaW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnKVxuICAgICAgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvclxuICAgICAgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGxldCB2YWx1ZTogbnVtYmVyID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgbGV0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgbGV0IGZvcm1hdHRlZERhdGVTdHJpbmc6IHN0cmluZyA9IGRhdGVBc1N0cmluZy5yZXBsYWNlKCcgJywgJ1QnKS5jb25jYXQoJ1onKTtcbiAgICBsZXQgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUodmFsdWU6IGFueSwgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyB8IG51bGwge1xuICAgIC8vIFRoaXMgY29udmVydHMgZnJvbSBvdXIgMS4yIEFQSSB0aGF0IHJldHVybnMgc3RyaW5ncyBmb3Igc3BlY2lhbHMsIGFuZCBkYXRlcyBhcyBzdHJpbmdzLlxuICAgIC8vIEl0IHRha2VzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgJyVudWxsJScgYW5kIHJldHVybnMgYSBudWxsLlxuICAgIC8vIEZvciBkYXRlcywgaXQgcmV0dXJucyBhIERhdGUgb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nLlxuICAgIC8vIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gYnVpbGQgYSBEYXRhVmFsdWUubmF0aXZlVmFsdWUgZmllbGQuXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCBjYW4gYmUgdW5kZWZpbmVkLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBuYXRpdmVWYWx1ZSBpcyB0cmVhdGVkIGxpa2UgYSBzcGVjaWFsXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG5leHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gIFZpZXdpbmcgPSAndmlld2luZycsXG4gIFVua25vd24gPSAndW5rbm93bidcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJ1xufVxuXG5leHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgQmxhbmsgPSAnYmxhbmsnLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgVGl0bGUgPSAndGl0bGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBJbWFnZSA9ICdpbWFnZScsXG4gIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJ1xufVxuXG5leHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gIFN0cmluZyA9ICdzdHJpbmcnLFxuICBJbnQgPSAnaW50JyxcbiAgRmxvYXQgPSAnZmxvYXQnLFxuICBCb29sID0gJ2Jvb2wnLFxuICBEYXRlID0gJ2RhdGUnLFxuICBEYXRlVGltZSA9ICdkYXRlLXRpbWUnLFxuICBTcGF0aWFsID0gJ3NwYXRpYWwnXG59XG5cbmV4cG9ydCBlbnVtIEVuY29kZWREYXRhVHlwZSB7XG4gIE51bWJlciA9ICdudW1iZXInLFxuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgQm9vbGVhbiA9ICdib29sZWFuJ1xufVxuXG5leHBvcnQgZW51bSBFcnJvckNvZGVzIHtcbiAgSU5JVElBTElaQVRJT05fRVJST1IgPSAnaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIE1JU1NJTkdfRU5VTV9NQVBQSU5HID0gJ21pc3NpbmctZW51bS1tYXBwaW5nJyxcbiAgTUlTU0lOR19QQVJBTUVURVIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uLWRlbmllZCcsXG4gIFBSRVNfTU9ERUxfUEFSU0lOR19FUlJPUiA9ICdwcmVzLW1vZGVsLXBhcnNpbmctZXJyb3InLFxuICBWRVJTSU9OX05PVF9DT05GSUdVUkVEID0gJ3ZlcnNpb24tbm90LWNvbmZpZ3VyZWQnLFxuICBWSVNJQklMSVRZX0VSUk9SID0gJ3Zpc2liaWxpdHktZXJyb3InLFxuICBVTktOT1dOX1ZFUkJfSUQgPSAndW5rbm93bi12ZXJiLWlkJ1xufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJ1xufVxuXG5leHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiAgVGhlIGRpZmZlcmVudCB1cGRhdGUgdHlwZXMgZm9yIGFwcGx5aW5nIGZpbHRlci5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVXBkYXRlVHlwZSB7XG4gIEFkZCA9ICdhZGQnLFxuICBBbGwgPSAnYWxsJyxcbiAgUmVwbGFjZSA9ICdyZXBsYWNlJyxcbiAgUmVtb3ZlID0gJ3JlbW92ZSdcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCdcbn1cblxuZXhwb3J0IGVudW0gRG9tYWluUmVzdHJpY3Rpb25UeXBlIHtcbiAgQWxsID0gJ2FsbCcsXG4gIExpc3QgPSAnbGlzdCcsXG4gIFJhbmdlID0gJ3JhbmdlJ1xufVxuXG5leHBvcnQgZW51bSBEYXRlU3RlcFBlcmlvZCB7XG4gIFllYXJzID0gJ3llYXJzJyxcbiAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICBNb250aHMgPSAnbW9udGhzJyxcbiAgV2Vla3MgPSAnd2Vla3MnLFxuICBEYXlzID0gJ2RheXMnLFxuICBIb3VycyA9ICdob3VycycsXG4gIE1pbnV0ZXMgPSAnbWludXRlcycsXG4gIFNlY29uZHMgPSAnc2Vjb25kcydcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJ1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGZpbHRlciBkb21haW5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgQWRkID0gJ3NlbGVjdC1hZGQnLFxuICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZSdcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBpbmNsdWRlZCB2YWx1ZXMgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyB7XG4gIEluY2x1ZGVOdWxsID0gJ2luY2x1ZGUtbnVsbCcsXG4gIEluY2x1ZGVOb25OdWxsID0gJ2luY2x1ZGUtbm9uLW51bGwnLFxuICBJbmNsdWRlQWxsID0gJ2luY2x1ZGUtYWxsJ1xufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlclR5cGUge1xuICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbiAgUmVsYXRpdmVEYXRlID0gJ3JlbGF0aXZlRGF0ZScsXG4gIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJ1xufVxuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXVuY2hpbmcgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICovXG5leHBvcnQgZW51bSBFeHRlbnNpb25EaWFsb2dSZXN1bHQge1xuICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgSW52YWxpZERvbWFpbiA9ICdpbnZhbGlkLWRvbWFpbicsXG4gIFN1Y2Nlc3MgPSAnc3VjY2Vzcydcbn1cblxuLy8gRW51bWVyYXRpb24gZm9yIEFwaVNob3dEYXRhIHRhYmxlIGlkIHNlbnRpbmVscy5cbmV4cG9ydCBlbnVtIEFwaVNob3dEYXRhVGFibGVTZW50aW5lbCB7XG5cbiAgLy8gZmluZCB0aGUgb25lIGxvZ2ljYWwgdGFibGUgLSB1c2VkIGluIHZlcnNpb24gY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgZ2V0VW5kZXJseWluZ0RhdGFUYWJsZSBhbmQgZ2V0TG9naWNhbERhdGFUYWJsZSBjb21tYW5kc1xuICBTaW5nbGVUYWJsZUlkID0gJ3NpbmdsZS10YWJsZS1pZC1zZW50aW5lbCcsXG4gIFNpbmdsZVRhYmxlQ2FwdGlvbiA9ICdTaW5nbGUgdGFibGUgaWQgc2VudGluZWwnXG59XG5cbi8qKlxuICogVXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2V0U3VtbWFyeURhdGEvZ2V0VW5kZXJseWluZ1RhYmxlRGF0YSByZXN1bHRzXG4gKiBNYXBwZWQgZnJvbSBleHRlcm5hbCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxuICovXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlRm9ybWF0IHtcbiAgTmF0aXZlVmFsdWVzT25seSA9ICduYXRpdmUtdmFsdWVzLW9ubHknLFxuICBGb3JtYXR0ZWRWYWx1ZXNPbmx5ID0gJ2Zvcm1hdHRlZC12YWx1ZXMtb25seScsXG4gIE5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyA9ICduYXRpdmUtYW5kLWZvcm1hdHRlZC12YWx1ZXMnXG59XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25JZCB7XG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXItY2hhbmdlZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSA9ICdleHRlbnNpb24tZGlhbG9nLXVwZGF0ZScsXG4gIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBUZXN0Q29udmVyc2lvbk5vdGlmaWNhdGlvbiA9ICd0ZXN0LWNvbnZlcnNpb24tbm90aWZpY2F0aW9uJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxufVxuIiwiZXhwb3J0IGVudW0gUGFyYW1ldGVySWQge1xuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyA9ICdleHRlbnNpb24tYm9vdHN0cmFwLWluZm8nLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8gPSAnZXh0ZW5zaW9uLXNldHRpbmdzLWluZm8nLFxuICBWaXN1YWxJZCA9ICd2aXN1YWwtaWQnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIENvbHVtbnNUb0luY2x1ZGVCeUlkID0gJ2NvbHVtbnMtdG8taW5jbHVkZS1ieS1pZCcsXG4gIElnbm9yZUFsaWFzZXMgPSAnaWdub3JlLWFsaWFzZXMnLFxuICBJZ25vcmVTZWxlY3Rpb24gPSAnaWdub3JlLXNlbGVjdGlvbicsXG4gIEluY2x1ZGVBbGxDb2x1bW5zID0gJ2luY2x1ZGUtYWxsLWNvbHVtbnMnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgVW5kZXJseWluZ0RhdGFUYWJsZSA9ICd1bmRlcmx5aW5nLWRhdGEtdGFibGUnLFxuICBVbmRlcmx5aW5nU3VtbWFyeURhdGFUYWJsZSA9ICd1bmRlcmx5aW5nLXN1bW1hcnktZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG5cbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2VsZWN0ZWREYXRhID0gJ3NlbGVjdGVkLWRhdGEnLFxuICBIaWdobGlnaHRlZERhdGEgPSAnaGlnaGxpZ2h0ZWQtZGF0YScsXG5cbiAgLy8gRmlsdGVyIFBhcmFtc1xuICBGaWVsZE5hbWUgPSAnZmllbGQtbmFtZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRmlsdGVyVXBkYXRlVHlwZSA9ICdmaWx0ZXItdXBkYXRlLXR5cGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBGaWx0ZXJSYW5nZU1pbiA9ICdmaWx0ZXItcmFuZ2UtbWluJyxcbiAgRmlsdGVyUmFuZ2VNYXggPSAnZmlsdGVyLXJhbmdlLW1heCcsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBXb3Jrc2hlZXRGaWx0ZXJzID0gJ3dvcmtzaGVldC1maWx0ZXJzJyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuICBDYXRlZ29yaWNhbERvbWFpbiA9ICdjYXRlZ29yaWNhbC1kb21haW4nLFxuICBRdWFudGl0YXRpdmVEb21haW4gPSAncXVhbnRpdGF0aXZlLWRtYWluJyxcbiAgRmllbGQgPSAnZmllbGQnLFxuXG4gIFdvcmtzaGVldE5hbWUgPSAnd29ya3NoZWV0LW5hbWUnLFxuICBEYXNoYm9hcmROYW1lID0gJ2Rhc2hib2FyZCcsXG5cbiAgUGFyYW1ldGVySW5mbyA9ICdwYXJhbWV0ZXItaW5mbycsXG4gIFBhcmFtZXRlckluZm9zID0gJ3BhcmFtZXRlci1pbmZvcycsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJWYWx1ZSA9ICdwYXJhbWV0ZXItdmFsdWUnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uJyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSA9ICdzZWxlY3Rpb25VcGRhdGVUeXBlJyxcbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIFF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHMgPSAncXVhbnRhdGl2ZVJhbmdlU2VsZWN0aW9uTW9kZWxzJyxcbiAgRGltVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2RpbWVuc2lvblZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcblxuICBBY3RpdmVUYWJsZXNJbmZvID0gJ2FjdGl2ZS10YWJsZXMtaW5mbycsXG4gIERhdGFTb3VyY2UgPSAnZGF0YS1zb3VyY2UnLFxuICBEYXRhU291cmNlSWQgPSAnZGF0YS1zb3VyY2UtaWQnLFxuICBEZWx0YVRpbWVNcyA9ICdkZWx0YS10aW1lLW1zJyxcbiAgU2hvdWxkUmVmcmVzaERTID0gJ3Nob3VsZC1yZWZyZXNoLWRzJyxcbiAgRGF0YVNjaGVtYSA9ICdkYXRhLXNjaGVtYScsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBDb2x1bW5zVG9JbmNsdWRlID0gJ2NvbHVtbnMtdG8taW5jbHVkZScsXG4gIEpvaW5EZXNjcmlwdGlvbiA9ICdqb2luLWRlc2NyaXB0aW9uJyxcbiAgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzID0gJ2Nvbm5lY3Rpb24tZGVzY3JpcHRpb24tc3VtbWFyaWVzJyxcblxuICBFeHRlbnNpb25EaWFsb2dVcmwgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwnLFxuICBFeHRlbnNpb25EaWFsb2dQYXlsb2FkID0gJ2V4dGVuc2lvbi1kaWFsb2ctcGF5bG9hZCcsXG4gIElzRXh0ZW5zaW9uRGlhbG9nID0gJ2lzLWV4dGVuc2lvbi1kaWFsb2cnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nVyA9ICdleHRlbnNpb24tZGlhbG9nLXdpZHRoJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0ID0gJ2V4dGVuc2lvbi1kaWFsb2ctcmVzdWx0JyxcblxuICBFeHRlbnNpb25Db250ZXh0TWVudUlkcyA9ICdleHRlbnNpb24tY29udGV4dC1tZW51LWlkcycsXG5cbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG5cbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFpvbmVJZHNWaXNpYmlsaXR5TWFwID0gJ3pvbmUtaWRzLXZpc2liaWxpdHktbWFwJyxcblxuICBMb2dpY2FsVGFibGVJbmZvTGlzdCA9ICdsb2dpY2FsLXRhYmxlLWluZm8tbGlzdCcsXG4gIExvZ2ljYWxUYWJsZUlkID0gJ2xvZ2ljYWwtdGFibGUtaWQnLFxuXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBFbWJlZGRpbmdCb290c3RyYXBJbmZvID0gJ2VtYmVkZGluZy1ib290c3RyYXAtaW5mbycsXG59XG4iLCIvLyBEZWNsYXJlIHRoaXMga2V5IHR5cGUgYW5kIGV4cG9ydCB0aGUgTm90aWZpY2F0aW9uSWQgdG8gbWFrZSB0aGlzIGJlaGF2ZSBsaWtlIGEgc3RyaW5nIGVudW1cbmV4cG9ydCBlbnVtIFZlcmJJZCB7XG4gIEFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXIgPSAnY2F0ZWdvcmljYWwtZmlsdGVyJyxcbiAgQXBwbHlSYW5nZUZpbHRlciA9ICdyYW5nZS1maWx0ZXInLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBJbml0aWFsaXplRXh0ZW5zaW9uID0gJ2luaXRpYWxpemUtZXh0ZW5zaW9uJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhID0gJ2dldC1zdW1tYXJ5LWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nRGF0YSA9ICdnZXQtdW5kZXJseWluZy1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZURhdGEgPSAnZ2V0LWRhdGFzb3VyY2UtZGF0YScsXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0SGlnaGxpZ2h0ZWRNYXJrcyA9ICdnZXQtaGlnaGxpZ2h0ZWQtbWFya3MnLFxuICBHZXRQYXJhbWV0ZXJzRm9yU2hlZXQgPSAnZ2V0LXBhcmFtZXRlcnMtZm9yLXNoZWV0JyxcbiAgRmluZFBhcmFtZXRlciA9ICdmaW5kLXBhcmFtZXRlcicsXG4gIENoYW5nZVBhcmFtZXRlclZhbHVlID0gJ2NoYW5nZS1wYXJhbWV0ZXItdmFsdWUnLFxuICBDbGVhclNlbGVjdGVkTWFya3MgPSAnY2xlYXItc2VsZWN0ZWQtbWFya3MnLFxuICBTZWxlY3RCeVZhbHVlID0gJ3NlbGVjdC1ieS12YWx1ZScsXG4gIEdldERhdGFTb3VyY2VzID0gJ2dldC1kYXRhLXNvdXJjZXMnLFxuICBSZWZyZXNoRGF0YVNvdXJjZSA9ICdyZWZyZXNoLWRhdGEtc291cmNlJyxcbiAgR2V0RmlsdGVycyA9ICdnZXQtZmlsdGVycycsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRDYXRlZ29yaWNhbERvbWFpbiA9ICdnZXQtY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBEaXNwbGF5RGlhbG9nID0gJ2Rpc3BsYXktZGlhbG9nJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgVGVzdENvbnZlcnNpb25WZXJiID0gJ3Rlc3QtY29udmVyc2lvbi12ZXJiJyxcbiAgR2V0RmllbGQgPSAnZ2V0LWZpZWxkJyxcbiAgR2V0RGF0YVNvdXJjZSA9ICdnZXQtZGF0YXNvdXJjZScsXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBCbG9ja0V4dGVuc2lvbiA9ICdibG9jay1leHRlbnNpb24nLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGEgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZXMgPSAnZ2V0LXVuZGVybHlpbmctdGFibGVzJyxcbiAgVml6QVBJID0gJ3Zpei1hcGknLFxuICBHZXRFbWJlZGRpbmdCb290c3RyYXBJbmZvID0gJ2dldC1lbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcblxuaW1wb3J0IHsgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSc7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBNZXNzZW5nZXIgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIGlzQ29tbWFuZE1lc3NhZ2UsXG4gIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgaXNJbml0TWVzc2FnZSxcbiAgaXNNZXNzYWdlLFxuICBpc05vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIGlzSGFuZHNoYWtlTWVzc2FnZVxufSBmcm9tICcuL01lc3NhZ2VUeXBlQ2hlY2tzJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXIsIFZlcmJJZCwgRXhlY3V0ZVBhcmFtZXRlcnMsIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIE1vZGVsLCBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmltcG9ydCB7XG4gIEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcixcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRNZXNzYWdlSGFuZGxlcixcbiAgTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIsXG4gIEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5cbi8qKlxuICogVGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgaXMgdGhlIHByaW1hcnkgZXhwb3J0IGZyb20gdGhlIGFwaS1tZXNzYWdpbmcgbW9kdWxlLiBBbiBpbnN0YW5jZSBvZlxuICogdGhpcyBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIG9uIGJvdGggc2lkZXMgb2YgYSBmcmFtZSBib3VuZGFyeSB0byBmYWNpbGl0YXRlIGNvbW11bmljYXRpb25cbiAqIGluIGJvdGggZGlyZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBib3RoIHRoZSBkaXNwYXRjaGVyIGFuZCB0aGUgbGlzdGVuZXJcbiAqIHBvcnRpb25zLCBidXQgZG9lc24ndCByZXF1aXJlIGNhbGxlcnMgdG8gY2FyZSBhYm91dCBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpbXBsZW1lbnRzIE1lc3NlbmdlciB7XG4gIHByaXZhdGUgdW5yZWdpc3RlckZ1bmN0aW9uPzogKCgpID0+IHZvaWQpO1xuICBwcml2YXRlIGluaXRpYWxpemVNZXNzYWdlSGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZU1lc3Nlbmdlci4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGFzIGEgTWVzc2FnZUxpc3RlbmVyLFxuICAgKiBiZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmcgYW5kIHJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHdoaWNoIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGxpdmVzLiBBbiBvbk1lc3NhZ2UgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcGFyYW0gW290aGVyV2luZG93XSBPcHRpb25hbCBvdGhlcldpbmRvdyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZCB0by5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaW5jb21pbmcgbWVzc2FnZXMgbXVzdCBvcmlnaW5hdGUgZnJvbSBvdGhlcldpbmRvdyB0byBiZSBwYXNzZWQgb25cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd09yaWdpbl0gVGhlIHRhcmdldCBvcmlnaW4gd2hpY2ggb3RoZXJXaW5kb3cgbXVzdCBoYXZlIGluIG9yZGVyIHRvIHJlY2VpdmUgZGlzcGF0Y2hlZCBtZXNzYWdlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgYXMgdGhlIHRhcmdldE9yaWdpbiBvZiBhIHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3Bvc3RNZXNzYWdlKVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhpc1dpbmRvdzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93T3JpZ2luPzogc3RyaW5nKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmdcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VMaXN0ZW5lciBJbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBzdGFydExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSBsaXN0ZW5pbmcsIGlmIG5vdCwgaG9vayB1cCBhIG1lc3NhZ2UgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBib3VuZEhhbmRsZXIgPSB0aGlzLm9uTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLnRoaXNXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9ICgpID0+IHRoaXMudGhpc1dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGxpc3RlbmluZyBpZiB3ZSBoYXZlIHN0YXJ0ZWQgbGlzdGVuaW5nXG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbigpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZURpc3BhdGNoZXIgSW1wbGVtZW50YXRpb25cblxuICAvKipcbiAgICogQHBhcmFtIGFwaVZlcnNpb24gYXBpLWludGVybmFsLWNvbnRyYWN0LWpzIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBjcm9zc0ZyYW1lVmVyc2lvbiBjcm9zc2ZyYW1lIG1lc3NhZ2luZyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IGluaXRpYWxpemF0aW9uIChpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZlxuICAgKiAgICAgICAgICAgICAgICBleHRlcm5hbCBiZWluZyB1c2VkIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoXG4gICAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlciwgY3Jvc3NGcmFtZVZlcnNpb246IFZlcnNpb25OdW1iZXIsIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgICBjcm9zc0ZyYW1lVmVyc2lvbjogY3Jvc3NGcmFtZVZlcnNpb24sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZE1lc3NhZ2UodmVyYklkOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgICAgdmVyYklkOiB2ZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kUmVzcG9uc2VNZXNzYWdlKGNvbW1hbmRHdWlkOiBzdHJpbmcsIGRhdGE6IE1vZGVsIHwgdW5kZWZpbmVkLCBlcnJvcjogTW9kZWwgfCB1bmRlZmluZWQpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgICAgY29tbWFuZEd1aWQ6IGNvbW1hbmRHdWlkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHN0cmluZ2lmeSBlcnJvciBvYmplY3QgdG8gcmVtb3ZlIHVuc2VyaWFsaXphYmxlIGZpZWxkcyBsaWtlIGZ1bmN0aW9ucyBhbmQgcHJldmVudCBzZXJpYWxpemF0aW9uIGVycm9yc1xuICAgICAgbWVzc2FnZS5lcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlTm90aWZpY2F0aW9uTWVzc2FnZShub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQsIGRhdGE6IE1vZGVsKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICAgIG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25JZCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUFja01lc3NhZ2UoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkFjayxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIHBlbmRpbmcgbWVzc2FnZSBmb3Igc2VuZGluZyBhbmQgcmV0dXJucyB0aGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gdGhpcy5vdGhlcldpbmRvd1xuICAgKiBAcmV0dXJucyBUaGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlTWVzc2FnZShtc2c6IE1lc3NhZ2UpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGlmICghdGhpcy5vdGhlcldpbmRvdyB8fCAhdGhpcy5vdGhlcldpbmRvd09yaWdpbikge1xuICAgICAgdGhyb3cgJ090aGVyIHdpbmRvdyBub3QgaW5pdGlhbGl6ZWQsIGNhbm5vdCBkaXNwYXRjaCBtZXNzYWdlcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gbmV3IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UobXNnLCB0aGlzLm90aGVyV2luZG93LCB0aGlzLm90aGVyV2luZG93T3JpZ2luKTtcbiAgICByZXR1cm4gcHJlcGFyZWRNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZC4gRG9lcyBzb21lIHZhbGlkYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGFuZCB0aGVuXG4gICAqIGNhbGxzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaGFuZGxlciBpZiBvbmUgaXMgZGVmaW5lZFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGluY29taW5nIE1lc3NhZ2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBvbk1lc3NhZ2VSZWNlaXZlZChldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGFuIG90aGVyV2luZG93IGRlZmluZWQsIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSB0aGVyZVxuICAgIGlmICh0aGlzLm90aGVyV2luZG93ICYmIGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5vdGhlcldpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHNvbWUgdmFsaWRhdGlvbiBvbiBldmVudC5kYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSByZWFsIG1lc3NhZ2VcbiAgICBpZiAoIWV2ZW50LmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YTtcbiAgICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBtZXNzYWdlIHR5cGUsIHZhbGlkYXRlIHRoZSBtZXNzYWdlLCBhbmQgY2FsbCBhbiBhcHByb3ByaWF0ZSBoYW5kZXIgaWYgb25lIGV4aXN0c1xuICAgIHN3aXRjaCAobWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkluaXRpYWxpemU6IHtcbiAgICAgICAgaWYgKCFpc0luaXRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2U6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOiB7XG4gICAgICAgIGlmICghaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgIGlmICghaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBKdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgbWVzc2FnZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93KG90aGVyV2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93ID0gb3RoZXJXaW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93T3JpZ2luID0gb3JpZ2luO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFByZXBhcmVkTWVzc2FnZSBpbnRlcmZhY2UgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIGJldHdlZW5cbiAqIHR3byBmcmFtZXMgdXNpbmcgd2luZG93LnBvc3RNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIGltcGxlbWVudHMgUHJlcGFyZWRNZXNzYWdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS5cbiAgICogQHBhcmFtIF9tZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIF90YXJnZXQgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSBfb3JpZ2luIFRoZSB0YXJnZXRPcmlnaW4gd2hlcmUgdGhpcyBtZXNzYWdlIGNhbiBiZSByZWNlaXZlZFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NhZ2U6IE1lc3NhZ2UsIHByaXZhdGUgX3RhcmdldDogV2luZG93LCBwcml2YXRlIF9vcmlnaW46IHN0cmluZykge1xuXG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VHdWlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9tZXNzYWdlLm1zZ0d1aWQ7IH1cblxuICBwdWJsaWMgc2VuZCgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIHRoaXMuX3RhcmdldC5wb3N0TWVzc2FnZSh0aGlzLl9tZXNzYWdlLCB0aGlzLl9vcmlnaW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuXG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcblxuLyogdHNsaW50OmRpc2FibGUgbm8tYW55ICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZXNzYWdlKGRhdGE6IE1lc3NhZ2UgfCBhbnkpOiBkYXRhIGlzIE1lc3NhZ2Uge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZGF0YSBhcyBNZXNzYWdlO1xuICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UubXNnR3VpZCB8fCAhbWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChtZXNzYWdlLm1zZ0d1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtZXNzYWdlLm1zZ1R5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZVR5cGVzOiBBcnJheTxzdHJpbmc+ID1cbiAgICBbTWVzc2FnZVR5cGUuQ29tbWFuZCwgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLCBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLCBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZV07XG5cbiAgaWYgKG1lc3NhZ2VUeXBlcy5pbmRleE9mKG1lc3NhZ2UubXNnVHlwZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb24odmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlciB8IGFueSk6IHZlcnNpb25OdW1iZXIgaXMgVmVyc2lvbk51bWJlciB7XG4gIGlmICghdmVyc2lvbk51bWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHYgPSB2ZXJzaW9uTnVtYmVyIGFzIFZlcnNpb25OdW1iZXI7XG5cbiAgaWYgKHR5cGVvZiB2ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygdi5maXggIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1pbm9yICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5tYWpvciAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5pdE1lc3NhZ2UobWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEluaXRpYWxpemVNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpbml0TWVzc2FnZSA9IG1lc3NhZ2UgYXMgSW5pdGlhbGl6ZU1lc3NhZ2U7XG4gIGlmIChpbml0TWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5hcGlWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3JNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlO1xuICBpZiAoY3JNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQoY3JNZXNzYWdlLmNvbW1hbmRHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY3JNZXNzYWdlLmRhdGEgJiYgIWNyTWVzc2FnZS5lcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZE1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmRNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kTWVzc2FnZTtcbiAgaWYgKGNvbW1hbmRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS52ZXJiSWQgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnZlcmJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBOb3RpZmljYXRpb25NZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gbWVzc2FnZSBhcyBOb3RpZmljYXRpb25NZXNzYWdlO1xuICBpZiAobm90aWZpY2F0aW9uTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2UuZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBIYW5kc2hha2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYW5kc2hha2VNZXNzYWdlID0gbWVzc2FnZSBhcyBIYW5kc2hha2VNZXNzYWdlO1xuICBpZiAoaGFuZHNoYWtlTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5IYW5kc2hha2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIsIFZlcmJJZCwgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snXG59XG5cbi8qKlxuICogVGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIHRoZSBvdGhlclxuICogbWVzc2FnZSB0eXBlIGludGVyZmFjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnVHlwZTogTWVzc2FnZVR5cGU7XG59XG5cbi8qKlxuICogVGhlIGluaXRpYWxpemUgbWVzc2FnZSBpcyB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAqIGZyb20gdGhlIGphdmFzY3JpcHQgdG8gc2V0IHVwIGNvbW11bmljYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcGkgd2hpY2ggdGhlIHNlbmRlciB3YW50cyB0byB1c2VcbiAgICovXG4gIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgbWVzc2FnaW5nIGNvbnRyYWN0IHRvIGJlIHVzZWQuIEZvciBub3csIHRoZXJlXG4gICAqIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHZlcnNpb24gYnV0IHNlbmRpbmcgdGhpcyBhbG9uZyBzaG91bGQgaGVscFxuICAgKiBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ldyB2ZXJzaW9uIGluIGEgZnV0dXJlIHJlbGVhc2VcbiAgICovXG4gIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IHRoZSB0aW1lIG9mIGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzIGZyb20gdGhlIHByZXNsYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBmb3IgdGhpcyB0eXBlIG9mIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgbm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB3aGljaCBjYW1lIGFsb25nIHdpdGggdGhlIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgZGF0YTogTW9kZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjYWxsaW5nIGFuIGludGVybmFsIGNvbnRyYWN0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb21tYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgdmVyYklkOiBWZXJiSWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZFxuICAgKi9cbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBDb21tYW5kTWVzc2FnZSB3aXRoIHRoZVxuICogcmVzdWx0IG9mIHRoYXQgY29tbWFuZHMgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEd1aWQgb2YgdGhlIENvbW1hbmRNZXNzYWdlIHdoaWNoIHRoaXMgaXMgaW4gcmVzcG9uc2UgdG9cbiAgICovXG4gIGNvbW1hbmRHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZXR1cm5lZCBmcm9tIHRoZSBjb21tYW5kLCB0aGlzIHdpbGwgYmUgZGVmaW5lZFxuICAgKiBhbmQgY29udGFpbiB0aGUgZXJyb3JcbiAgICovXG4gIGVycm9yPzogTW9kZWw7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGNvbW1hbmQgcmVzdWx0XG4gICAqL1xuICBkYXRhPzogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZHNoYWtlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogSW50ZXJuYWwgQVBJIGNvbnRyYWN0IHZlcnNpb25cbiAgICovXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbn1cbiIsImltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBFeGVjdXRlUGFyYW1ldGVycyB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgaW50ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiovXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzOyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBjb252ZXJ0ZXIgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIGFuZCBleHRlcm5hbCBtb2R1bGVzXG4gKiB0byBzZWVtbGVzc2x5IGNvbW11bmljYXRlIG92ZXIgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJuYWwgQVBJLiBUaGUgb25seVxuICogbW9kZSBpdCBzdXBwb3J0cyBpcyBleHRlcm5hbCdzIHZlcnNpb24gPD0gcGxhdGZvcm0ncyB2ZXJzaW9uLiBXaGVuIGV4ZWN1dGluZ1xuICogY29tbWFuZHMsIGl0IGlzIHVzZWQgdG8gdXBncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgZG93bmdyYWRlIHRoZSByZXByZXNlbnRhdGlvbnMgb24gdGhlIHdheSBvdXQuIFNpbWlsYXJseSBmb3Igbm90aWZpY2F0aW9ucywgaXQgY2FuXG4gKiBkb3duZ3JhZGUgdGhvc2Ugb24gdGhlIHdheSBmcm9tIHBsYXRmb3JtIHRvIGV4dGVybmFsLlxuICovXG5leHBvcnQgY2xhc3MgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgICpcbiAgICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPlxuICApOiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIge1xuICAgIHJldHVybiBuZXcgdGhpcyhcbiAgICAgIGV4dGVybmFsVmVyc2lvbi5tYWpvcixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbi5tYWpvcixcbiAgICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxNYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPikge1xuXG4gICAgaWYgKHRoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9uID4gdGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb259IGFuZCAke3RoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7IH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgdXBncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQudmVyYiwgdXBncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIERvd25ncmFkZSB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IERvd25ncmFkZVdvcmtzaGVldE5hbWVzLCBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQgfSBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChsaHMubWlub3IgPCByaHMubWlub3IpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgbGhzID09IHJocyAoaWdub3JpbmcgZml4IG51bWJlcilcbiAqIEBwYXJhbSBsaHNcbiAqIEBwYXJhbSByaHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFZlcnNpb25FcXVhbFRvKGxoczogVmVyc2lvbk51bWJlciwgcmhzOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAobGhzLm1ham9yID09PSByaHMubWFqb3IpICYmIChsaHMubWlub3IgPT09IHJocy5taW5vcik7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHsgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTsgfVxuXG4vLyBBIG1hcHBpbmcgZnJvbSBhbiBvbGRlciBjbGllbnQgdmVyc2lvbiBvZiBpbnRlcm5hbC1jb250cmFjdCB0byB0aGUgY3VycmVudCBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoaXMgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci4gTm90aWNlIHRoYXQgdGhpcyBpc1xuLy8gZGlmZmVyZW50IHRoYW4gdGhlIG1ham9yIHVwZ3JhZGVzL2Rvd25ncmFkZXMgYWJvdmUgYmVjYXVzZSBpdCBoYW5kbGVzIGJvdGggbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gY2hhbmdlcy5cbi8vIEFsc28gcGxlYXNlIG5vdGU6IGRvd25ncmFkZUV4ZWN1dGVDYWxsIGlzIGhhbmRsZWQgb24gdGhlIGNsaWVudC9leHRlcm5hbCBzaWRlIHJhdGhlciB0aGFuIHBsYXRmb3JtIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gXCJ1cGdyYWRlIGZyb21cIiBvciBcImRvd25ncmFkZSB0b1wiLlxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSwgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IHtcbiAgMToge1xuICAgIDU6IFtEb3duZ3JhZGVXb3Jrc2hlZXROYW1lc10sXG4gICAgOTogW10sXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLFxuICAgIDEwOiBbRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEXVxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgd2hpY2ggaGFzIHRoZSBhYmlsaXR5IHRvIHVwZ3JhZGUgYW5kIGRvd25ncmFkZSB0aGUgY29udHJhY3RcbiAqIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucywgd2hpY2ggYXJlIHNwZWNpZmllZC4gSWYgZXh0ZXJuYWxNYWpvclZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICogYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gYmVjYXVzZSB3ZSB3b24ndCBrbm93IGhvdyB0byBkbyB0aG9zZSBjb252ZXJzaW9ucy5cbiAqIFRoaXMgY29udmVydGVyIGNhbiBoYW5kbGUgYm90aCBtYWpvciBhbmQgbWlub3IgdXBkYXRlcyB3aGVuIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBleHRlcm5hbCB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG5cbiAgcmV0dXJuIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlcyxcbiAgICBFeGVjdXRlTWlub3JEb3duZ3JhZGVzLFxuICAgIE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlcyk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+KTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuXG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IGV4dGVybmFsTWlub3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWlub3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBleGFjdCBzYW1lIHZlcnNpb25zIChtYWpvci5taW5vciksIGp1c3QgdXNlIHRoZSBpZGVudGl0eSBjb252ZXJ0ZXJcbiAgaWYgKFZlcnNpb25FcXVhbFRvKGV4dGVybmFsVmVyc2lvbiwgcGxhdGZvcm1WZXJzaW9uKSkge1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyKCk7XG4gIH1cblxuICAvLyBXYWxrIHRoZSBzcGFuIGJldHdlZW4gdGhlIHZlcnNpb25zIHdlIGhhdmUgaGVyZSBhbmQgY29sbGVjdCB0aGUgdXBncmFkZSBhbmQgZG93bmdyYWRlcyBuZWNlc3NhcnlcbiAgbGV0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPVxuICAgIEdldE5lZWRlZFRyYW5zbGF0aW9ucyhleHRlcm5hbE1ham9yVmVyc2lvbiwgcGxhdGZvcm1NYWpvclZlcnNpb24sIGV4dGVybmFsTWlub3JWZXJzaW9uLCB1cGdyYWRlcyk7XG5cbiAgbGV0IG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPVxuICAgIEdldE5lZWRlZFRyYW5zbGF0aW9ucyhleHRlcm5hbE1ham9yVmVyc2lvbiwgcGxhdGZvcm1NYWpvclZlcnNpb24sIGV4dGVybmFsTWlub3JWZXJzaW9uLCBkb3duZ3JhZGVzKTtcblxuICBsZXQgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4gPVxuICAgIEdldE5lZWRlZFRyYW5zbGF0aW9ucyhleHRlcm5hbE1ham9yVmVyc2lvbiwgcGxhdGZvcm1NYWpvclZlcnNpb24sIGV4dGVybmFsTWlub3JWZXJzaW9uLCBub3RpZmljYXRpb25Eb3duZ3JhZGVzKTtcblxuICAvLyBXZSB3YW50IHRvIGFwcGx5IHRoZSBkb3duZ3JhZGVzIGluIHJldmVyc2Ugb3JkZXIgaW4gY2FzZSBvZiBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtXG4gIG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzLnJldmVyc2UoKTtcbiAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci5mcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbiwgbmVlZGVkRXhlY3V0ZVVwZ3JhZGVzLCBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcywgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZFRyYW5zbGF0aW9uczxUPihcbiAgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlcixcbiAgbWFqb3JNaW5vclRyYW5zbGF0b3JzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VD4pOiBBcnJheTxUPiB7XG5cbiAgbGV0IG5lZWRlZFRyYW5zbGF0aW9uczogQXJyYXk8VD4gPSBbXTtcblxuICBmb3IgKGxldCBtYWpvciA9IGV4dGVybmFsTWFqb3JWZXJzaW9uOyBtYWpvciA8PSBwbGF0Zm9ybU1ham9yVmVyc2lvbjsgbWFqb3IrKykge1xuICAgIGlmIChtYWpvciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICAgIGxldCBzdGFydCA9IChtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24pID8gZXh0ZXJuYWxNaW5vclZlcnNpb24gOiAwO1xuICAgICAgbGV0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdKSk7XG4gICAgICBmb3IgKGxldCBtaW5vciA9IHN0YXJ0OyBtaW5vciA8PSBtYXhpbXVtTWlub3JWZXJzaW9uOyBtaW5vcisrKSB7XG4gICAgICAgIGlmIChtaW5vciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdKSB7XG4gICAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXVttaW5vcl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lZWRlZFRyYW5zbGF0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdldE1heGltdW1NaW5vckluZGV4KG1pbm9yVmVyc2lvbnM6IEFycmF5PHN0cmluZz4pOiBudW1iZXIge1xuICByZXR1cm4gbWlub3JWZXJzaW9ucy5tYXAoKGEpID0+IE51bWJlcihhKSkucmVkdWNlKChhLCBiKSA9PiBhID4gYiA/IGEgOiBiKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeHRlbnNpb25Cb290c3RyYXBJbmZvIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPVxuICAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPVxuICAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9XG4gIChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG5cbi8vIFRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBzdGFydCB0byBkZWZpbmUgc29tZSBvZiB0aGVzZSB0cmFuc2xhdGlvbnMuXG4vLyBXaGVuIG1vZGlmeWluZyBleGlzdGluZyBtb2RlbHMsIGFkZCB0aGUgcmVxdWlzaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhlcmUsIHRoZW4gdXNlIHRoZW1cbi8vIGluIHRoZSBWZXJzaW9uQ29udmVydGVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4gSW1wb3J0IG9sZCB2ZXJzaW9ucyBhcyB5b3Ugd291bGQgYW55IG90aGVyIG1vZHVsZVxuXG4vLyAwIDwtPiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYwIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjAgZnJvbSAnQHRhYmxlYXUtYXBpLWludGVybmFsLWNvbnRyYWN0LWpzX3YwJztcblxuLy8gMSA8LT4gMiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYxIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjEgZnJvbSAnQHRhYmxlYXUtYXBpLWludGVybmFsLWNvbnRyYWN0LWpzX3YxJztcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldE5hbWVzKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcblxuICAvLyBGaXggdGhlIGRhc2hib2FyZCBmcmllbmRseSBuYW1lIGlzc3VlLiBUaGUgc3RydWN0dXJlcyBhcmUgY29tcGF0aWJsZSxcbiAgLy8gc28gd2Ugc3RpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCByZXBseSwgYnV0IHdlIGNvcHkgdGhlIFNoZWV0SW5mby5uYW1lXG4gIC8vIGludG8gdGhlIERhc2hib2FyZFpvbmUubmFtZSwgd2hlcmUgdjEgd2FudHMgdG8gZmluZCBpdC5cblxuICBsZXQgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25EYXNoYm9hcmRJbmZvLnpvbmVzLmZvckVhY2goem9uZSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuXG4gIC8vIEZpeCB0aGUgRmxpcGJvYXJkWm9uZUlkIGlzc3VlLiBPbGRlciBleHRlcm5hbCB2ZXJzaW9ucyBzdGlsbCBjaGVjayBmb3IgZmxpcGJvYXJkWm9uZUlEcy5cbiAgLy8gV2hlbiBydW5uaW5nIGFnYWluc3QgYSBuZXdlciBzZXJ2ZXIsIGlmIGZsaXBib2FyZFpvbmVJZCBpcyBhYnNlbnQsIHNldCBpdCB0byBkZWZhdWx0KDApLlxuXG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkKSB7XG4gICAgbGV0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG4iLCJpbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGV4dGVybmFsIHZlcnNpb24gbnVtYmVyXG4qL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7IH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeGVjdXRlUmVzcG9uc2UsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIGRvd25ncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWQgaXMgZXhlY3V0ZWRcbiAgICogQHBhcmFtIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIG5vdGZpY2F0aW9ucyB0byBwZXJmb3JtIG9uIGV2ZW50c1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgcHJpdmF0ZSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVOb3RpZmljYXRpb24+KSB7XG5cblxuICAgIGlmICh0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3IgPiB0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yfVxuICAgICAgYW5kICR7dGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVyczsgfSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgZG93bmdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZC52ZXJiLCBkb3duZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSByZXNwb25zZSB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgdXBncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVUcmFuc2xhdGlvbih1cGdyYWRlZCwgdmVyYiwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2Ygbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBub3RpZmljYXRpb247XG4gICAgZm9yIChjb25zdCB1cGdyYWRlTm90aWZpY2F0aW9uIG9mIHRoaXMuX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZU5vdGlmaWNhdGlvbih1cGdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNYWpvck1pbm9yVHJhbnNsYXRvcnMsIEdldE1heGltdW1NaW5vckluZGV4LCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNFeHRlcm5hbCBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jLCBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmMsIFVwZ3JhZGVEYXRhVGFibGVUeXBlcywgVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zIH0gZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG5cbi8vIEEgbWFwcGluZyBmcm9tIHRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9uIG9mIGludGVybmFsLWNvbnRyYWN0IHRvIGFuIG9sZGVyIHBsYXRmb3JtIHZlcnNpb24gb2YgdGhlIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuXG4vLyBUaGVzZSB0cmFuc2xhdGlvbnMgaGFuZGxlIGRvd25ncmFkZUV4ZWN1dGVDYWxsIGFuZCB1cGdyYWRlRXhlY3V0ZVJldHVybiBhbmQgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBvbiB0aGVcbi8vIGNsaWVudC9leHRlcm5hbCBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvICd1cGdyYWRlIGZyb20nIG9yICdkb3duZ3JhZGUgdG8nLlxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZUNhbGxFeHRlcm5hbDogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHB1dCBkb3duZ3JhZGVzIGZyb20gMS4xMCB0byAxLjkgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgICAxMzogW0Rvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYywgRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jXSxcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbDogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IHtcbiAgMToge1xuICAgIDk6IFtVcGdyYWRlRGF0YVRhYmxlVHlwZXNdLCAgICAgICAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgICAyOTogW1VwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1uc10sIC8vIDIwMjEuMSB3YXMgcmVsZWFzZWQgd2l0aCAxLjI5LiBVcGdyYWRlIGZyb20gMS4yOSBpbiB0aGUgWzFdWzI5XSBidWNrZXRcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGVcbiAqIHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMgd2hpY2ggYXJlIHNwZWNpZmllZC4gSWYgZXh0ZXJuYWxNYWpvclZlcnNpb24gaXMgbGVzcyB0aGFuXG4gKiBwbGF0Zm9ybU1ham9yVmVyc2lvbiwgYW4gRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEhhbmRsZXMgdXBncmFkZS9kb3duZ3JhZGUgZm9yIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcblxuICByZXR1cm4gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIEV4ZWN1dGVNaW5vckRvd25ncmFkZUNhbGxFeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlUmV0dXJuRXh0ZXJuYWwsXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZU5vdGlmaWNhdGlvblxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4pXG4gIDogRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuXG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGxldCBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZTogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID1cbiAgICBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhwbGF0Zm9ybU1ham9yVmVyc2lvbiwgcGxhdGZvcm1NaW5vclZlcnNpb24sIGRvd25ncmFkZXMpO1xuXG4gIGxldCBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPiA9XG4gICAgR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMocGxhdGZvcm1NYWpvclZlcnNpb24sIHBsYXRmb3JtTWlub3JWZXJzaW9uLCB1cGdyYWRlcyk7XG5cbiAgbGV0IG5lZWRlZE5vdGlmaWNhdGlvblVwZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9XG4gICAgR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMocGxhdGZvcm1NYWpvclZlcnNpb24sIHBsYXRmb3JtTWlub3JWZXJzaW9uLCB1cGdyYWRlTm90aWZpY2F0aW9ucyk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24sIG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlLCBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsIG5lZWRlZE5vdGlmaWNhdGlvblVwZ3JhZGVzKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnM8VD4oXG4gIHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gIHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIsXG4gIG1ham9yTWlub3JUcmFuc2xhdG9yczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+KTogQXJyYXk8VD4ge1xuXG4gIGxldCBuZWVkZWRUcmFuc2xhdGlvbnM6IEFycmF5PFQ+ID0gW107XG5cbiAgaWYgKHBsYXRmb3JtTWFqb3JWZXJzaW9uIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgIGxldCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGxldCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXSkpO1xuICAgIGZvciAobGV0IG1pbm9yID0gc3RhcnQ7IG1pbm9yIDw9IG1heGltdW1NaW5vclZlcnNpb247IG1pbm9yKyspIHtcbiAgICAgIGlmIChtaW5vciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSB7XG4gICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl1bbWlub3JdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZGVkVHJhbnNsYXRpb25zO1xufVxuIiwiaW1wb3J0IHtcbiAgQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLFxuICBEYXRhSGVhZGVyLFxuICBEYXRhVGFibGUsXG4gIERhdGFUeXBlQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBJbnRlcm5hbFRhYmxlYXVFcnJvcixcbiAgTm90aWZpY2F0aW9uLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2VsZWN0ZWRNYXJrc1RhYmxlLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlLFxuICBWZXJiSWRcbn0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgbmV3ZXIgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZUNhbGwgPVxuICAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb25cbiAqICBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGEgY29udGV4dCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuXG4qL1xuZXhwb3J0IHR5cGUgVXBncmFkZUV4ZWN1dGVSZXR1cm4gPVxuICAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIHVwZ3JhZGUgaXQgdG8gZXh0ZXJuYWwncyB2ZXJzaW9uICovXG5leHBvcnQgdHlwZSBVcGdyYWRlTm90aWZpY2F0aW9uID1cbiAgKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PiBOb3RpZmljYXRpb247XG5cbi8vIDEuMiAtPiAxLjAgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbi8qKlxuICogUHJpb3IgdG8gMjAxOS4yIChpbnRlcm5hbC1jb250cmFjdCB2MS45KSwgRGF0YVZhbHVlLnZhbHVlIHdlcmUgYWxsIHN0cmluZ3MuXG4gKiBHbyB0aHJvdWdoIGFsbCBEYXRhVmFsdWUgb2JqZWN0cy4gSWYgd2UgaGF2ZSBhIHN0cmluZywgYnV0IHRoZSB0eXBlIHNob3VsZCBub3QgYmUgYSBzdHJpbmcsXG4gKiBjb252ZXJ0IGl0IHRvIHRoZSBjb3JyZWN0IHR5cGUuIFRoZSB0eXBlIG9mIERhdGFWYWx1ZS52YWx1ZSBpcyAnYW55JyBpbiB0aGUgY29udHJhY3QsIHNvXG4gKiB0aGlzIGNoYW5nZSBkb2Vzbid0IG5lZWQgYW55IHVwZGF0ZXMgdG8gY2xhc3NlcyBvciB0eXBlcy5cbiovXG5leHBvcnQgZnVuY3Rpb24gVXBncmFkZURhdGFUYWJsZVR5cGVzKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKCFleGVjdXRlUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgbGV0IG9sZFVuZGVybHlpbmdEYXRhVGFibGUgPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gIGlmIChvbGRVbmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlLmlzU3VtbWFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29udmVydERhdGFWYWx1ZXMob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhKTtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgbGV0IG9sZFNlbGVjdGVkTWFya3NUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICBpZiAob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhKSkge1xuICAgIG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhLmZvckVhY2gobWFya3NUYWJsZSA9PiB7XG4gICAgICBjb252ZXJ0RGF0YVZhbHVlcyhtYXJrc1RhYmxlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuLyoqXG4gKiBQcmlvciB0byAyMDIwLjIgKGludGVybmFsLWNvbnRyYWN0IHYxLjEzIGFuZCBvbGRlciksIHdvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMgZG9lc24ndCBleGlzdC5cbiAqIE1hcCBpdCB0byB0aGUgb2xkZXIgR2V0VW5kZXJseWluZ0RhdGEgdmVyYiBhbmQgdmFsaWRhdGUgdGhlIHRoZSBsb2dpY2FsIHRhYmxlIElkLlxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYyh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzXG59IHtcbiAgaWYgKHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhKSB7XG4gICAgdmFsaWRhdGVQYXJhbWV0ZXJzRm9yT2JqZWN0TW9kZWwodmVyYiwgcGFyYW1ldGVycyk7XG4gICAgdmVyYiA9IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZlcmI6IHZlcmIsXG4gICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICB9O1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjAuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMTMgYW5kIG9sZGVyKSwgZGF0YXNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMgZG9lc24ndCBleGlzdC5cbiAqIE1hcCBpdCB0byB0aGUgb2xkZXIgR2V0RGF0YVNvdXJjZURhdGEgdmVyYiBhbmQgdmFsaWRhdGUgdGhlIHRoZSBsb2dpY2FsIHRhYmxlIElkLlxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luYyh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzXG59IHtcbiAgaWYgKHZlcmIgPT09IFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhKSB7XG4gICAgdmFsaWRhdGVQYXJhbWV0ZXJzRm9yT2JqZWN0TW9kZWwodmVyYiwgcGFyYW1ldGVycyk7XG4gICAgdmVyYiA9IFZlcmJJZC5HZXREYXRhU291cmNlRGF0YTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZlcmI6IHZlcmIsXG4gICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGF0YVZhbHVlcyh0YWJsZTogRGF0YVRhYmxlKTogdm9pZCB7XG4gIC8vIGRhdGFUYWJsZSBpcyBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBkYXRhLiBGaXJzdCBpbmRleCBpcyB0aGUgcm93LCBzZWNvbmQgaXMgdGhlIGNvbHVtbi5cbiAgaWYgKHRhYmxlID09PSB1bmRlZmluZWQgfHwgdGFibGUuZGF0YVRhYmxlID09PSB1bmRlZmluZWQgfHwgIUFycmF5LmlzQXJyYXkodGFibGUuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRhYmxlLmRhdGFUYWJsZS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgcm93LmZvckVhY2goKGRhdGFWYWx1ZSwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGRhdGFWYWx1ZS52YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBkYXRhVmFsdWUudmFsdWUgPSBEYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHRhYmxlLmhlYWRlcnNbY29sdW1uSW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIFRvRG86IFRGUzEwNjkwMjcgUmVmYWN0b3IgaW5wdXQgdmVyYnMgJiBwYXJhbWV0ZXJzIGluIGFwaS1pbnRlcm5hbC1jb250cmFjdCBVcGdyYWRlL0Rvd25ncmFkZSBmcmFtZXdvcmtcbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB2b2lkIHtcbiAgaWYgKHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdICE9PSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2dpY2FsIHRhYmxlIGlkIHBhc3NlZCB0byAke3ZlcmJ9LmApIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMS4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4yOSBhbmQgYmVsb3cpLCBnZXRTdW1tYXJ5RGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBtYXhSb3dzLFxuICogYW5kIGFueSBnZXQuLi5EYXRhQXN5bmMgZGlkIG5vdCBzdXBwb3J0IGNvbHVtbnNUb0luY2x1ZGVCeUlkLlxuICogVHJpbSByZXN1bHQgdG8gbWF4Um93cyBpZiBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgZ2V0U3VtbWFyeURhdGFBc3luY1xuICogVHJpbSBjb2x1bW5zIHRvIGNvbHVtbnNUb0luY2x1ZGUgaWYgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBnZXQuLi5EYXRhQXN5bmNcbiovXG5leHBvcnQgZnVuY3Rpb24gVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zKFxuICBleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSxcbiAgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmIChpc0dldFN1bW1hcnlEYXRhVmVyYih2ZXJiKSAmJiBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdKSB7XG4gICAgZXhlY3V0ZVJlc3BvbnNlID0gYWRqdXN0RGF0YVJvd0xlbmd0aChleGVjdXRlUmVzcG9uc2UsIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTWF4Um93c10gYXMgbnVtYmVyKTtcbiAgfVxuXG4gIGlmIChpc0dldFRhYmxlRGF0YVZlcmIodmVyYikgJiYgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0pIHtcbiAgICBleGVjdXRlUmVzcG9uc2UgPSBhZGp1c3REYXRhQ29sdW1ucyhleGVjdXRlUmVzcG9uc2UsIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdIGFzIHN0cmluZ1tdKTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGlzR2V0U3VtbWFyeURhdGFWZXJiKHZlcmI6IFZlcmJJZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyYiA9PT0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbn1cblxuZnVuY3Rpb24gaXNHZXRUYWJsZURhdGFWZXJiKHZlcmI6IFZlcmJJZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyYiA9PT0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YVxuICAgIHx8IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhXG4gICAgfHwgdmVyYiA9PT0gVmVyYklkLkdldExvZ2ljYWxUYWJsZURhdGFcbiAgICB8fCB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGFcbiAgICB8fCB2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG59XG5cbmZ1bmN0aW9uIGFkanVzdERhdGFSb3dMZW5ndGgoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIG1heFJvd3M6IG51bWJlcik6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGxldCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBpZiAobWF4Um93cyA+IDAgJiYgbWF4Um93cyA8IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoKSB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5sZW5ndGggPSBtYXhSb3dzO1xuICB9XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBjb2x1bW5zVG9JbmNsdWRlOiBzdHJpbmdbXSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmIChjb2x1bW5zVG9JbmNsdWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICAvLyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgVW5kZXJseWluZ0RhdGFUYWJsZVxuICBsZXQgdW5kZXJseWluZ0RhdGFUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgaWYgKCF1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgfHwgIUFycmF5LmlzQXJyYXkodW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZSkgfHwgIUFycmF5LmlzQXJyYXkodW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmhlYWRlcnMpKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIC8vIDEuIGZpbHRlciB0aGUgaGVhZGVycyB0byBvbmx5IGNvbHVtbnNUb0luY2x1ZGVcbiAgLy8gMi4gdXNlIHRoZSBuZXcgaGVhZGVycyB0byBmaWx0ZXIgYWxsIHJvd3NcbiAgLy8gMy4gdXBkYXRlIHRoZSBpbmRpY2VzIGluIG91ciBuZXcgaGVhZGVyc1xuICBsZXQgbmV3SGVhZGVyczogRGF0YUhlYWRlcltdXG4gICAgPSB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycy5maWx0ZXIoKGhlYWRlciwgaW5kZXgpID0+IGNvbHVtbnNUb0luY2x1ZGUuZmluZChuYW1lID0+IG5hbWUgPT09IGhlYWRlci5maWVsZE5hbWUpKTtcbiAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZVtpbmRleF1cbiAgICAgID0gcm93LmZpbHRlcigodmFsdWUsIHZhbHVlSW5kZXgpID0+IG5ld0hlYWRlcnMuZmluZEluZGV4KGhlYWRlciA9PiBoZWFkZXIuaW5kZXggPT09IHZhbHVlSW5kZXgpICE9PSAtMSk7XG4gIH0pO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycyA9IG5ld0hlYWRlcnMubWFwKGhlYWRlciA9PiB7IGhlYWRlci5pbmRleCA9IG5ld0luZGV4Kys7IHJldHVybiBoZWFkZXI7IH0pO1xuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXNoYm9hcmQnO1xuZXhwb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9FdmVudExpc3RlbmVyTWFuYWdlcic7XG5leHBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9TaW5nbGVFdmVudE1hbmFnZXInO1xuZXhwb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9BcGlTaGFyZWQvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IEFwaVZlcnNpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9BcGlWZXJzaW9uJztcbmV4cG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9WZXJzaW9uTnVtYmVyJztcblxuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9FdmVudHMvVGFibGVhdUV2ZW50JztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbCc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuL0FwaVNoYXJlZC9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9SZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmV4cG9ydCB7IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciB9IGZyb20gJy4vVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyJztcbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlckNvbnRyYWN0IH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyQ29udHJhY3QnO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZXRvbiB3cmFwcGVyIG9mIFZlcnNpb25OdW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVZlcnNpb24ge1xuXG4gIC8vIFVzaW5nIHNvbWUgd2VicGFjayB0cmlja3MsIHdlIGNhbiBpbmplY3QgdGhpcyB2ZXJzaW9uIGludG8gb3VyIGNvZGUgKGtpbmRhIGxpa2UgYysrIHByZXByb2Nlc3NvciBzdHVmZilcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBWZXJzaW9uTnVtYmVyQ29udHJhY3Q7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgdmVyc2lvbiBudW1iZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICAgIHJldHVybiBBcGlWZXJzaW9uLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgU2V0VmVyc2lvbk51bWJlcihudW1TdHJpbmc6IHN0cmluZywgaXNBbHBoYTogYm9vbGVhbik6IHZvaWQge1xuICAgIEFwaVZlcnNpb24uX2luc3RhbmNlID0gbmV3IFZlcnNpb25OdW1iZXIobnVtU3RyaW5nLCBpc0FscGhhKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnkgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgY29ubmVjdGlvbiBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25uZWN0aW9uSW5mbzogQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXJ2ZXJVUkkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8uc2VydmVyVVJJO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnR5cGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBDcm9zc0ZyYW1lTWVzc2VuZ2VyLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IENyb3NzRnJhbWVEaXNwYXRjaGVyIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lRGlzcGF0Y2hlcic7XG5cbi8vIENoZWNrcyB0byBzZWUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYW4gaWZyYW1lIGN1cnJlbnRseTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMyNjA3Ni84ODIxMTUzXG5mdW5jdGlvbiBpbklmcmFtZSh0aGlzV2luZG93OiBXaW5kb3cpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpc1dpbmRvdy5zZWxmICE9PSB0aGlzV2luZG93LnBhcmVudDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gYm9vdHN0cmFwIHRoZSBleHRlbnNpb24gd2l0aCBhIGNyb3NzLWZyYW1lIHBhcmVudCB3aGVyZSBUYWJsZWF1IGlzIHJ1bm5pbmdcbiAqXG4gKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IHdoaWNoIHdlIGFyZSBydW5uaW5nIGluIChpbmplY3RlZCBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzKVxuICogQHBhcmFtIGludGVybmFsQ29udHJhY3RWZXJzaW9uIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2UgYXJlIHVzaW5nXG4gKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggaXMgZG9pbmcgdGhlIGFjdHVhbCBib290c3RyYXBwaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb0Nyb3NzRnJhbWVCb290c3RyYXAoXG4gIHRoaXNXaW5kb3c6IFdpbmRvdywgaW50ZXJuYWxDb250cmFjdFZlcnNpb246IENvbnRyYWN0LlZlcnNpb25OdW1iZXIsIG9wdGlvbnM6IEluaXRpYWxpemF0aW9uT3B0aW9ucylcbiAgOiBQcm9taXNlPENvbnRyYWN0LkludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+IHtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9XG4gICAgICBtZXNzZW5nZXIucHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiwgQXBpTWVzc2FnaW5nVmVyc2lvbiwgb3B0aW9ucyk7XG5cbiAgICAvLyBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIHBhcmVudCwgd2UgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBndWlkcyBtYXRjaCBhbmQgdGhlbiB3ZSBrbm93XG4gICAgLy8gdGhhdCB0aGUgcGFyZW50IGlzIGF3YXJlIG9mIHVzIGFuZCB3ZSBjYW4gc3RhcnQgY29tbXVuaWNhdGluZ1xuICAgIG1lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihmdW5jdGlvbiAobXNnOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG5cbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG5cbiAgICAgICAgLy8gVGhlIHZlcnNpb25pbmcgb2YgdGhlIGRpc3BhdGNoZXIgaGFwcGVucyBvbiB0aGUgb3RoZXIgc2lkZSBvZiBvdXIgZnJhbWUsIGFuZFxuICAgICAgICAvLyBpbiBhIHdyYXBwZXIgb24gdGhpcyBzaWRlLiBUaGlzIG9uZSBkb2Vzbid0IGhhdmUgYW55IHZlcnNpb24ga25vd2xlZGdlLlxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyRmFjdG9yeSA9ICgpID0+IG5ldyBDcm9zc0ZyYW1lRGlzcGF0Y2hlcihtZXNzZW5nZXIpO1xuICAgICAgICByZXNvbHZlKGRpc3BhdGNoZXJGYWN0b3J5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE5vdyB0aGF0IG91ciBoYW5kbGVycyBhcmUgcmVhZHksIHN0YXJ0IGxpc3RlbmluZyBhbmQgc2VuZCBvdXIgaW5pdGlhbGl6YXRpb24gbWVzc2FnZVxuICAgIG1lc3Nlbmdlci5zdGFydExpc3RlbmluZygpO1xuICAgIGluaXRpYWxpemF0aW9uTWVzc2FnZS5zZW5kKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSGFuZGxlcixcbiAgVmVyYklkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSwgTWVzc2VuZ2VyLCBOb3RpZmljYXRpb25NZXNzYWdlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgaW50ZXJmYWNlIHdoaWNoIGZ1bmN0aW9ucyBieSBwYXNzaW5nIG1lc3NhZ2VzXG4gKiBhY3Jvc3MgYSBmcmFtZSBib3VuZGFyeS4gVGhpcyBpcyB1c3VhbGx5IGJldHdlZW4gdGhlIGNvZGUgd2hlcmUgb3VyIGphdnNjcmlwdCBsaWJyYXJ5IGhhcyBiZWVuIGluY2x1ZGVkXG4gKiBieSBhIDNyZCBwYXJ0eSBkZXYgYW5kIGFub3RoZXIgZnJhbWUgd2hlcmUgVGFibGVhdSBzZXJ2ZXIgaGFzIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEludGVybmFsQXBpRGlzcGF0Y2hlciB7XG5cbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczpcbiAgICB7IFttZXNzYWdlR3VpZDogc3RyaW5nXTogeyByZXNvbHZlOiAocmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gdm9pZCwgcmVqZWN0OiAoZXJyb3I6IE1vZGVsKSA9PiB2b2lkIH0gfSA9IHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIC8vIFNhdmUgb2ZmIHRoZSBwZW5kaW5nIHByb21pc2UgYnkgdGhlIG1lc3NhZ2VHdWlkIHdlIGFyZSBhYm91dCB0byBzZW5kLiBXaGVuIGEgcmVzcG9uc2UgaXNcbiAgICAgIC8vIHJlY2VpdmVkLCB3ZSdsbCBiZSBhYmxlIHRvIHJlc29sdmUgdGhpcyBwcm9taXNlIHdpdGggdGhlIHJlc3VsdFxuICAgICAgdGhpcy5fcGVuZGluZ1Byb21pc2VzW3ByZXBhcmVkTWVzc2FnZS5tZXNzYWdlR3VpZF0gPSB7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH07XG4gICAgfSk7XG5cbiAgICAvLyBBY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIHByb21pc2VcbiAgICBwcmVwYXJlZE1lc3NhZ2Uuc2VuZCgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5maWx0ZXIoaCA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZ25vcmUgdGhpcy4gV3JhcCBpbiB0cnkvY2F0Y2ggc28gaWYgb25lIGhhbmRsZXIgZXJyb3JzLCB0aGUgb3RoZXIgc3RpbGwgZ2V0IHRoZSBtZXNzYWdlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9JbXBsL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwpIHtcbiAgICBzdXBlcihfZGFzaGJvYXJkSW1wbCk7XG4gICAgX2Rhc2hib2FyZEltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRzKCk6IEFycmF5PENvbnRyYWN0LldvcmtzaGVldD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLndvcmtzaGVldHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8Q29udHJhY3QuRGFzaGJvYXJkT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwub2JqZWN0cztcbiAgfVxuXG4gIHB1YmxpYyBzZXRab25lVmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRGFzaGJvYXJkLFxuICAgIHByaXZhdGUgX3R5cGU6IERhc2hib2FyZE9iamVjdFR5cGUsXG4gICAgcHJpdmF0ZSBfcG9zaXRpb246IENvbnRyYWN0LlBvaW50LFxuICAgIHByaXZhdGUgX3NpemU6IENvbnRyYWN0LlNpemUsXG4gICAgcHJpdmF0ZSBfd29ya3NoZWV0OiBDb250cmFjdC5Xb3Jrc2hlZXQgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXJcbiAgKSB7IH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5Xb3Jrc2hlZXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHsgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRzKCk6IEFycmF5PENvbnRyYWN0LkZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucmVmcmVzaEFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PiB7XG4gICAgY29uc29sZS53YXJuKCdEYXRhU291cmNlLmdldEFjdGl2ZVRhYmxlc0FzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldEFjdGl2ZVRhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOlxuICAgIFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKCdEYXRhU291cmNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICdEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyBhbmQgRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBvcHRpb25zKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuaW1wb3J0IHtcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBFeHRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgRXh0ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBGaWx0ZXJEb21haW5UeXBlIGFzIEludGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBJbnRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0XG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cblxuLyogdHNsaW50OmRpc2FibGU6dHlwZWRlZiAtIERpc2FibGUgdGhpcyB0byBtYWtlIGRlY2xhcmluZyB0aGVzZSBjbGFzc2VzIGEgYml0IGVhc2llciAqL1xuLyoqXG4gKiBNYXBzIGVudW1zIHVzZWQgYnkgdGhlIGV4dGVybmFsLWFwaS1jb250cmFjdCB0byB0aGUgZW51bXMgdXNlZFxuICogaW4gdGhlIGludGVybmFsLWFwaS1jb250cmFjdCwgd2hpY2ggZGV2ZWxvcGVycyBjb2RlIGFnYWluc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Mge1xuICBwdWJsaWMgc3RhdGljIGZpbHRlckRvbWFpblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERvbWFpblR5cGUsIEludGVybmFsRG9tYWluVHlwZT4oe1xuICAgIFtFeHRlcm5hbERvbWFpblR5cGUuUmVsZXZhbnRdOiBJbnRlcm5hbERvbWFpblR5cGUuUmVsZXZhbnQsXG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5EYXRhYmFzZV06IEludGVybmFsRG9tYWluVHlwZS5EYXRhYmFzZVxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXNcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZVxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFZpc2liaWxpdHlUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8Wm9uZVZpc2liaWxpdHlUeXBlLCBCb29sZWFuPih7XG4gICAgW1pvbmVWaXNpYmlsaXR5VHlwZS5TaG93XTogdHJ1ZSxcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLkhpZGVdOiBmYWxzZVxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHlcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIENvbHVtblR5cGUgYXMgRXh0ZXJuYWxDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlIGFzIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGF0YVR5cGUgYXMgRXh0ZXJuYWxEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlIGFzIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBDb2x1bW5UeXBlIGFzIEludGVybmFsQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSBhcyBJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlIGFzIEludGVybmFsRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCBhcyBJbnRlcm5hbERhdGVTdGVwUGVyaW9kLFxuICBEb21haW5SZXN0cmljdGlvblR5cGUgYXMgSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsXG4gIEVycm9yQ29kZXMgYXMgSW50ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgSW50ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBJbnRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXJcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Nb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zTW9kZSwgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZT4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmdcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjb2x1bW5UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxDb2x1bW5UeXBlLCBFeHRlcm5hbENvbHVtblR5cGU+KHtcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXNdOiBFeHRlcm5hbENvbHVtblR5cGUuQ29udGludW91cyxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDEsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3NdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW1dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRSb2xlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRSb2xlVHlwZSwgRXh0ZXJuYWxGaWVsZFJvbGVUeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZV06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNoZWV0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsU2hlZXRUeXBlLCBFeHRlcm5hbFNoZWV0VHlwZT4oe1xuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmRdOiBFeHRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmQsXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLlN0b3J5XTogRXh0ZXJuYWxTaGVldFR5cGUuU3RvcnksXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLldvcmtzaGVldF06IEV4dGVybmFsU2hlZXRUeXBlLldvcmtzaGVldFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXRcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0YVR5cGUsIEV4dGVybmFsRGF0YVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5Cb29sXTogRXh0ZXJuYWxEYXRhVHlwZS5Cb29sLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZVRpbWVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGVUaW1lLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkZsb2F0XTogRXh0ZXJuYWxEYXRhVHlwZS5GbG9hdCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5JbnRdOiBFeHRlcm5hbERhdGFUeXBlLkludCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZ1xuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dhYmxlVmFsdWVzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlPih7XG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkFsbF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuTGlzdF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLlJhbmdlXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHNcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlUmFuZ2VUeXBlLCBFeHRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3JDb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFcnJvckNvZGVzLCBFeHRlcm5hbEVycm9yQ29kZXM+KHtcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOSVRJQUxJWkFUSU9OX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19FTlVNX01BUFBJTkddOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfUEFSQU1FVEVSXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5VTktOT1dOX1ZFUkJfSURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WSVNJQklMSVRZX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLlZpc2liaWxpdHlFcnJvcixcbiAgfSwgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IpO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVHlwZSwgRXh0ZXJuYWxGaWx0ZXJUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9TaW5nbGVFdmVudE1hbmFnZXInO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIENsYXNzIGRlc2lnbmVkIHRvIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIGhhbmRsZXJzIGZyb20gYSB1c2VyLiBPbmx5IHRob3NlIGV2ZW50c1xuICogd2hpY2ggYXJlIGFkZGVkIHZpYSBBZGROZXdFdmVudFR5cGUgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5FdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50TGlzdGVuZXJNYW5hZ2VyczogeyBbdGFibGVhdUV2ZW50VHlwZTogc3RyaW5nXTogU2luZ2xlRXZlbnRNYW5hZ2VyOyB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSxcbiAgICBoYW5kbGVyOiBDb250cmFjdC5UYWJsZWF1RXZlbnRIYW5kbGVyRm4pOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCBhZGQgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5hZGRFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBoYW5kbGVyOiBDb250cmFjdC5UYWJsZWF1RXZlbnRIYW5kbGVyRm4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgcmVtb3ZlIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGROZXdFdmVudFR5cGUoZXZlbnRNYW5hZ2VyOiBTaW5nbGVFdmVudE1hbmFnZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRNYW5hZ2VyLmV2ZW50VHlwZV0gPSBldmVudE1hbmFnZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIEZpbHRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LldvcmtzaGVldCwgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLkZpbHRlckNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0LmdldEZpbHRlcnNBc3luYygpLnRoZW48Q29udHJhY3QuRmlsdGVyPihmaWx0ZXJzID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IChmaWx0ZXIuZmllbGROYW1lID09PSB0aGlzLl9maWVsZE5hbWUpKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuTWFya3NTZWxlY3RlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMud29ya3NoZWV0LmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlLCBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nLCBzaGVldDogQ29udHJhY3QuU2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQsIHNoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4ge1xuICAgIC8vIENhbGwgZG93biB0byBvdXIgc2VydmljZSB0byBnZXQgdGhlIHBhcmFtZXRlciBiYWNrIHZpYSBpdHMgZmllbGQgbmFtZVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgdGhpcy5zaGVldCkudGhlbihwYXJhbWV0ZXIgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nUGFyYW1ldGVyLCBgQ2Fubm90IGZpbmQgcGFyYW1ldGVyOiAke3RoaXMuX2dsb2JhbEZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmFtZXRlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdUV2ZW50IHtcbiAgcHJpdmF0ZSBfdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVTaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVNoZWV0RXZlbnQge1xuICBwcml2YXRlIF9zaGVldDogQ29udHJhY3QuU2hlZXQ7XG5cbiAgcHVibGljIGdldCBzaGVldCgpOiBDb250cmFjdC5TaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIHNoZWV0OiBDb250cmFjdC5TaGVldCkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpcy5fc2hlZXQgPSBzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSwgQ29sdW1uVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ltcGwvRmllbGRJbXBsJztcblxuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRmllbGQgaW1wbGVtZW50cyBDb250cmFjdC5GaWVsZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEltcGw6IEZpZWxkSW1wbCkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuYWdncmVnYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwucm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYWxjdWxhdGVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NhbGN1bGF0ZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb2x1bW5UeXBlIHtcbiAgICB0aHJvdyBFcnJvckhlbHBlcnMuYXBpTm90SW1wbGVtZW50ZWQoJ0ZpZWxkLmNvbHVtblR5cGUnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb21iaW5lZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDb21iaW5lZEZpZWxkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4uL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBFeHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICBTaGVldFBhdGgsXG4gIFZpc3VhbElkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL1BvaW50JztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTaXplIH0gZnJvbSAnLi4vU2l6ZSc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Xb3Jrc2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfd29ya3NoZWV0czogQXJyYXk8Q29udHJhY3QuV29ya3NoZWV0PjtcbiAgcHJpdmF0ZSBfb2JqZWN0czogQXJyYXk8Q29udHJhY3QuRGFzaGJvYXJkT2JqZWN0PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgcHJpdmF0ZSBfc2hlZXRQYXRoOiBTaGVldFBhdGgpIHtcbiAgICBzdXBlcihuZXcgU2hlZXRJbmZvSW1wbChfaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCBuZXcgU2l6ZShfaW5mby5zaXplLmgsIF9pbmZvLnNpemUudykpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0cztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxDb250cmFjdC5EYXNoYm9hcmRPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0cztcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGFzaGJvYXJkOiBDb250cmFjdC5EYXNoYm9hcmQpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShkYXNoYm9hcmQsICdkYXNoYm9hcmQnKTtcblxuICAgIHRoaXMuX3dvcmtzaGVldHMgPSBuZXcgQXJyYXk8V29ya3NoZWV0PigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8Q29udHJhY3QuRGFzaGJvYXJkT2JqZWN0PigpO1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHpvbmVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhpcyBkYXNoYm9hcmRcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5faW5mby56b25lcykge1xuICAgICAgbGV0IHdvcmtzaGVldDogV29ya3NoZWV0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB6b25lU2l6ZSA9IG5ldyBTaXplKHpvbmUuaGVpZ2h0LCB6b25lLndpZHRoKTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgICAgbGV0IHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mbyA/IHpvbmUuc2hlZXRJbmZvLm5hbWUgOiB6b25lLm5hbWU7XG4gICAgICAgIGNvbnN0IHNoZWV0SW5mbyA9IG5ldyBTaGVldEluZm9JbXBsKHdvcmtzaGVldE5hbWUsIFNoZWV0VHlwZS5Xb3Jrc2hlZXQsIHpvbmVTaXplKTtcbiAgICAgICAgY29uc3Qgdml6SWQ6IFZpc3VhbElkID0ge1xuICAgICAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICAgICAgICBkYXNoYm9hcmQ6IHRoaXMuX2luZm8ubmFtZSxcbiAgICAgICAgICBzdG9yeWJvYXJkOiB0aGlzLl9zaGVldFBhdGguc3Rvcnlib2FyZCxcbiAgICAgICAgICBmbGlwYm9hcmRab25lSUQ6IHRoaXMuX3NoZWV0UGF0aC5mbGlwYm9hcmRab25lSUQsXG4gICAgICAgICAgc3RvcnlQb2ludElEOiB0aGlzLl9zaGVldFBhdGguc3RvcnlQb2ludElEXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKHNoZWV0SW5mbywgdml6SWQsIGRhc2hib2FyZCk7XG4gICAgICAgIHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgICAgIHRoaXMuX3dvcmtzaGVldHMucHVzaCh3b3Jrc2hlZXQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3QgPSBuZXcgRGFzaGJvYXJkT2JqZWN0KFxuICAgICAgICBkYXNoYm9hcmQsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldCxcbiAgICAgICAgem9uZS5uYW1lLFxuICAgICAgICAoem9uZS5pc0Zsb2F0aW5nICE9PSB1bmRlZmluZWQpID8gem9uZS5pc0Zsb2F0aW5nIDogZmFsc2UsICAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNGbG9hdGluZywgc28gd2UgYXNzdW1lIGZhbHNlXG4gICAgICAgICh6b25lLmlzVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSA/IHpvbmUuaXNWaXNpYmxlIDogdHJ1ZSwgICAgIC8vIGJlZm9yZSAxLjYuMCB3ZSBkaWRuJ3QgaGF2ZSBpc1Zpc2libGUsIHNvIHdlIGFzc3VtZSB0cnVlXG4gICAgICAgIHpvbmUuem9uZUlkXG4gICAgICApO1xuXG4gICAgICB0aGlzLl9vYmplY3RzLnB1c2goZGFzaGJvYXJkT2JqZWN0KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5zZXRWaXNpYmlsaXR5QXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy5vYmplY3RzLCB6b25lVmlzaWJpbGl0eU1hcCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vRmllbGRJbXBsJztcblxuaW1wb3J0IHsgQ29ubmVjdGlvblN1bW1hcnkgfSBmcm9tICcuLi9Db25uZWN0aW9uU3VtbWFyeSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL0ZpZWxkJztcbmltcG9ydCB7IFRhYmxlU3VtbWFyeSB9IGZyb20gJy4uL1RhYmxlU3VtbWFyeSc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VJbXBsIHtcbiAgcHJpdmF0ZSBfZmllbGRzOiBBcnJheTxGaWVsZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGFTb3VyY2VJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UpIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcChmaWVsZE1vZGVsID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgdGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4dHJhY3RVcGRhdGVUaW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmV4dHJhY3RVcGRhdGVUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4dHJhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlzRXh0cmFjdDtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmModGhpcy5fZGF0YVNvdXJjZUluZm8uaWQpLnRoZW48Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4oc3VtbWFyaWVzID0+IHtcbiAgICAgIHJldHVybiBzdW1tYXJpZXMubWFwKHN1bW1hcnkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmModGhpcy5fZGF0YVNvdXJjZUluZm8uaWQpLnRoZW48QXJyYXk8Q29udHJhY3QuVGFibGVTdW1tYXJ5Pj4odGFibGVJbmZvcyA9PiB7XG4gICAgICByZXR1cm4gdGFibGVJbmZvcy5tYXAodGFibGVJbmZvID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcblxuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsICAgICAgIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOlxuICAgIFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsICAgICAgIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlJbnRlcm5hbFZhbHVlKGRhdGFTb3VyY2UsICdkYXRhU291cmNlJyk7XG5cbiAgICB0aGlzLl9maWVsZHMgPSB0aGlzLl9kYXRhU291cmNlSW5mby5maWVsZHMubWFwKGZpZWxkTW9kZWwgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCBkYXRhU291cmNlKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KGxvZ2ljYWxUYWJsZUluZm9zID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAobG9naWNhbFRhYmxlSW5mbyA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmllbGRBZ2dyZWdhdGlvblR5cGUsIEZpZWxkUm9sZVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBGaWVsZEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkZpZWxkLFxuICAgIHByaXZhdGUgX3BhcmVudERhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpIHsgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkQWdncmVnYXRpb25UeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLmFnZ3JlZ2F0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkUm9sZVR5cGUuY29udmVydCh0aGlzLl9maWVsZEluZm8ucm9sZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGF0YVR5cGUsIFRhYmxlYXVFdmVudFR5cGUsIFBlcmlvZFR5cGUsIFBhcmFtZXRlclZhbHVlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQsIFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFBhcmFtZXRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuLi9TaW5nbGVFdmVudE1hbmFnZXInO1xuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCB9IGZyb20gJy4vU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5cbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbykge1xuICAgIHRoaXMuc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBEYXRhVmFsdWUge1xuICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodGhpcy5fcGFyYW1ldGVySW5mby5jdXJyZW50VmFsdWUsIHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRhVHlwZS5jb252ZXJ0KHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nbG9iYWxGaWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93YWJsZVZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8RGF0YVZhbHVlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihuZXdWYWx1ZSwgJ25ld1ZhbHVlJyk7XG5cbiAgICBsZXQgY29lcmNlZFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUobmV3VmFsdWUpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnNTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyc1NlcnZpY2UuY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUsIGNvZXJjZWRWYWx1ZSkudGhlbihwYXJhbWV0ZXJJbmZvID0+IHtcbiAgICAgIHRoaXMuc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvKTtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgYWxsIG9mIHRoZSBldmVudCBtYW5hZ2VycyB3ZSdsbCBuZWVkIChvbmUgZm9yIGVhY2ggZXZlbnQgdHlwZSlcbiAgICBjb25zdCBwYXJhbWV0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFBhcmFtZXRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihOb3RpZmljYXRpb25JZC5QYXJhbWV0ZXJDaGFuZ2VkLCAobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG1vZGVsIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgICB9LCAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHBhcmFtZXRlckV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50KGZpZWxkTmFtZSwgc2hlZXQpKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdHMucHVzaChwYXJhbWV0ZXJFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5fcGFyYW1ldGVySW5mbyA9IHBhcmFtZXRlckluZm87XG4gICAgdGhpcy5fZ2xvYmFsRmllbGROYW1lID0gcGFyYW1ldGVySW5mby5maWVsZE5hbWU7XG5cbiAgICBjb25zdCB0eXBlID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmFsbG93YWJsZVZhbHVlcy5jb252ZXJ0KHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzVHlwZSk7XG4gICAgbGV0IGxpc3RWYWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1pblZhbHVlOiBEYXRhVmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1heFZhbHVlOiBEYXRhVmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0ZXBTaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRhdGVTdGVwUGVyaW9kOiBQZXJpb2RUeXBlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGUgPT09IFBhcmFtZXRlclZhbHVlVHlwZS5MaXN0KSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlcyB8fCBbXTtcbiAgICAgIGxpc3RWYWx1ZXMgPSB2YWx1ZXMubWFwKHZhbCA9PiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodmFsLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UpIHtcbiAgICAgIG1pblZhbHVlID0gcGFyYW1ldGVySW5mby5taW5WYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5taW5WYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBtYXhWYWx1ZSA9IHBhcmFtZXRlckluZm8ubWF4VmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWF4VmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgc3RlcFNpemUgPSBwYXJhbWV0ZXJJbmZvLnN0ZXBTaXplO1xuICAgICAgZGF0ZVN0ZXBQZXJpb2QgPSBwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kICYmXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QpO1xuICAgIH1cblxuICAgIHRoaXMuX2FsbG93YWJsZVZhbHVlcyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhbGxvd2FibGVWYWx1ZXM6IGxpc3RWYWx1ZXMsXG4gICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICBzdGVwU2l6ZTogc3RlcFNpemUsXG4gICAgICBkYXRlU3RlcFBlcmlvZDogZGF0ZVN0ZXBQZXJpb2RcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBTaGVldEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCkge1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IFNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lOiBzdHJpbmcsIHNoZWV0OiBDb250cmFjdC5TaGVldCk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2hlZXQsICdzaGVldCcpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKHBhcmFtZXRlck5hbWUsIHNoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoc2hlZXQ6IENvbnRyYWN0LlNoZWV0KTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyh0aGlzLnNoZWV0UGF0aCwgc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2hlZXRUeXBlOiBTaGVldFR5cGUsXG4gICAgcHJpdmF0ZSBfc2hlZXRTaXplOiBTaXplXG4gICkgeyB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hlZXROYW1lOiB0aGlzLm5hbWUsXG4gICAgICBpc0Rhc2hib2FyZDogdGhpcy5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmRcbiAgICAgIC8vIFRPRE8gLSBTdG9yaWVzXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuLi9TaW5nbGVFdmVudE1hbmFnZXInO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgU2luZ2xlRXZlbnRNYW5hZ2VyIGludGVyZmFjZSBmb3IgYSBzaW5nbGUgdHlwZSBvZiBUYWJsZWF1IGV2ZW50XG4gKlxuICogQHRlbXBsYXRlIFRFdmVudFR5cGUgVGhlIFRhYmxlYXUgZXZlbnQgdHlwZSB0aGlzIGNsYXNzIHNwZWNpYWxpemVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFRFdmVudFR5cGUgZXh0ZW5kcyBDb250cmFjdC5UYWJsZWF1RXZlbnQ+IGltcGxlbWVudHMgU2luZ2xlRXZlbnRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlO1xuICBwcml2YXRlIF9oYW5kbGVyczogQXJyYXk8KGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlKSB7XG4gICAgdGhpcy5fZXZlbnRUeXBlID0gZXZlbnRUeXBlO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV2ZW50VHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRUeXBlO1xuICB9XG5cbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogQ29udHJhY3QuVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuIHtcbiAgICB0aGlzLl9oYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBib29sZWFuIHtcbiAgICBjb25zdCBiZWZvcmVDb3VudCA9IHRoaXMuX2hhbmRsZXJzLmxlbmd0aDtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzLmZpbHRlcihoID0+IGggIT09IGhhbmRsZXIpO1xuICAgIHJldHVybiBiZWZvcmVDb3VudCA+IHRoaXMuX2hhbmRsZXJzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyRXZlbnQoZXZlbnRHZW5lcmF0b3I6ICgpID0+IFRFdmVudFR5cGUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TW9kZWwgPSBldmVudEdlbmVyYXRvcigpO1xuICAgICAgICBoYW5kbGVyKGV2ZW50TW9kZWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGhhbmRsZXIgY291bGQgYmUgb3V0c2lkZSBvdXIgY29udHJvbCwganVzdCBjYXRjaCBhbnl0aGluZyBpdCB0aHJvd3MgYW5kIGNvbnRpbnVlIG9uXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VsZWN0aW9uVXBkYXRlVHlwZSwgVGFibGVhdUV2ZW50VHlwZSwgRmlsdGVyVXBkYXRlVHlwZSwgRmlsdGVyTnVsbE9wdGlvbiwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhdGFTY2hlbWEsXG4gIERhdGFTb3VyY2UgYXMgRGF0YVNvdXJjZUluZm8sXG4gIEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCxcbiAgVmlzdWFsSWQsXG4gIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9EYXRhU291cmNlJztcbmltcG9ydCB7IFdvcmtzaGVldCB9IGZyb20gJy4uL1dvcmtzaGVldCc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuXG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IE1hcmtzU2VsZWN0ZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQnO1xuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcblxuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSwgR2V0RGF0YVR5cGUgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvTm90aWZpY2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcblxuY29uc3QgdmlzdWFsSWRzQXJlRXF1YWwgPSBmdW5jdGlvbiAoYTogVmlzdWFsSWQsIGI6IFZpc3VhbElkKTogYm9vbGVhbiB7XG4gIHJldHVybiBhICYmIGIgJiZcbiAgICBhLndvcmtzaGVldCA9PT0gYi53b3Jrc2hlZXQgJiZcbiAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICBhLnN0b3J5Ym9hcmQgPT09IGIuc3Rvcnlib2FyZCAmJlxuICAgIGEuc3RvcnlQb2ludElEID09PSBiLnN0b3J5UG9pbnRJRDtcbn07XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZDogQ29udHJhY3QuRGFzaGJvYXJkKSB7XG4gICAgc3VwZXIoc2hlZXRJbmZvSW1wbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBDb250cmFjdC5EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyh3b3Jrc2hlZXQ6IFdvcmtzaGVldCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkLCAobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IHZpc3VhbElkID0gbW9kZWwgYXMgVmlzdWFsSWQ7XG4gICAgICByZXR1cm4gdmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMudmlzdWFsSWQpO1xuICAgIH0sICh2aXo6IFZpc3VhbElkKSA9PiB7XG4gICAgICBtYXJrc0V2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgTWFya3NTZWxlY3RlZEV2ZW50KHdvcmtzaGVldCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxGaWx0ZXJDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuRmlsdGVyQ2hhbmdlZCwgKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJFdmVudFJlc3BvbnNlID0gbW9kZWwgYXMgRmlsdGVyRXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcy52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgIH0sIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgIGZpbHRlckV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRmlsdGVyQ2hhbmdlZEV2ZW50KHdvcmtzaGVldCwgZXZlbnQuZmllbGROYW1lKSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHRzLnB1c2gobWFya3NFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKGZpbHRlckV2ZW50KTtcblxuICAgIC8vIFRPRE8gLSBvdGhlciBldmVudCB0eXBlc1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc3VhbElkKCk6IFZpc3VhbElkIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzdWFsSWQ7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZywgdmFsdWVzOiBBcnJheTxzdHJpbmc+LCB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLCBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIEZpbHRlclVwZGF0ZVR5cGUsICdGaWx0ZXJVcGRhdGVUeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbikge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJOdWxsT3B0aW9uPihmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24sIEZpbHRlck51bGxPcHRpb24sICdGaWx0ZXJOdWxsT3B0aW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZVBhcmFtVHlwZShmaWx0ZXJPcHRpb25zLm1pbiwgZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXREYXRhU291cmNlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+KHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICBjb25zdCB3b3Jrc2hlZXREYXRhU291cmNlSW5mbzogV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gPSBkYXRhU2NoZW1hLndvcmtzaGVldERhdGFTY2hlbWFNYXBbdGhpcy5uYW1lXTtcblxuICAgICAgbGV0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBsZXQgcHJpbWFyeUlkOiBzdHJpbmcgPSB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5wcmltYXJ5RGF0YVNvdXJjZTtcbiAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1twcmltYXJ5SWRdKSk7XG5cbiAgICAgIC8vIFRoZW4sIGxvb3AgdGhyb3VnaCBhbnkgc2Vjb25kYXJ5IGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBmb3IgKGxldCBzZWNvbmRhcnlJZCBvZiB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5yZWZlcmVuY2VkRGF0YVNvdXJjZUxpc3QpIHtcbiAgICAgICAgaWYgKHNlY29uZGFyeUlkICE9PSBwcmltYXJ5SWQpIHtcbiAgICAgICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXNbc2Vjb25kYXJ5SWRdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmlsdGVyc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5TdW1tYXJ5LFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5VbmRlcmx5aW5nLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4obG9naWNhbFRhYmxlSW5mb3MgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcChsb2dpY2FsVGFibGVJbmZvID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTpcbiAgICBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0TWFya3NCeUlkQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbyk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxvZ2ljYWwgdGFibGUuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5Mb2dpY2FsVGFibGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9naWNhbFRhYmxlOiBMb2dpY2FsVGFibGVJbmZvKSB7IH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuY2FwdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmlsdGVyVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgUGVyaW9kVHlwZSwgRGF0ZVJhbmdlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJvdGVjdGVkIF9maWVsZElkOiBzdHJpbmcpIHtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEZpZWxkQXN5bmModGhpcy5fZmllbGRJZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHByaXZhdGUgX2FwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sXG4gICAgcHJpdmF0ZSBfaXNFeGNsdWRlTW9kZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkPzogYm9vbGVhbikge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkLCBkb21haW5UeXBlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfaW5jbHVkZU51bGxWYWx1ZXM6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJpdmF0ZSBfYW5jaG9yRGF0ZTogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX3BlcmlvZFR5cGU6IFBlcmlvZFR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlTjogbnVtYmVyKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sXG4gICAgcHJpdmF0ZSBfZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSkge1xuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9tYXg6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbigpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heCgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1hcmtUeXBlLCBEYXRhVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlIHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXRhOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PixcbiAgICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHByaXZhdGUgX3RvdGFsUm93Q291bnQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9pc1RvdGFsUm93Q291bnRMaW1pdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzU3VtbWFyeURhdGE6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+KSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLFxuICAgIHByaXZhdGUgX2NvbG9yOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfdHVwbGVJZD86IE51bWJlclxuICApIHsgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IE51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyKSB7IH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNSZWZlcmVuY2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1JlZmVyZW5jZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9mb3JtYXR0ZWRWYWx1ZT86IHN0cmluZykgeyB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmF0aXZlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFZhbHVlO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCIvKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbn1cblxuLyoqXG4gKiBSYW5nZSBiYXNlZCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbmdlU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBtaW5WYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgbWF4VmFsdWU6IHN0cmluZztcbiAgcHVibGljIGluY2x1ZGVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbn1cbi8qKlxuICogVHVwbGUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXBsZVNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdGlvblR5cGU6IHN0cmluZztcbiAgcHVibGljIG9iamVjdElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lciBjbGFzcyB0byBwb3B1bGF0ZSBhbGwgdGhlIHNlbGVjdGlvbiBtb2RlbHMgd2hlbiBwYXJzaW5nIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICBwdWJsaWMgaGllck1vZGVsQXJyOiBBcnJheTxIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIGRpbU1vZGVsQXJyOiBBcnJheTxEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHF1YW50TW9kZWxBcnI6IEFycmF5PFJhbmdlU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb246IFR1cGxlU2VsZWN0aW9uTW9kZWw7XG59XG4iLCJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vRXZlbnRMaXN0ZW5lck1hbmFnZXInO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vSW1wbC9QYXJhbWV0ZXJJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGFyYW1ldGVyIGNvbnRyYWN0LiBDYWxscyBkb3duIHRvIHRoZSBpbXBsXG4gKiBjbGFzcyBmb3IgYWxtb3N0IGFsbCBvZiB0aGUgd29yayBpdCBkb2VzLlxuICovXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5QYXJhbWV0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJhbWV0ZXJJbXBsOiBQYXJhbWV0ZXJJbXBsLCBzaGVldDogQ29udHJhY3QuU2hlZXQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLnBhcmFtZXRlckltcGwuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaChlID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmRhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxvd2FibGVWYWx1ZXMoKTogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7IH1cblxuICBwdWJsaWMgZ2V0IHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgeSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl95O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnXG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBsb2dpYyBmb3IgdmFyaW91cyBnZXREYXRhIGNhbGxzXG4gKlxuICogQGludGVyZmFjZSBHZXREYXRhU2VydmljZVxuICogQGV4dGVuZHMge0FwaVNlcnZpY2V9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2UgZXh0ZW5kcyBBcGlTZXJ2aWNlIHtcblxuICAvKipcbiAgICogR2V0cyB0aGUgbGltaXQgb2Ygcm93cyBmb3IgZ2V0VW5kZXJseWluZ0RhdGFBc3luY1xuICAgKi9cbiAgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGRhdGEgZm9yIGEgcGFydGljdWxhciB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtHZXREYXRhVHlwZX0gZ2V0VHlwZSAgVGhlIHR5cGUgb2YgZ2V0RGF0YSBjYWxsIHRvIG1ha2VcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIG9yIG5vdCBhbGlhc2VzIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIG9yIG5vdCBzZWxlY3Rpb24gc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgU2hvdWxkIGFsbCBjb2x1bW5zIGJlIGluY2x1ZGVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzICBNYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHVyblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZ2V0VHlwZTogR2V0RGF0YVR5cGUsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgKi9cbiAgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgKi9cbiAgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBXaGV0aGVyIHRvIGluY2x1ZGUgYWxsIGNvbHVtbnMgb3Igb25seSB0aGUgcmVmZXJlbmNlZCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgKi9cbiAgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+Pjtcbn1cbiIsImltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRmlsdGVyU2VydmljZUltcGwnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIFZlcnNpb25OdW1iZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1BhcmFtZXRlcnNTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBab25lU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvWm9uZVNlcnZpY2VJbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgRGF0YVNvdXJjZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHBsYXRmb3JtVmVyc2lvbikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBHZXREYXRhU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBGaWx0ZXJTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlclNlcnZpY2UobmV3IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgUGFyYW1ldGVyc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgU2VsZWN0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbiBhcGkgc2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIHNlcnZpY2UgbmFtZSB3aGljaCB3aWxsIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGFwaS1zaGFyZWQgcHJvamVjdFxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZXJ2aWNlTmFtZXMge1xuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBab25lID0gJ3pvbmUtc2VydmljZSdcbn1cblxuLyoqXG4gKiBEbyBzb21lIGdsb2JhYmwgZGVjbGFyYXRpb25zIHNvIHdlIGNhbiBjcmVhdGUgYSBzaW5nbGV0b24gb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHsgX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnkgfCB1bmRlZmluZWQ7IH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlOyB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZXJ2aWNlcyA9IHt9O1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZCB7XG4gICAgdGhpcy5fc2VydmljZXNbc2VydmljZS5zZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUIHtcbiAgICBpZiAoIXRoaXMuX3NlcnZpY2VzLmhhc093blByb3BlcnR5KHNlcnZpY2VOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBTZXJ2aWNlIG5vdCByZWdpc3RlcmVkOiAke3NlcnZpY2VOYW1lfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gYXMgVDtcbiAgfVxufVxuXG4vKipcbiAqIHN0YXRpYyBjbGFzcyB1c2VkIGZvciBnZXR0aW5nIGFjY2VzcyB0byB0aGUgc2luZ2xlIGluc3RhbmNlXG4gKiBvZiB0aGUgQXBpU2VydmljZVJlZ2lzdHJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBTZXJ2aWNlUmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IFNlcnZpY2VSZWdpc3RyeSB7XG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5KSB7XG4gICAgICBBcGlTZXJ2aWNlUmVnaXN0cnkuc2V0SW5zdGFuY2UobmV3IFNlcnZpY2VSZWdpc3RyeUltcGwoKSk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1NlcnZpY2UgcmVnaXN0cnkgZmFpbGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgcmVnaXN0cnkgaW5zdGFuY2UuIENhbiBiZSB1c2VkIGJ5IHVuaXQgdGVzdHNcbiAgICpcbiAgICogQHBhcmFtIHtTZXJ2aWNlUmVnaXN0cnl9IHNlcnZpY2VSZWdpc3RyeSBUaGUgbmV3IHJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEluc3RhbmNlKHNlcnZpY2VSZWdpc3RyeT86IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSBzZXJ2aWNlUmVnaXN0cnk7XG4gIH1cblxuICAvLyBQcml2YXRlIHRvIGF2b2lkIGFueW9uZSBjb25zdHJ1Y3RpbmcgdGhpc1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkgeyB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSxcbiAgRGF0YVNjaGVtYSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgTG9naWNhbFRhYmxlSW5mbyxcbiAgUGFyYW1ldGVySWQsXG4gIFRhYmxlSW5mbyxcbiAgVGFibGVJbmZvcyxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5cbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vLi4vRmllbGQnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YVNvdXJjZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuXG5leHBvcnQgY29uc3QgU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPOiBMb2dpY2FsVGFibGVJbmZvID0ge1xuICBpZDogSW50ZXJuYWxDb250cmFjdC5BcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCxcbiAgY2FwdGlvbjogSW50ZXJuYWxDb250cmFjdC5BcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVDYXB0aW9uXG59O1xuXG5leHBvcnQgY2xhc3MgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRGF0YVNvdXJjZVNlcnZpY2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwcml2YXRlIF9wbGF0Zm9ybVZlcnNpb246IEludGVybmFsQ29udHJhY3QuVmVyc2lvbk51bWJlcikge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBqb2luUGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQgfTtcblxuICAgIC8vIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhYmxlcyB1c2VkIGJ5IHRoaXMgY29ubmVjdGlvblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFjdGl2ZVRhYmxlcywgam9pblBhcmFtZXRlcnMpLnRoZW48QXJyYXk8VGFibGVJbmZvPj4oam9pblJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlSW5mb3MgPSBqb2luUmVzcG9uc2UucmVzdWx0IGFzIFRhYmxlSW5mb3M7XG5cbiAgICAgIC8vIGdldEFjdGl2ZVRhYmxlcyBpcyB1bnN1cHBvcnRlZCBmb3IgY3ViZXMgYW5kIEdBLiBXZSBkbyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24gdHlwZSBwcm9wZXJ0eVxuICAgICAgLy8gYXZhaWxhYmxlIGZyb20gdGhlIHBsYXRmb3JtIChpbnRlbnRpb25hbGx5LCB0byByZWR1Y2UgY29kZSBjaHVybiBhcyBuZXcgY29ubmVjdGlvbnMgYXJlIGFkZGVkKS5cbiAgICAgIC8vIEluc3RlYWQsanVzdCBjaGVjayBpZiBhbnkgdGFibGVzIGFyZSByZXR1cm5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBhbnkgbm9uLXRhYmxlIGJhc2VkIGRhdGFzb3VyY2UuXG4gICAgICBpZiAodGFibGVJbmZvcy50YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlLFxuICAgICAgICAgIGBnZXRBY3RpdmVUYWJsZXMgaXMgbm90IHN1cHBvcnRlZCBmb3I6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGVJbmZvcy50YWJsZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPERhdGFTY2hlbWE+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHsgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQgfTtcblxuICAgIC8vIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhYmxlcyB1c2VkIGJ5IHRoaXMgY29ubmVjdGlvblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcywgcGFyYW1zKS50aGVuPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25TdW1tYXJpZXMgPSByZXNwb25zZS5yZXN1bHQgYXMgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uU3VtbWFyaWVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoZ2xvYmFsZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWVsZEFuZERhdGFTb3VyY2U7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSByZXNwb25zZS5yZXN1bHRbUGFyYW1ldGVySWQuRGF0YVNvdXJjZV0gYXMgRGF0YVNvdXJjZTtcbiAgICAgIGNvbnN0IGZpZWxkID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkZpZWxkXSBhcyBGaWVsZDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGaWVsZChmaWVsZCwgdGhpcy5jb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGEuXG4gICAgICAgKiBPbmNlIHRoZSBkZXNrdG9wIGlzIHVwZ3JhZGVkIHRvIGEgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIG9iamVjdCBtb2RlbCxcbiAgICAgICAqIHRoZSBzZW50aW5lbCBJRCB3aWxsIGF1dG9tYXRpY2FsbHkgZmV0Y2ggdGhlIHVwZ3JhZGVkIHRhYmxlLlxuICAgICAgICogKi9cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc29sdmUpID0+XG4gICAgICAgIHJlc29sdmUoW1NFTlRJTkVMX0xPR0lDQUxfVEFCTEVfSU5GT10pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KHJlc3BvbnNlID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBpZiAoIXRoaXMuaXNPYmplY3RNb2RlbFN1cHBvcnRlZEJ5UGxhdGZvcm0oKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIHNlbnRpbmVsIElEIGNhbiBiZSBwYXNzZWQgdG8gd29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGEuXG4gICAgICAgKiBPbmNlIHRoZSBkZXNrdG9wIGlzIHVwZ3JhZGVkIHRvIGEgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIG9iamVjdCBtb2RlbCxcbiAgICAgICAqIHRoZSBzZW50aW5lbCBJRCB3aWxsIGF1dG9tYXRpY2FsbHkgZmV0Y2ggdGhlIHVwZ3JhZGVkIHRhYmxlLlxuICAgICAgICogKi9cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc29sdmUpID0+XG4gICAgICAgIHJlc29sdmUoW1NFTlRJTkVMX0xPR0lDQUxfVEFCTEVfSU5GT10pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmllbGQoZmllbGQ6IEludGVybmFsQ29udHJhY3QuRmllbGQsIGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5GaWVsZCB7XG4gICAgcmV0dXJuIG5ldyBGaWVsZChuZXcgRmllbGRJbXBsKGZpZWxkLCBkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2U6IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgICBsZXQgcGxhdGZvcm1WZXJzaW9uTm9PYmplY3RNb2RlbFN1cHBvcnQgPSB7IG1ham9yOiAxLCBtaW5vcjogMTMsIGZpeDogMCB9O1xuICAgIHJldHVybiBJbnRlcm5hbENvbnRyYWN0LlZlcnNpb25MZXNzVGhhbihwbGF0Zm9ybVZlcnNpb25Ob09iamVjdE1vZGVsU3VwcG9ydCwgdGhpcy5fcGxhdGZvcm1WZXJzaW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIEVycm9yQ29kZXNcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuXG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRmlsdGVyVHlwZSxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEludGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuXG5pbXBvcnQge1xuICBDYXRlZ29yaWNhbERvbWFpbixcbiAgQ2F0ZWdvcmljYWxGaWx0ZXIsXG4gIFJhbmdlRG9tYWluLFxuICBSYW5nZUZpbHRlcixcbiAgUmVsYXRpdmVEYXRlRmlsdGVyXG59IGZyb20gJy4uLy4uL01vZGVscy9GaWx0ZXJNb2RlbHMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5cbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBGaWx0ZXJTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5RmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9XG4gICAgICAoZmlsdGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZSA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJhbmdlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5UmFuZ2VGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcblxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4ocmVzcG9zbmUgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWx0ZXJzO1xuICAgIGxldCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KHJlc3BvbnNlID0+IHtcbiAgICAgIGxldCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWVcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPihyZXNwb25zZSA9PiB7XG4gICAgICBsZXQgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5nZURvbWFpbkFzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0UmFuZ2VEb21haW47XG4gICAgbGV0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWVcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPihyZXNwb25zZSA9PiB7XG4gICAgICBsZXQgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcbiAgcHJpdmF0ZSBjb252ZXJ0RG9tYWluRmlsdGVycyhkb21haW5GaWx0ZXJzOiBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj4pOiBBcnJheTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICBsZXQgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaChkb21haW5GaWx0ZXIgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQ2F0ZWdvcmljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgbGV0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSYW5nZUZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFJhbmdlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGU6IHtcbiAgICAgICAgICBsZXQgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGxldCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoZHYgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkdik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IENhdGVnb3JpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNFeGNsdWRlLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5taW4pO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLlJhbmdlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgbGV0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihcbiAgICBkb21haW46IEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4sXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBsZXQgdmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+ID0gZG9tYWluLnZhbHVlcy5tYXAoKGRvbWFpbkR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkR2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IENhdGVnb3JpY2FsRG9tYWluKHZhbHVlcywgZG9tYWluVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZURvbWFpbihkb21haW46IEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW4sIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gICAgbGV0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGxldCBtYXg6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRG9tYWluKFxuICAgICAgbWluLFxuICAgICAgbWF4LFxuICAgICAgZG9tYWluVHlwZVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEhpZ2hsaWdodGVkTWFya3NUYWJsZSxcbiAgUGFyYW1ldGVySWQsXG4gIFNlbGVjdGVkTWFya3NUYWJsZSxcbiAgVW5kZXJseWluZ0RhdGFUYWJsZSxcbiAgVmVyYklkLFxuICBWaXN1YWxJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5cbmV4cG9ydCBjbGFzcyBHZXREYXRhU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBHZXREYXRhU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwcml2YXRlIGdldExpbWl0ZWRNYXhSb3dzKHJlcXVlc3RlZFJvd3M6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgcm93Q291bnRMaW1pdCA9IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgcmV0dXJuIChyZXF1ZXN0ZWRSb3dzID4gMCAmJiByZXF1ZXN0ZWRSb3dzIDwgcm93Q291bnRMaW1pdCkgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICAvLyBDcmVhdGUgYWxsIG9mIG91ciBwYXJhbWV0ZXJzXG4gICAgY29uc3QgdmVyYiA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnkgPyBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhIDogVmVyYklkLkdldFVuZGVybHlpbmdEYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RNYXhSb3dzID0gdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdEYXRhID8gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzKSA6IG1heFJvd3M7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc10gPSBpZ25vcmVBbGlhc2VzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXSA9IGlnbm9yZVNlbGVjdGlvbjtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXSA9IGluY2x1ZGVBbGxDb2x1bW5zO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdID0gdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTWF4Um93c10gPSByZXF1ZXN0TWF4Um93cztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdID0gRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCByZXNwb25zZURhdGEuaXNTdW1tYXJ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+IHtcbiAgICAvLyBDcmVhdGUgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciBHZXREYXRhVHlwZSBvZiBTdW1tYXJ5IHdpdGggMSByb3csIGFuZCBvbmx5IG5hdGl2ZSB2YWx1ZXNcbiAgICAvLyBUaGVuIHJldHVybiBqdXN0IHRoZSBjb2x1bW5zXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiB0cnVlLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogMSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVWYWx1ZXNPbmx5XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxBcnJheTxDb250cmFjdC5Db2x1bW4+PihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICBjb25zdCBkYXRhVGFibGUgPSB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdDtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkYXRhVGFibGUuaGVhZGVycy5tYXAoaCA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLFxuICAgICAgICBoLmZpZWxkTmFtZSxcbiAgICAgICAgaC5kYXRhVHlwZSxcbiAgICAgICAgaC5pc1JlZmVyZW5jZWQsXG4gICAgICAgIGguaW5kZXgpKTtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLmRhdGEubWFwKHRhYmxlID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEhpZ2hsaWdodGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLmRhdGEubWFwKHRhYmxlID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXTogbG9naWNhbFRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogaWdub3JlU2VsZWN0aW9uLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cyksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gY29sdW1ucyBtdXN0IGJlIGEgdmFsaWQgYXJyYXlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnY29sdW1uc1RvSW5jbHVkZSBhbmQgY29sdW1uc1RvSW5jbHVkZUJ5SWQgbXVzdCBiZSB2YWxpZCBhcnJheXMnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgaW5wdXQgYXJyYXlcbiAgICBjb25zdCBjb2x1bW5zQXNTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChjb2x1bW5zKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoaCA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLFxuICAgICAgaC5maWVsZE5hbWUsXG4gICAgICBoLmRhdGFUeXBlLFxuICAgICAgaC5pc1JlZmVyZW5jZWQsXG4gICAgICBoLmluZGV4KSk7XG5cbiAgICAvLyBUT0RPIFRoaXMgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGFwaSB3aWxsIHJlc3BvbmQgbWFya3MgaW5mbyBvciBub3RcbiAgICBsZXQgbWFya3M7XG4gICAgaWYgKHJlc3BvbnNlRGF0YS5tYXJrcykge1xuICAgICAgbWFya3MgPSByZXNwb25zZURhdGEubWFya3MubWFwKGggPT4gbmV3IE1hcmtJbmZvKGgudHlwZSxcbiAgICAgICAgaC5jb2xvcixcbiAgICAgICAgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgLy8gTGltaXQrMSBpcyBvdXIgc2VudGluYWwgdGhhdCB1bmRlcmx5aW5nIGRhdGEgY29udGFpbnMgbW9yZSByb3dzIHRoYW4gdXNlciBpcyBhbGxvd2VkIHRvIGZldGNoLlxuICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IHNvIHdlIGFsd2F5cyByZXR1cm4gTWF4Um93TGltaXRcbiAgICBjb25zdCBpc1RvdGFsUm93Q291bnRMaW1pdGVkID0gaXNTdW1tYXJ5ID09PSBmYWxzZSAmJiByZXNwb25zZURhdGEuZGF0YVRhYmxlLmxlbmd0aCA9PT0gdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMTtcbiAgICBpZiAoaXNUb3RhbFJvd0NvdW50TGltaXRlZCkge1xuICAgICAgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggLT0gMTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubWFwKHJvdyA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBNb2RlbCwgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UsIFVucmVnaXN0ZXJGbiB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcblxuY2xhc3MgUmVnaXN0cmF0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ZpbHRlckZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLFxuICAgIHByaXZhdGUgX2NhbGxiYWNrRm46IChub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpID0+IHZvaWQpIHtcbiAgICAvLyBOb3RoaW5nIEhlcmVcbiAgfVxuXG4gIHB1YmxpYyBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyRm4obm90aWZpY2F0aW9uTW9kZWwpKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja0ZuKG5vdGlmaWNhdGlvbk1vZGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIGltcGxlbWVudHMgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiB7IFtub3RpZmljYXRpb25JZDogc3RyaW5nXTogQXJyYXk8UmVnaXN0cmF0aW9uPiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikge1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge307XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogTm90aWZpY2F0aW9uSWQsIGZpbHRlckZuOiAobW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobW9kZWw6IE1vZGVsKSA9PiB2b2lkKTogVW5yZWdpc3RlckZuIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzW2lkXSB8fCBuZXcgQXJyYXk8UmVnaXN0cmF0aW9uPigpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IG5ldyBSZWdpc3RyYXRpb24oZmlsdGVyRm4sIGhhbmRsZXIpO1xuICAgIGhhbmRsZXJzLnB1c2gocmVnaXN0cmF0aW9uKTtcbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSBoYW5kbGVycztcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVSZWdpc3RyYXRpb24oaWQsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZDogTm90aWZpY2F0aW9uSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdvIHRocm91Z2ggYW5kIGNoZWNrIGZvciBhbGwgdGhlIGhhbmRsZXJzIG9mIHRoaXMgcGFydGljdWxhciBub3RpZmljYXRpb25cbiAgICB0aGlzLl9oYW5kbGVyc1tub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWRdLmZvckVhY2goaCA9PiBoLm9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbi5kYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlZ2lzdHJhdGlvbihpZDogTm90aWZpY2F0aW9uSWQsIHJlZ2lzdHJhdGlvbjogUmVnaXN0cmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSB0aGlzLl9oYW5kbGVyc1tpZF0uZmlsdGVyKHJlZyA9PiByZWcgIT09IHJlZ2lzdHJhdGlvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIE1vZGVsLFxuICBQYXJhbWV0ZXJJZCxcbiAgUGFyYW1ldGVySW5mbyxcbiAgU2hlZXRQYXRoLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgUGFyYW1ldGVyc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHNoZWV0UGF0aDogU2hlZXRQYXRoLCBzaGVldDogQ29udHJhY3QuU2hlZXQpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlcj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0UGF0aF06IHNoZWV0UGF0aFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRQYXJhbWV0ZXJzRm9yU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gVE9ETyAtIENoZWNrIGZvciBlcnJvclxuXG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8UGFyYW1ldGVySW5mbz47XG4gICAgICByZXR1cm4gcmVzdWx0Lm1hcChwYXJhbWV0ZXJJbmZvID0+IHtcbiAgICAgICAgY29uc3QgaW1wbCA9IG5ldyBQYXJhbWV0ZXJJbXBsKHBhcmFtZXRlckluZm8pO1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihpbXBsLCBzaGVldCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdOiBmaWVsZE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyVmFsdWVdOiBuZXdWYWx1ZVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DaGFuZ2VQYXJhbWV0ZXJWYWx1ZSwgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKG5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LlNoZWV0KTogUHJvbWlzZTxQYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmMoc2hlZXQsIG5hbWUsIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIHNoZWV0OiBDb250cmFjdC5TaGVldCk6IFByb21pc2U8UGFyYW1ldGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKHNoZWV0LCB1bmRlZmluZWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJhbWV0ZXJBc3luYyhcbiAgICBzaGVldDogQ29udHJhY3QuU2hlZXQsXG4gICAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxQYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyQ2FwdGlvbl0gPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICduYW1lIG9yIGZpZWxkTmFtZSBtdXN0IGJlIHByb3ZpZGVkIHRvIGZpbmQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRmluZFBhcmFtZXRlciwgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyA9IChvYmplY3Q6IE1vZGVsKTogb2JqZWN0IGlzIFBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgICByZXR1cm4gJ2ZpZWxkTmFtZScgaW4gb2JqZWN0O1xuICAgICAgfTtcblxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgZ290IGEgdmFsaWQgcmVzcG9uc2UgYmFjayBhZ2FpblxuICAgICAgaWYgKGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvKHJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFBhcmFtZXRlckluZm87XG4gICAgICAgIGNvbnN0IGltcGwgPSBuZXcgUGFyYW1ldGVySW1wbChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihpbXBsLCBzaGVldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwsXG4gIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsLFxuICBSYW5nZVNlbGVjdGlvbk1vZGVsLFxuICBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIsXG4gIFR1cGxlU2VsZWN0aW9uTW9kZWwsXG4gIFZhbHVlU2VsZWN0aW9uTW9kZWxcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBGaWx0ZXJOdWxsT3B0aW9uLCBTZWxlY3Rpb25VcGRhdGVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBQYXJhbWV0ZXJJZCxcbiAgUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgYXMgU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBjbGVhciBhbGwgdGhlIHNlbGVjdGVkIG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHsgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbGVhclNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuOyAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0aW9uQ3JpdGVyaWFcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBsZXQgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXMpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25VcGRhdGVUeXBlXTogc2VsZWN0aW9uVHlwZVxuICAgIH07XG5cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSGllclZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EaW1WYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAqXG4gKiBAcGFyYW0gdmlzdWFsSWRcbiAqIEBwYXJhbSBNYXJrSW5mb1xuICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnTWFya3MgaW5mbyBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgSWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBsZXQgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25JZHMobWFya3MpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25VcGRhdGVUeXBlXTogc2VsZWN0aW9uVHlwZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25dOiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb25cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbGVjdEJ5VmFsdWUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgdGhlIGVycm9yIHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgb3V0cHV0IHBhcmFtcyBhbmQgdGhyb3cgZXJyb3IgYWNjb3JkaW5nbHkuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgTWFya3NJbmZvXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBsZXQgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgbGV0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHR1cGxlSWQ6IE51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmtzW2ldLnR1cGxlSWQ7XG4gICAgICBpZiAodHVwbGVJZCAhPT0gdW5kZWZpbmVkICYmIHR1cGxlSWQgIT09IG51bGwpIHsgLy8gSWYgdHVwbGUgaWQgaXMgcHJvdmlkZWQgdXNlIHRoYXQgaW5zdGVhZCBvZiBwYWlyXG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd0dXBsZUlkIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHsgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgbGV0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSB2YWx1ZXMuXG4gICAqXG4gICAqIFN1cHBvcnRzIDMgdHlwZXMgZm9yIHNlbGVjdGlvbjpcbiAgICogMSkgSGllcmFyY2hpY2FsIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAyKSBSYW5nZSB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMykgRGltZW5zaW9uIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgbGV0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3QgPSBzZWxlY3Rpb25Dcml0ZXJpYXNbaV07XG4gICAgICBpZiAoIShzdC5maWVsZE5hbWUgJiYgKHN0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgc3QudmFsdWUgIT09IG51bGwpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1NlbGVjdGlvbiBDcml0ZXJpYSBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjYXRSZWdleCA9IG5ldyBSZWdFeHAoJyhcXFtbQS1aYS16MC05XStdKS4qJywgJ2cnKTtcbiAgICAgIGxldCByYW5nZU9wdGlvbjogQ29udHJhY3QuUmFuZ2VWYWx1ZSA9IHN0LnZhbHVlIGFzIENvbnRyYWN0LlJhbmdlVmFsdWU7XG4gICAgICBpZiAoY2F0UmVnZXgudGVzdChzdC5maWVsZE5hbWUpKSB7IC8vIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgbGV0IGhpZXJNb2RlbDogSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgPVxuICAgICAgICAgIHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUgYXMgQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSkgYXMgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5wdXNoKGhpZXJNb2RlbCk7XG4gICAgICB9IGVsc2UgaWYgKChyYW5nZU9wdGlvbiBhcyBDb250cmFjdC5SYW5nZVZhbHVlKS5taW4gIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAocmFuZ2VPcHRpb24gYXMgQ29udHJhY3QuUmFuZ2VWYWx1ZSkubWF4ICE9PSB1bmRlZmluZWQpIHsgLy8gUmFuZ2UgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGxldCBxdWFudE1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1JhbmdlUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHJhbmdlT3B0aW9uKTtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5wdXNoKHF1YW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHsgLy8gRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBsZXQgZGltTW9kZWw6IERpbWVuc2lvblNlbGVjdGlvbk1vZGVsID1cbiAgICAgICAgICB0aGlzLmFkZFRvUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHN0LnZhbHVlIGFzIENvbnRyYWN0LkNhdGVnb3JpY2FsVmFsdWUpIGFzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyci5wdXNoKGRpbU1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byB2YWx1ZSBiYXNlZCBwcmVzIG1vZGVsIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9QYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSk6IFZhbHVlU2VsZWN0aW9uTW9kZWwge1xuICAgIGxldCB2YWx1ZVNlbGVjdGlvbk1vZGVsOiBWYWx1ZVNlbGVjdGlvbk1vZGVsID0gbmV3IFZhbHVlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICBsZXQgbWFya1ZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGxldCB2YWx1ZUFycjogQXJyYXk8c3RyaW5nPiA9IHZhbHVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWVBcnJbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5zZWxlY3RWYWx1ZXMgPSBtYXJrVmFsdWVzO1xuICAgIHJldHVybiB2YWx1ZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gcmFuZ2UgYmFzZWQgc2VsZWN0aW9uIHByZXMgbW9kZWwuXG4gICAqXG4gICAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIHRoZSBwYXJzaW5nIG9mIGRhdGUgdHlwZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUmFuZ2VQYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFJhbmdlU2VsZWN0aW9uTW9kZWwge1xuICAgIGxldCByYW5nZVNlbGVjdGlvbk1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gbmV3IFJhbmdlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWF4ICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1heFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWF4KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1pbiAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5taW5WYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1pbik7XG4gICAgfVxuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwuaW5jbHVkZWQgPSB0aGlzLnZhbGlkYXRlTnVsbE9wdGlvblR5cGUodmFsdWUubnVsbE9wdGlvbik7XG4gICAgcmV0dXJuIHJhbmdlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gdXBkYXRlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gU2VsZWN0aW9uVXBkYXRlVHlwZS5SZXBsYWNlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBTZWxlY3Rpb25VcGRhdGVUeXBlLkFkZCkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5BZGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBTZWxlY3Rpb25VcGRhdGVUeXBlLlJlbW92ZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZW1vdmU7XG4gICAgfVxuICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIGluY2x1ZGUgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbnVsbE9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU51bGxPcHRpb25UeXBlKG51bGxPcHRpb246IEZpbHRlck51bGxPcHRpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmIChudWxsT3B0aW9uKSB7XG4gICAgICBpZiAobnVsbE9wdGlvbiA9PT0gRmlsdGVyTnVsbE9wdGlvbi5OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gRmlsdGVyTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTm9uTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gRmlsdGVyTnVsbE9wdGlvbi5BbGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2hvdWxkVGhyb3cgfSBmcm9tICcuLi8uLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyoqXG4gKiBFYWNoIFNlcnZjZUltcGwgc2hvdWxkIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3MgZm9yIHRoZSBzYWtlIG9mXG4gKiBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICBUaGlzIGJhc2UgaGFuZGxlcyB0aGUgY29udmVyc2lvblxuICogZnJvbSBpbnRlcm5hbCBlcnJvcnMgdG8gZXh0ZXJuYWwgZXJyb3JzIHRoYXQgd2UgdGhyb3cgdG8gZGV2ZWxvcGVyc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUltcGxCYXNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikgeyB9XG5cbiAgcHJvdGVjdGVkIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hlci5leGVjdXRlKHZlcmIsIHBhcmFtcykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAvLyBBbnkgaW50ZXJuYWwgZXJyb3IgdGhhdCBjb21lcyBmcm9tIHRoZSBkaXNwYXRjaGVyIHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAgICAgIC8vIHRvIGFuIGV4dGVybmFsIGVycm9yIHVzaW5nIHRoZSBlbnVtIG1hcHBlciBmb3IgZXJyb3IgY29kZXMuXG4gICAgICBjb25zdCBpbnRlcm5hbEVycm9yID0gZXJyb3IgYXMgSW50ZXJuYWxUYWJsZWF1RXJyb3I7XG4gICAgICBjb25zdCBleHRlcm5hbEVycm9yQ29kZTogRXJyb3JDb2RlcyA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5lcnJvckNvZGUuY29udmVydChpbnRlcm5hbEVycm9yLmVycm9yQ29kZSwgU2hvdWxkVGhyb3cuTm8pO1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihleHRlcm5hbEVycm9yQ29kZSwgaW50ZXJuYWxFcnJvci5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgWm9uZVZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4uLy4uL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1pvbmVTZXJ2aWNlJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogU3RyaW5nLFxuICAgIGRhc2hib2FyZE9iamVjdHM6IEFycmF5PERhc2hib2FyZE9iamVjdD4sXG4gICAgem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF06IHt9XG4gICAgfTtcblxuICAgIC8vIHpvbmVWaXNpYmlsaXR5TWFwIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgTWFwIC0gY29udmVydCBpdCB0byBhIE1hcFxuICAgIGNvbnN0IHBhcmFtZXRlckFzTWFwID0gUGFyYW0uY29udmVydFBhcmFtZXRlclRvTWFwKHpvbmVWaXNpYmlsaXR5TWFwLCAnem9uZVZpc2liaWxpdHlNYXAnKTtcblxuICAgIHBhcmFtZXRlckFzTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRPYmplY3RzLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxab25lVmlzaWJpbGl0eVR5cGU+KHZhbHVlLCBab25lVmlzaWJpbGl0eVR5cGUsICdab25lVmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vRXZlbnRMaXN0ZW5lck1hbmFnZXInO1xuXG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0ltcGwvU2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFNoZWV0IGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5TaGVldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zaGVldEltcGw6IFNoZWV0SW1wbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lLCB0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmModGhpcyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaXplIGltcGxlbWVudHMgQ29udHJhY3QuU2l6ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oZWlnaHQ6IG51bWJlciwgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcikgeyB9XG5cbiAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICB9XG5cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7IH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jb25uZWN0aW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1c3RvbVNRTCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY3VzdG9tU1FMO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBDdXN0b20gZXJyb3IgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0LlxuICogVGhpcyBhbGxvd3MgdXMgdG8gcHJvdmlkZSBhIGZpZWxkIHdpdGggYSBzcGVjaWZpYyBlcnJvciBjb2RlXG4gKiBzbyB0aGF0IGRldmVsb3BlcnMgY2FuIG1vcmUgZWFzaWx5IHByb2dyYW1tYXRpY2FsbHkgcmVzcG9uZFxuICogdG8gZXJyb3Igc2NlbmFyaW9zLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVhdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZXJyb3JDb2RlOiBFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW4gdmVyc2lvbiAyIG9mIHRoZSBpbnRlcmZhY2UsIHdlIHNob3VsZCBjb2xsYXBzZSB2YWx1ZSBpbnRvIG5hdGl2ZVZhbHVlLCBhbmQgZG8gYWxsIHRoaXMgd29yayBvdmVyXG4gKiBpbiB0aGUgcGxhdGZvcm0uXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWVGYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBNYWtlUGFyYW1ldGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIFBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbCBzdHJpbmdzLCBjb252ZXJ0IGZyb20gc3RyaW5nIHRvIHZhbHVlXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRTdHJpbmdWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZUZpbHRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUpOiBEYXRhVmFsdWUge1xuICAgIC8vIEZpbHRlcnMgYWxyZWFkeSBoYXZlIG5hdGl2ZSB0eXBlIGluIHZhbHVlLCBqdXN0IHVzZSB0aGF0IGZvciBuYXRpdmVWYWx1ZSBhbHNvXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VUYWJsZURhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBEYXRhVGFibGVzIGNvbnRhaW4gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IGRhdGUgYXMgc3RyaW5nIHwgJyVudWxsJVxuICAgIC8vIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUgY29udmVydHMgZGF0ZXMgYXMgc3RyaW5nIHRvIGRhdGVzLCBhbmQgYW55IHNwZWNpYWwgdG8gbnVsbFxuICAgIC8vIChib29sZWFuLCBudW1iZXJzLCBzdHJpbmdzIGFyZSBwYXNzZWQgdGhyb3VnaClcbiAgICAvLyBCZWNhdXNlIG9mIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIC0gd2UgY2FuIGhhdmUgdW5kZWZpbmVkIHZhbHVlcywgd2hpY2ggYXJlIGRpZmZlcmVudCB0aGFuIGFueSBzcGVjaWFsXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY29udmVydHMgZnJvbSBhIHNvdXJjZSBlbnVtIHZhbHVlIHRvIGRlc3RpbmF0aW9uIGVudW1cbiAqIHZhbHVlIGdpdmVuIGEgbWFwcGluZyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aGVuIGNvbnN0cnVjdGVkLlxuICpcbiAqIE5vdGU6IFRoaXMgZXhhY3Qgc2FtZSBjbGFzcyBpcyBkZWZpbmVkIGluIGFwaS1jb3JlLiAgR2l2ZW4gaXRzIHNtYWxsXG4gKiBuYXR1cmUsIGl0IGlzIG5vdCB3b3J0aCBoYXZpbmcgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHRvIHNoYXJlIHRoaXMgYmV0d2VlblxuICogYXBpLWNvcmUgYW5kIGFwaS1zaGFyZWQuICBJZiBtb3JlIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSBpcyBhZGRlZCB0aGF0IGlzIHVzZWQgYnkgYXBpLWNvcmVcbiAqIGFuZCBhcGktc2hhcmVkIGJ1dCBoYXMgbm8gb3RoZXIgZGVwZW5kZWNpZXMsIGEgdXRpbHRpdHkgcHJvamVjdCBtaWdodCBiZSBtZXJpdGVkLFxuICogYW5kIHRoaXMgY2xhc3MgY291bGQgYmUgbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnVtQ29udmVydGVyPFRTb3VyY2VUeXBlIGV4dGVuZHMgc3RyaW5nLCBURGVzdGluYXRpb25UeXBlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tYXBwaW5nczogeyBbZW51bVZhbDogc3RyaW5nXTogVERlc3RpbmF0aW9uVHlwZTsgfSxcbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSkgeyB9XG5cbiAgcHVibGljIGNvbnZlcnQoZW51bVZhbDogVFNvdXJjZVR5cGUsIHRocm93SWZNaXNzaW5nOiBTaG91bGRUaHJvdyA9IFNob3VsZFRocm93Llllcyk6IFREZXN0aW5hdGlvblR5cGUge1xuICAgIGlmICh0aGlzLl9tYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShlbnVtVmFsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcHBpbmdzW2VudW1WYWwgYXMgc3RyaW5nXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVmYXVsdFZhbCAhPT0gdW5kZWZpbmVkICYmIHRocm93SWZNaXNzaW5nICE9PSBTaG91bGRUaHJvdy5ZZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgRW51bSBNYXBwaW5nIG5vdCBmb3VuZCBmb3I6ICR7ZW51bVZhbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBTaG91bGRUaHJvdyB7XG4gIFllcyA9ICd5ZXMnLFxuICBObyA9ICdubycsXG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4uL0Rhc2hib2FyZE9iamVjdCc7XG5cbmludGVyZmFjZSBFbnVtTGlrZSB7XG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29uc3RydWN0IGNvbW1vbiBlcnJvcnMgdGhyb3VnaG91dCB0aGUgZXh0ZXJuYWxcbiAqIHByb2plY3RzIChhcGktc2hhcmVkLCBleHRlbnNpb25zLWFwaSwgZXRjLikuICBJdCBoYXMgc29tZSBkdXBsaWNhdGlvbiB3aXRoXG4gKiB0aGUgRXJyb3JIZWxwZXJzIGNsYXNzIGluIGFwaS1jb3JlLCBidXQgaXMgc2VwYXJhdGUgZHVlIHRvIHRoZSBuZWVkIHRvIHRocm93XG4gKiBhbiBleHRlcm5hbCBUYWJsZWF1RXJyb3IgdnMuIGFuIEludGVybmFsVGFibGVhdUVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JIZWxwZXJzIHtcbiAgLyoqXG4gICAqIFRocm93cyB3aXRoIGNvZGUgSW50ZXJuYWxFcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGFwaU5hbWUgbmFtZSBvZiBhcGkgdGhhdCB3YXMgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcGlOb3RJbXBsZW1lbnRlZChhcGlOYW1lOiBzdHJpbmcpOiBUYWJsZWF1RXJyb3Ige1xuICAgIHJldHVybiBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXBpTmFtZX0gQVBJIG5vdCB5ZXQgaW1wbGVtZW50ZWQuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGludGVybmFsIGVycm9yIGlmIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlJbnRlcm5hbFZhbHVlKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgKiBGb3Igb2JqZWN0cywgaXQganVzdCB0ZXN0cyB0aGF0IGl0IGlzIGFuIG9iamVjdFxuICAqXG4gICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICogQHBhcmFtIGV4cGVjdGVkVHlwZSBleHBlY3RlZCByZXN1bHQgb2YgdHlwZW9mXG4gICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIChhcmd1bWVudFZhbHVlKSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaGFzIGludmFsaWQgdHlwZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIGVtcHR5IHN0cmluZywgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVN0cmluZ1BhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGFyZ3VtZW50VmFsdWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW10ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVHlwZSkuZm9yRWFjaCgoZW51bUtleSkgPT4ge1xuICAgICAgaWYgKGVudW1UeXBlW2VudW1LZXldID09PSBlbnVtVmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBwYXJhbXMgbWluIGFuZCBtYXggZm9yIGFwcGx5aW5nIHJhbmdlIGZpbHRlci5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHJhbmdlIGlzIGludmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBtaW4gcmFuZ2UgbWluXG4gICAqIEBwYXJhbSBtYXggcmFuZ2UgbWF4XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVJhbmdlUGFyYW1UeXBlKG1pbjogYW55LCBtYXg6IGFueSk6IHZvaWQge1xuICAgIGlmICghbWluICYmICFtYXgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBhdCBsZWFzdCBvbmUgb2YgbWluIG9yIG1heCBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAobWluICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWluKSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKG1heCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWF4LicpO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgbWF4ICYmIHR5cGVvZiAobWluKSAhPT0gdHlwZW9mIChtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgcGFyYW1ldGVycyBtaW4gYW5kIG1heCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZUlkIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdHMgQW4gYXJyYXkgb2YgYWxsIERhc2hib2FyZE9iamVjdHMgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRPYmplY3RzOiBBcnJheTxEYXNoYm9hcmRPYmplY3Q+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuXG4gICAgbGV0IGlzVmFsaWQgPSBkYXNoYm9hcmRPYmplY3RzLnNvbWUoKGRhc2hib2FyZE9iamVjdCkgPT4ge1xuICAgICAgcmV0dXJuIGRhc2hib2FyZE9iamVjdC5pZCA9PT0gem9uZUlEO1xuICAgIH0pO1xuXG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgWm9uZSBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IGluIGRhc2hib2FyZC5gKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtIHtcbiAgLyoqXG4gICAqIHNlcmlhbGl6ZXMgdGhlIGRhdGUgaW50byB0aGUgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzLlxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZSB0byBzZXJpYWxpemVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXI6IG51bWJlciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgIGNvbnN0IGhoOiBudW1iZXIgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW06IG51bWJlciA9IGRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYzogbnVtYmVyID0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVCb29sZWFuRm9yUGxhdGZvcm0oYm9vbDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJvb2wgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVOdW1iZXJGb3JQbGF0Zm9ybShudW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bS50b1N0cmluZygxMCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGlucHV0IGlzIGEgbnVtYmVyXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgKGlucHV0KSA9PT0gJ251bWJlcicgfHwgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXI7XG4gIH1cbiAgLyogdHNsaW50OmVuYWJsZTpuby1hbnkgKi9cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGlucHV0IGlzIGEgRGF0ZVxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlRGF0ZShpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgfVxuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVTdHJpbmcoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgKGlucHV0KSA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiAoaW5wdXQpID09PSAnYm9vbGVhbicgfHwgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplTnVtYmVyRm9yUGxhdGZvcm0odmFsdWUgYXMgbnVtYmVyKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZURhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKHZhbHVlIGFzIERhdGUpO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlQm9vbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVCb29sZWFuRm9yUGxhdGZvcm0odmFsdWUgYXMgYm9vbGVhbik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVW5leHBlY3RlZCBpbnZhbGlkIHZhbHVlIGZvcjogJHt2YWx1ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIGFscmVhZHkgYSBNYXAsIG9yIGNvbnZlcnRzIGFuIG9iamVjdCB0byBhIE1hcC5cbiAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBhbiBvYmplY3QsIHdlIGNvbnZlcnQgaXQgdG8gYSBNYXAgdXNpbmcgT2JqZWN0LmVudHJpZXMuXG4gICAqIEB0aHJvd3MgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0IG9yIE1hcFxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRQYXJhbWV0ZXJUb01hcChwYXJhbTogb2JqZWN0LCBwYXJhbU5hbWU6IHN0cmluZyk6IE1hcDxhbnksIGFueT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXJUeXBlKHBhcmFtLCAnb2JqZWN0JywgcGFyYW1OYW1lKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgRXhwZWN0aW5nIG9iamVjdCBvciBNYXAgZm9yOiAke3BhcmFtTmFtZX0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgTWFwID8gcGFyYW0gOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHBhcmFtKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlckNvbnRyYWN0IH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyQ29udHJhY3QnO1xuXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBleHRlbnNpb25zIGxpYnJhcnlcbiAqIGFuZCBleHRlbnNpb25zLWFwaS10eXBlcyBsaWJyYXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uTnVtYmVyIGltcGxlbWVudHMgVmVyc2lvbk51bWJlckNvbnRyYWN0IHtcblxuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBsZXQgcGFydFN0ciA9IHZlcnNpb25TdHJpbmcuc3BsaXQoJy0nKTtcbiAgICB0aGlzLmJ1aWxkID0gdGhpcy5nZXRCdWlsZE51bWJlcihwYXJ0U3RyWzFdKTtcbiAgICB2ZXJzaW9uU3RyaW5nID0gcGFydFN0clswXTtcblxuICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLicpLm1hcChwID0+IHBhcnNlSW50KHAsIDEwKSk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBJbnZhbGlkIHZlcnNpb24gbnVtYmVyOiAke3ZlcnNpb25TdHJpbmd9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYWpvciA9IHBhcnRzWzBdO1xuICAgIHRoaXMubWlub3IgPSBwYXJ0c1sxXTtcbiAgICB0aGlzLmZpeCA9IHBhcnRzWzJdO1xuICAgIHRoaXMuaXNBbHBoYSA9IGlzQWxwaGE7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkTnVtYmVyKHByZVJlbGVhc2VTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3Qgbm9CdWlsZE51bWJlcjogbnVtYmVyID0gLTE7XG4gICAgaWYgKCFwcmVSZWxlYXNlU3RyaW5nKSB7XG4gICAgICByZXR1cm4gbm9CdWlsZE51bWJlcjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHJlUmVsZWFzZSBzdHJpbmcgaGFzIHRoaXMgZm9ybTogcHJlLk4sIGJ1dCB3ZSBkb24ndCBkZXBlbmQgb24gdGhlIGFjdHVhbCBzdHJpbmcgYmVpbmcgJ3ByZSdcbiAgICBsZXQgcGFydFN0ciA9IHByZVJlbGVhc2VTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gcGFydFN0clsxXSA/IHBhcnNlSW50KHBhcnRTdHJbMV0sIDEwKSA6IG5vQnVpbGROdW1iZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH1gO1xuICB9XG5cbiAgcHVibGljIGdldCBmdWxsRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMuZml4fS1wcmUuJHt0aGlzLmJ1aWxkfWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZpbHRlclVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0ltcGwvV29ya3NoZWV0SW1wbCc7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0IGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLl93b3Jrc2hlZXRJbXBsLmluaXRpYWxpemVFdmVudHModGhpcykuZm9yRWFjaChlID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IENvbnRyYWN0LkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogQXJyYXk8c3RyaW5nPiwgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSwgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXREYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29sdW1uPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnNvbGUud2FybignV29ya3NoZWV0LmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6XG4gICAgUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlEQXN5bmMobWFya3NJbmZvOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhtYXJrc0luZm8sIHVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcixcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgTm90aWZpY2F0aW9uLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBWZXJiSWQsXG4gIFZlcnNpb25MZXNzVGhhbixcbiAgVmVyc2lvbk51bWJlclxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwbGF0Zm9ybVZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIpIHtcblxuICAgIHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIgPSBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIHBsYXRmb3JtVmVyc2lvbk51bWJlcik7XG5cbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IFtdO1xuICAgIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cGdyYWRlZE5vdGlmaWNhdGlvbiA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgaGFuZGxlcih1cGdyYWRlZE5vdGlmaWNhdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIElmIG91ciBwbGF0Zm9ybSBpcyBsZXNzIHRoYW4gZXh0ZXJuYWwgbGlicmFyeSB2ZXJzaW9uLCB0aGVuIHdlIG5lZWQgYSBjb252ZXJ0ZXJcbiAgICByZXR1cm4gVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbiwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZG93bmdyYWRlUGFyYW1ldGVycyA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIuZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYiwgcGFyYW1ldGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5fYXBpRGVsZWdhdGVEaXNwYXRjaGVyLmV4ZWN1dGUoZG93bmdyYWRlUGFyYW1ldGVycy52ZXJiLCBkb3duZ3JhZGVQYXJhbWV0ZXJzLnBhcmFtZXRlcnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcihoID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG59XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbi8vIFRoZSBmb2xsb3dpbmcgcG9seWZpbGxzIGFyZSBuZWVkZWQgZm9yIElFMTFcblxuaW1wb3J0ICdjb3JlLWpzL2VzL3Byb21pc2UnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL21hcCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZmluZCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZnJvbSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlcic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWludCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWZsb2F0JztcblxuLy8gRHVlIHRvIHRoZSB3YXkgd2UgY29uZmlndXJlZCB3ZWJwYWNrLCB3ZSBzaG91bGQgYmUgZXhwb3J0aW5nIHRoaW5ncyB3aGljaCB3aWxsIGJlIHVuZGVyXG4vLyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgXCJ0YWJsZWF1XCIuIEV4cG9ydCBldmVyeXRoaW5nIHdlIHdhbnQgdG8gYmUgdmlzaWJsZSB1bmRlciB0YWJsZWF1XG4vLyBmcm9tIHRoaXMgZmlsZS5cblxuaW1wb3J0IHsgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmRlY2xhcmUgdmFyIEVYVEVOU0lPTl9WRVJTSU9OX0lTX0FMUEhBOiBib29sZWFuO1xuY29uc3QgaXNBbHBoYTogYm9vbGVhbiA9IHR5cGVvZiBFWFRFTlNJT05fVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBFWFRFTlNJT05fVkVSU0lPTl9JU19BTFBIQSA6IGZhbHNlO1xuXG5kZWNsYXJlIHZhciBFWFRFTlNJT05fQVBJX1ZFUlNJT05fTlVNQkVSOiBzdHJpbmc7XG5BcGlWZXJzaW9uLlNldFZlcnNpb25OdW1iZXIodHlwZW9mIEVYVEVOU0lPTl9BUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gRVhURU5TSU9OX0FQSV9WRVJTSU9OX05VTUJFUiA6ICcwLjAuMCcsIGlzQWxwaGEpO1xuXG5jb25zdCBleHRlbnNpb25JbXBsID0gbmV3IEV4dGVuc2lvbnNJbXBsKCk7XG5leHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbnNpb25zKGV4dGVuc2lvbkltcGwpO1xuXG4vLyBFeHBvcnQgRW51bXNcbi8vIFRoZXNlIHNob3cgdXAgdW5kZXIgdGhlIHRhYmxlYXUgb2JqZWN0LiBJLmUuIHRhYmxlYXUuRXh0ZW5zaW9uQ29udGV4dC5TZXJ2ZXJcbmV4cG9ydCB7XG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEFuYWx5dGljc09iamVjdFR5cGUsXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG4gIFNlcnZpY2VOYW1lc1xufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBTZXR0aW5nc0ltcGwgfSBmcm9tICcuL1NldHRpbmdzSW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9VSSc7XG5pbXBvcnQgeyBVSUltcGwgfSBmcm9tICcuL1VJSW1wbCc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBOb3RpZmljYXRpb25JZCxcbiAgU2hlZXRQYXRoLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB9IGZyb20gJy4vTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyJztcblxuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4ge30gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG5cbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ6IERhc2hib2FyZENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBpbml0T3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zID0geyBpc0FscGhhOiBBcGlWZXJzaW9uLkluc3RhbmNlLmlzQWxwaGEgfTtcbiAgICAgICAgLy8gRmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbyBpcyBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZXNrdG9wIGRpc3BhdGNoZXIgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB1c1xuICAgICAgICBpZiAoTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLmhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShpbml0T3B0aW9ucykpIHtcbiAgICAgICAgICAvLyBSdW5uaW5nIGluIGEgcHJlLTIwMTkuMyBkZXNrdG9wLCB1c2Ugb3VyIGxlZ2FjeSBkaXNwYXRjaGVyIHByb21pc2VcbiAgICAgICAgICBjb25zdCBkZXNrdG9wRGlzcGF0Y2hlclByb21pc2UgPSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKTtcbiAgICAgICAgICBkZXNrdG9wRGlzcGF0Y2hlclByb21pc2UhLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PlxuICAgICAgICAgICAgdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2UgbXVzdCBiZSBydW5uaW5nIGluIHNlcnZlciwgc28gd2Ugc2hvdWxkIHRyeSB0byBraWNrIG9mIHRoZSBzZXJ2ZXIgZGlzcGF0Y2hlciBib290c3RyYXBwaW5nXG4gICAgICAgICAgY29uc3Qgb25EaXNwYXRjaGVyUmVjZWl2ZWRDYWxsYmFjayA9IHRoaXMub25EaXNwYXRjaGVyUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICBkb0Nyb3NzRnJhbWVCb290c3RyYXAod2luZG93LCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBpbml0T3B0aW9ucykudGhlbigoZmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICB9KS50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxJbml0aWFsaXphdGlvblNlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2UpO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gKGNvbnRleHRNZW51RnVuY3Rpb25zKSA/IE9iamVjdC5rZXlzKGNvbnRleHRNZW51RnVuY3Rpb25zKSA6IFtdO1xuICAgIHJldHVybiBpbml0aWFsaXphdGlvblNlcnZpY2UuaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZywgY2FsbGJhY2tNYXBLZXlzKS50aGVuPHN0cmluZz4ocmVzdWx0ID0+IHtcbiAgICAgIGlmICghcmVzdWx0LmV4dGVuc2lvbkluc3RhbmNlLmxvY2F0b3IuZGFzaGJvYXJkUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSByZWNlaXZlIGFuIGludmFsaWQgcGxhZm9ybSB2ZXJzaW9uLCB0aGlzIG1lYW5zIHRoYXQgcGxhdGZvcm0gaXMgcnVubm5pbmcgMS40IG9yIDIuMSBhbmRcbiAgICAgIC8vIGRvZXNuJ3QgcGFzcyB0aGUgcGxhdGZvcm0gdmVyc2lvbiB0byBleHRlcm5hbC4gSW4gdGhpcyBjYXNlIHdlIGFzc3VtZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiB0byBiZSAxLjlcbiAgICAgIGxldCBwbGF0Zm9ybVZlcnNpb24gPSByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQucGxhdGZvcm1WZXJzaW9uXG4gICAgICAgID8gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA6IHsgbWFqb3I6IDEsIG1pbm9yOiA5LCBmaXg6IDAgfTtcblxuICAgICAgLy8gV3JhcCBvdXIgZXhpc3RpbmcgZGlzcGF0Y2hlciBpbiBhIGRpc3BhdGNoZXIgdGhhdCBjYW4gZG93bmdyYWRlL3VwZ3JhZGUgZm9yIGFuIG9sZGVyIHBsYXRmb3JtLlxuICAgICAgaWYgKFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci5uZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgICBkaXNwYXRjaGVyID0gbmV3IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcihkaXNwYXRjaGVyLCBwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgfVxuICAgICAgLy8gUmVnaXN0cmF0aW9uIG9mIHNlcnZpY2VzIG11c3QgaGFwcGVuIGJlZm9yZSBpbml0aWFsaXppbmcgY29udGVudCBhbmQgZW52aXJvbm1lbnRcblxuICAgICAgcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyLCBwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIHRoaXMuZGFzaGJvYXJkQ29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoXG4gICAgICAgIHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoKTtcblxuICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQpO1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHJlc3VsdC5leHRlbnNpb25TZXR0aW5nc0luZm8pO1xuICAgICAgdGhpcy51aSA9IG5ldyBVSShuZXcgVUlJbXBsKCkpO1xuXG4gICAgICAvLyBBZnRlciBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLCBzZXR1cCBsaXN0ZW5lcnMgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdFxuICAgICAgLy8gYXJlIG1lYW50IHRvIGJlIHRyaWdnZXJlZCB3aGVuZXZlciBhIGNvbnRleHQgbWVudSBpdGVtIGlzIGNsaWNrZWQuXG4gICAgICB0aGlzLmluaXRpYWxpemVDb250ZXh0TWVudUNhbGxiYWNrcyhjb250ZXh0TWVudUZ1bmN0aW9ucyk7XG5cbiAgICAgIC8vIEluIHRoZSBub3JtYWwgaW5pdGlhbGl6YXRpb24gY2FzZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gcmV0dXJuaW5nIGZyb20gaW5pdGlhbGl6ZUFzeW5jIHRvIHRoZVxuICAgICAgLy8gZGV2ZWxvcGVyLCB3ZSBqdXN0IGluZ29yZSB0aGF0IHN0cmluZy4gIEluIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2csIHRoaXMgc3RyaW5nXG4gICAgICAvLyBpcyBhbiBvcHRpb25hbCBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICAgIHJldHVybiByZXN1bHQuZXh0ZW5zaW9uRGlhbG9nUGF5bG9hZDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoaW5mbywgc2hlZXRQYXRoKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG5cbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljaywgKG1vZGVsKSA9PiB7XG4gICAgICAvLyBMZXQgdGhyb3VnaCBhbnkgY29udGV4dCBtZW51IGV2ZW50LCB0aGVzZSBhcmUgYWxyZWFkeSBmaWx0ZXJlZCBvbiBhcGktY29yZVxuICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0IG1lbnUgSURcbiAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVjZWl2ZWQgdW5leHBlY3RlZCBjb250ZXh0IG1lbnUgSWQgZnJvbSBldmVudDogJHtldmVudC5pZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIFZlcmJJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciBoYXMgYmVlbiBtb3ZlZCAoYW5kIHJlbmFtZWQpIGZyb20gYXBpLWludGVybmFsLWNvbnRyYWN0LlxuICogSXQgc3VwcG9ydHMgcnVubmluZyBhIG5ld2VyIGV4dGVybmFsIGxpYnJhcnkgYWdhaW5zdCBhIHByZSAyMDE5LjMgZGVza3RvcC5cbiAqIFN0YXJ0aW5nIGluIDIwMTkuMywgd2UgaGF2ZSBhIG1lcmdlZCBib290c3RyYXAgc3R5bGUgZm9yIGJvdGggZGVza3RvcCBhbmQgc2VydmVyLlxuICogSW4gYWRkaXRpb24sIHRoZSBhbHBoYSBjaGVja2luZyB0aGF0IGlzIGhhcHBlbmluZyBoZXJlIGlzIG5vdCBuZWNlc3NhcnkgaW4gZXh0ZXJuYWwtYXBpLWpzXG4gKiAgYWZ0ZXIgMjAxOS4zIGJlY2F1c2UgdGhhdCBjaGVja2luZyBoYXBwZW5zIGluIGFwaS1wbGF0Zm9ybS1qcyAoQXBpRGlzcGF0Y2hlclRlc3QudHMpXG4gKiBURlNJRDogMTA5MTU2MSB0cmFja3MgYW4gaW1wcm92ZW1lbnQgdG8gdGhpcyBzeXN0ZW0gdG8gbWFrZSBpdCBsZXNzIGNvbXBsZXggYW5kIHRpZSBpdCBkaXJlY3RseSB0b1xuICogIHRhYmxlYXUgYmV0YSByZWxlYXNlIHZlcnNpb25zLlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmlzQWxwaGEhICYmIHdpbmRvdy5fX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2UpIHtcbiAgICAgIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlci50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgfSkuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBFeHRlbnNpb25TZXR0aW5nc0luZm8sIE5vdGlmaWNhdGlvbklkLCBTZXR0aW5nc0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG4gIFRhYmxlYXVFdmVudFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUzogc3RyaW5nID0gJ0FzeW5jIFNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHVwZGF0aW5nIHNldHRpbmdzIGlzIG5vdCBhbGxvd2VkLic7XG4gIHByaXZhdGUgX2lzTW9kaWZpZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2N1cnJlbnRTZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uO1xuXG4gIC8vIFNpbmNlIHByb21pc2VzIGNhbid0IGJlIGludHJvc3BlY3RlZCBmb3Igc3RhdGUsIGtlZXAgYSB2YXJpYWJsZSB0aGF0XG4gIC8vIGluZGljYXRlcyBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHNvIHRoYXQgc2V0L2VyYXNlIGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgYSBzYXZlLlxuICBwcml2YXRlIF9zYXZlSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgLy8gT25seSBtYWtlIGEgbW9kaWZpY2F0aW9uIGlmIHdlIGhhdmUgdGhlIGtleSBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldKSB7XG4gICAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICAgICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzZXR0aW5nc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgLy8gSnVzdCByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHNldHRpbmdzIGFyZSB1bmNoYW5nZWRcbiAgICBpZiAoIXRoaXMuX2lzTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmU8U2V0dGluZ3NDb2xsZWN0aW9uPih0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgc2V0dGluZ3Mgc2VydmljZSB0byBzYXZlIHNldHRpbmdzIHRvIHR3YlxuICAgIGNvbnN0IHNldHRpbmdzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2V0dGluZ3NTZXJ2aWNlLnNhdmVTZXR0aW5nc0FzeW5jKHRoaXMuX2N1cnJlbnRTZXR0aW5ncykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KG5ld1NldHRpbmdzID0+IHtcbiAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2N1cnJlbnRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGtleSwgJ2tleScpOyAvLyBLZXkgc2hvdWxkbid0IGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlLCAndmFsdWUnKTsgLy8gRW1wdHkgc3RyaW5nIHZhbHVlIGlzIGFsbG93ZWQuXG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gc2V0dGluZ3Mgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGEgc2V0dGluZ3NVcGRhdGUgZXZlbnQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihUYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuU2V0dGluZ3NDaGFuZ2VkLCAobW9kZWwpID0+IHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIChldmVudDogU2V0dGluZ3NFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gZXZlbnQubmV3U2V0dGluZ3M7XG4gICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBUYWJsZWF1RXJyb3Jcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1VJU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBVSUltcGwge1xuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZS5kaXNwbGF5RGlhbG9nQXN5bmModXJsLCBwYXlsb2FkIHx8ICcnLCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgdW5yZWdpc3RlckZuID0gbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLCAobW9kZWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTGV0IHRocm91Z2ggYW55IGRpYWxvZyB1cGRhdGUgZXZlbnRcbiAgICAgICAgfSwgKGV2ZW50OiBEaWFsb2dVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoZXZlbnQuY2xvc2VQYXlsb2FkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1bnJlZ2lzdGVyRm4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuaW5zdGFuY2UuZ2V0U2VydmljZTxVSVNlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgdWlTZXJ2aWNlLmNsb3NlRGlhbG9nKHBheWxvYWQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBEYXNoYm9hcmRDb250ZW50IG5hbWVzcGFjZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgRGFzaGJvYXJkQ29udGVudCBpc1xuICogY3VycmVudGx5IGp1c3QgYSAoc2luZ2xlKSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb250ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmQ6IENvbnRyYWN0LkRhc2hib2FyZCkgeyB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeHRlbnNpb25Db250ZXh0LCBFeHRlbnNpb25Nb2RlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvbkVudmlyb25tZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MsIEFwaVZlcnNpb24gfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgbmFtZXNwYWNlLlxuICogRW52aXJvbm1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXNcbiAqIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgcHJpdmF0ZSBfYXBpVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0OiBFeHRlbnNpb25Db250ZXh0O1xuICBwcml2YXRlIF9sYW5ndWFnZTogc3RyaW5nO1xuICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfbW9kZTogRXh0ZW5zaW9uTW9kZTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RhYmxlYXVWZXJzaW9uOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV4dGVuc2lvbkVudmlyb25tZW50OiBFeHRlbnNpb25FbnZpcm9ubWVudCkge1xuICAgIHRoaXMuX2FwaVZlcnNpb24gPSBBcGlWZXJzaW9uLkluc3RhbmNlICYmIEFwaVZlcnNpb24uSW5zdGFuY2UuZm9ybWF0dGVkVmFsdWU7IC8vIG1hai5taW4uZml4IChubyBidWlsZClcbiAgICB0aGlzLl9jb250ZXh0ID0gRW51bU1hcHBpbmdzLmV4dGVuc2lvbkNvbnRleHQuY29udmVydChleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db250ZXh0KTtcbiAgICB0aGlzLl9sYW5ndWFnZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxhbmd1YWdlO1xuICAgIHRoaXMuX2xvY2FsZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxvY2FsZTtcbiAgICB0aGlzLl9tb2RlID0gRW51bU1hcHBpbmdzLmV4dGVuc2lvbk1vZGUuY29udmVydChleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Nb2RlKTtcbiAgICB0aGlzLl9vcGVyYXRpbmdTeXN0ZW0gPSBleHRlbnNpb25FbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW07XG4gICAgdGhpcy5fdGFibGVhdVZlcnNpb24gPSBleHRlbnNpb25FbnZpcm9ubWVudC50YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBjb250ZXh0KCk6IEV4dGVuc2lvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBFeHRlbnNpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW5nU3lzdGVtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGluZ1N5c3RlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFibGVhdVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVhdVZlcnNpb247XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7IENhbGxiYWNrTWFwLCBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBFeHRlbnNpb25zIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnMgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25zIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uSW1wbDogRXh0ZW5zaW9uc0ltcGwpIHtcbiAgICB0aGlzLmV4dGVuc2lvbkltcGwgPSBleHRlbnNpb25JbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRDb250ZW50KCk6IENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZGFzaGJvYXJkQ29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW52aXJvbm1lbnQoKTogQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZW52aXJvbm1lbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IENvbnRyYWN0LlNldHRpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGdldCB1aSgpOiBDb250cmFjdC5VSSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC51aTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKGUgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkgeyB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsLmNsb3NlRGlhbG9nKHBheWxvYWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vSW5pdGlhbGl6YXRpb25TZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBJbml0aWFsaXphdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuSW5pdGlhbGl6YXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sIGNvbnRleHRNZW51SWRzOiBzdHJpbmdbXSk6IFByb21pc2U8RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkluaXRpYWxpemVFeHRlbnNpb24sIHBhcmFtcykudGhlbjxFeHRlbnNpb25Cb290c3RyYXBJbmZvPihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXR0aW5nc1NlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNldHRpbmdzU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5TZXR0aW5nc1NlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVNldHRpbmdzQXN5bmMoc2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbik6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5TZXR0aW5nc1ZhbHVlc106IHNldHRpbmdzIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlRXh0ZW5zaW9uU2V0dGluZ3MsIHBhcmFtZXRlcnMpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPih2YWx1ZSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHJlc3VsdC5zZXR0aW5nc1ZhbHVlcyk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGlhbG9nT3B0aW9ucyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHRlbnNpb25EaWFsb2dSZXN1bHQsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWRcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vVUlTZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9ESUFMT0dfSEVJR0hUOiBudW1iZXIgPSA0MDA7IC8vIGluIHBpeGVsc1xuY29uc3QgREVGQVVMVF9ESUFMT0dfV0lEVEg6IG51bWJlciA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgb3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXTogdXJsLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdOiBwYXlsb2FkXG4gICAgfTtcblxuICAgIGNvbnN0IGg6IG51bWJlciA9ICgob3B0aW9ucykgJiYgKG9wdGlvbnMuaGVpZ2h0KSkgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSAoKG9wdGlvbnMpICYmIChvcHRpb25zLndpZHRoKSkgPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWREb21haW5EaWFsb2csXG4gICAgICAgICAgICAnVGhlIHVybCBvZiBhbiBleHRlbnNpb24gZGlhbG9nIG11c3QgbWF0Y2ggdGhlIGRvbWFpbiBvZiB0aGUgcGFyZW50IGV4dGVuc2lvbi4nKTtcbiAgICAgICAgZGVmYXVsdDogLy8gU3VjY2VzcyBjYXNlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSAocGF5bG9hZCkgPyB7IFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZCB9IDoge307XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuXG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFVJU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvVUlTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG59XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/lib/tableau.extensions.1.5.0.min.js b/lib/tableau.extensions.1.5.0.min.js new file mode 100644 index 00000000..27fcb722 --- /dev/null +++ b/lib/tableau.extensions.1.5.0.min.js @@ -0,0 +1,2 @@ +window.tableau=function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/dist-extensions/",r(r.s=114)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(174))},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(92),r(94),r(93),n(r(98)),n(r(179)),n(r(99)),n(r(180)),n(r(181)),n(r(100)),n(r(185)),n(r(101)),n(r(188)),n(r(64));var i,o=r(191);try{i=o.version.split(".").map((function(e){return parseInt(e,10)}))}catch(e){throw console.error(e),new Error("Unable to parse internal contract version "+o.version)}t.INTERNAL_CONTRACT_VERSION={major:i[0],minor:i[1],fix:i[2]},t.MESSAGING_VERSION={major:1,minor:0,fix:0}},function(e,t,r){(function(t){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,r(117))},function(e,t,r){var n=r(2),i=r(40).f,o=r(16),a=r(17),s=r(45),u=r(119),c=r(52);e.exports=function(e,t){var r,l,p,f,d,y=e.target,g=e.global,h=e.stat;if(r=g?n:h?n[y]||s(y,{}):(n[y]||{}).prototype)for(l in t){if(f=t[l],p=e.noTargetGet?(d=i(r,l))&&d.value:r[l],!c(g?l:y+(h?".":"#")+l,e.forced)&&void 0!==p){if(typeof f==typeof p)continue;u(f,p)}(e.sham||p&&p.sham)&&o(f,"sham",!0),a(r,l,f,e)}}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(177);t.Dashboard=i.Dashboard;var o=r(63);t.EventListenerManager=o.EventListenerManager;var a=r(6);t.TableauError=a.TableauError;var s=r(178);t.ApiVersion=s.ApiVersion;var u=r(97);t.VersionNumber=u.VersionNumber;var c=r(23);t.InternalToExternalEnumMappings=c.InternalToExternalEnumMappings;var l=r(103);t.TableauEvent=l.TableauEvent;var p=r(66);t.SingleEventManagerImpl=p.SingleEventManagerImpl;var f=r(192);t.DashboardImpl=f.DashboardImpl;var d=r(19);t.ServiceImplBase=d.ServiceImplBase;var y=r(12);t.ErrorHelpers=y.ErrorHelpers,n(r(203)),n(r(205)),n(r(15));var g=r(218);t.VersionedExternalApiDispatcher=g.VersionedExternalApiDispatcher},function(e,t,r){var n=r(2),i=r(70),o=r(10),a=r(49),s=r(75),u=r(127),c=i("wks"),l=n.Symbol,p=u?l:l&&l.withoutSetter||a;e.exports=function(e){return o(c,e)&&(s||"string"==typeof c[e])||(s&&o(l,e)?c[e]=l[e]:c[e]=p("Symbol."+e)),c[e]}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return i(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=o},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,r){var n=r(2);e.exports=n},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){var n=r(8);e.exports=function(e){if(!n(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),i=r(29),o=r(6),a=function(){function e(){}return e.apiNotImplemented=function(e){return new o.TableauError(n.ErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new o.TableauError(n.ErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.verifyEnumValue=function(e,t,r){var i=!1;if(Object.keys(t).forEach((function(r){t[r]===e.toString()&&(i=!0)})),!i)throw new o.TableauError(n.ErrorCodes.InvalidParameter,e+" is invalid value for enum: "+r+".")},e.verifyRangeParamType=function(e,t){if(!e&&!t)throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, at least one of min or max is required.");if(e&&!i.Param.isTypeNumber(e)&&!i.Param.isTypeDate(e))throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, only Date and number are allowed for parameter min.");if(t&&!i.Param.isTypeNumber(t)&&!i.Param.isTypeDate(t))throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, only Date and number are allowed for parameter max.");if(e&&t&&typeof e!=typeof t)throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, parameters min and max should be of the same type.")},e.verifyZoneIsValid=function(e,t){if(!e.some((function(e){return e.id===t})))throw new o.TableauError(n.ErrorCodes.InvalidParameter,"Unexpected invalid param value, Zone Id: "+t+" is not present in dashboard.")},e}();t.ErrorHelpers=a},function(e,t,r){var n=r(7);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,r){var n=r(13),i=r(69),o=r(11),a=r(43),s=Object.defineProperty;t.f=n?s:function(e,t,r){if(o(e),t=a(t,!0),o(r),i)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),i=r(6),o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return Object.defineProperty(e,"instance",{get:function(){if(window.__tableauApiServiceRegistry||e.setInstance(new o),!window.__tableauApiServiceRegistry)throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry},enumerable:!0,configurable:!0}),e.setInstance=function(e){window.__tableauApiServiceRegistry=e},e}();t.ApiServiceRegistry=a},function(e,t,r){var n=r(13),i=r(14),o=r(24);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(2),i=r(16),o=r(10),a=r(45),s=r(46),u=r(26),c=u.get,l=u.enforce,p=String(String).split("String");(e.exports=function(e,t,r,s){var u,c=!!s&&!!s.unsafe,f=!!s&&!!s.enumerable,d=!!s&&!!s.noTargetGet;"function"==typeof r&&("string"!=typeof t||o(r,"name")||i(r,"name",t),(u=l(r)).source||(u.source=p.join("string"==typeof t?t:""))),e!==n?(c?!d&&e[t]&&(f=!0):delete e[t],f?e[t]=r:i(e,t,r)):f?e[t]=r:a(t,r)})(Function.prototype,"toString",(function(){return"function"==typeof this&&c(this).source||s(this)}))},function(e,t,r){var n=r(9),i=r(2),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(n[e])||o(i[e]):n[e]&&n[e][t]||i[e]&&i[e][t]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(23),i=r(6),o=r(65),a=function(){function e(e){this._dispatcher=e}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},function(e,t,r){var n=r(11),i=r(74),o=r(33),a=r(21),s=r(77),u=r(79),c=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,r){var l,p,f,d,y,g,h,m=r&&r.that,v=!(!r||!r.AS_ENTRIES),b=!(!r||!r.IS_ITERATOR),T=!(!r||!r.INTERRUPTED),_=a(t,m,1+v+T),I=function(e){return l&&u(l),new c(!0,e)},S=function(e){return v?(n(e),T?_(e[0],e[1],I):_(e[0],e[1])):T?_(e,I):_(e)};if(b)l=e;else{if("function"!=typeof(p=s(e)))throw TypeError("Target is not iterable");if(i(p)){for(f=0,d=o(e.length);d>f;f++)if((y=S(e[f]))&&y instanceof c)return y;return new c(!1)}l=p.call(e)}for(g=l.next;!(h=g.call(l)).done;){try{y=S(h.value)}catch(e){throw u(l),e}if("object"==typeof y&&y&&y instanceof c)return y}return new c(!1)}},function(e,t,r){var n=r(22);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,r){"use strict";var n,i,o,a,s,u,c,l,p,f,d,y,g,h;Object.defineProperty(t,"__esModule",{value:!0});var m=r(0),v=r(1),b=r(65),T=function(){function e(){}return e.extensionContext=new b.EnumConverter(((n={})[v.ExtensionContext.Desktop]=m.ExtensionContext.Desktop,n[v.ExtensionContext.Server]=m.ExtensionContext.Server,n)),e.extensionMode=new b.EnumConverter(((i={})[v.ExtensionMode.Authoring]=m.ExtensionMode.Authoring,i[v.ExtensionMode.Viewing]=m.ExtensionMode.Viewing,i)),e.columnType=new b.EnumConverter(((o={})[v.ColumnType.Continuous]=m.ColumnType.Continuous,o[v.ColumnType.Discrete]=m.ColumnType.Discrete,o)),e.fieldAggregationType=new b.EnumConverter(((a={})[v.FieldAggregationType.Attr]=m.FieldAggregationType.Attr,a[v.FieldAggregationType.Avg]=m.FieldAggregationType.Avg,a[v.FieldAggregationType.Count]=m.FieldAggregationType.Count,a[v.FieldAggregationType.Countd]=m.FieldAggregationType.Countd,a[v.FieldAggregationType.Day]=m.FieldAggregationType.Day,a[v.FieldAggregationType.End]=m.FieldAggregationType.End,a[v.FieldAggregationType.Hour]=m.FieldAggregationType.Hour,a[v.FieldAggregationType.InOut]=m.FieldAggregationType.InOut,a[v.FieldAggregationType.Kurtosis]=m.FieldAggregationType.Kurtosis,a[v.FieldAggregationType.Max]=m.FieldAggregationType.Max,a[v.FieldAggregationType.Mdy]=m.FieldAggregationType.Mdy,a[v.FieldAggregationType.Median]=m.FieldAggregationType.Median,a[v.FieldAggregationType.Min]=m.FieldAggregationType.Min,a[v.FieldAggregationType.Minute]=m.FieldAggregationType.Minute,a[v.FieldAggregationType.MonthYear]=m.FieldAggregationType.MonthYear,a[v.FieldAggregationType.None]=m.FieldAggregationType.None,a[v.FieldAggregationType.Qtr]=m.FieldAggregationType.Qtr,a[v.FieldAggregationType.Quart1]=m.FieldAggregationType.Quart1,a[v.FieldAggregationType.Quart3]=m.FieldAggregationType.Quart3,a[v.FieldAggregationType.Second]=m.FieldAggregationType.Second,a[v.FieldAggregationType.Skewness]=m.FieldAggregationType.Skewness,a[v.FieldAggregationType.Stdev]=m.FieldAggregationType.Stdev,a[v.FieldAggregationType.Stdevp]=m.FieldAggregationType.Stdevp,a[v.FieldAggregationType.Sum]=m.FieldAggregationType.Sum,a[v.FieldAggregationType.TruncDay]=m.FieldAggregationType.TruncDay,a[v.FieldAggregationType.TruncHour]=m.FieldAggregationType.TruncHour,a[v.FieldAggregationType.TruncMinute]=m.FieldAggregationType.TruncMinute,a[v.FieldAggregationType.TruncMonth]=m.FieldAggregationType.TruncMonth,a[v.FieldAggregationType.TruncQtr]=m.FieldAggregationType.TruncQtr,a[v.FieldAggregationType.TruncSecond]=m.FieldAggregationType.TruncSecond,a[v.FieldAggregationType.TruncWeek]=m.FieldAggregationType.TruncWeek,a[v.FieldAggregationType.TruncYear]=m.FieldAggregationType.TruncYear,a[v.FieldAggregationType.User]=m.FieldAggregationType.User,a[v.FieldAggregationType.Var]=m.FieldAggregationType.Var,a[v.FieldAggregationType.Varp]=m.FieldAggregationType.Varp,a[v.FieldAggregationType.Week]=m.FieldAggregationType.Week,a[v.FieldAggregationType.Weekday]=m.FieldAggregationType.Weekday,a[v.FieldAggregationType.Year]=m.FieldAggregationType.Year,a)),e.fieldRoleType=new b.EnumConverter(((s={})[v.FieldRoleType.Dimension]=m.FieldRoleType.Dimension,s[v.FieldRoleType.Measure]=m.FieldRoleType.Measure,s[v.FieldRoleType.Unknown]=m.FieldRoleType.Unknown,s)),e.sheetType=new b.EnumConverter(((u={})[v.SheetType.Dashboard]=m.SheetType.Dashboard,u[v.SheetType.Story]=m.SheetType.Story,u[v.SheetType.Worksheet]=m.SheetType.Worksheet,u)),e.dashboardObjectType=new b.EnumConverter(((c={})[v.DashboardObjectType.Extension]=m.DashboardObjectType.Extension,c[v.DashboardObjectType.Blank]=m.DashboardObjectType.Blank,c[v.DashboardObjectType.Image]=m.DashboardObjectType.Image,c[v.DashboardObjectType.Legend]=m.DashboardObjectType.Legend,c[v.DashboardObjectType.PageFilter]=m.DashboardObjectType.PageFilter,c[v.DashboardObjectType.ParameterControl]=m.DashboardObjectType.ParameterControl,c[v.DashboardObjectType.QuickFilter]=m.DashboardObjectType.QuickFilter,c[v.DashboardObjectType.Text]=m.DashboardObjectType.Text,c[v.DashboardObjectType.Title]=m.DashboardObjectType.Title,c[v.DashboardObjectType.WebPage]=m.DashboardObjectType.WebPage,c[v.DashboardObjectType.Worksheet]=m.DashboardObjectType.Worksheet,c)),e.dataType=new b.EnumConverter(((l={})[v.DataType.Bool]=m.DataType.Bool,l[v.DataType.Date]=m.DataType.Date,l[v.DataType.DateTime]=m.DataType.DateTime,l[v.DataType.Float]=m.DataType.Float,l[v.DataType.Int]=m.DataType.Int,l[v.DataType.String]=m.DataType.String,l)),e.filterUpdateType=new b.EnumConverter(((p={})[v.FilterUpdateType.Add]=m.FilterUpdateType.Add,p[v.FilterUpdateType.All]=m.FilterUpdateType.All,p[v.FilterUpdateType.Remove]=m.FilterUpdateType.Remove,p[v.FilterUpdateType.Replace]=m.FilterUpdateType.Replace,p)),e.allowableValues=new b.EnumConverter(((f={})[v.DomainRestrictionType.All]=m.ParameterValueType.All,f[v.DomainRestrictionType.List]=m.ParameterValueType.List,f[v.DomainRestrictionType.Range]=m.ParameterValueType.Range,f)),e.dateStepPeriod=new b.EnumConverter(((d={})[v.DateStepPeriod.Years]=m.PeriodType.Years,d[v.DateStepPeriod.Quarters]=m.PeriodType.Quarters,d[v.DateStepPeriod.Months]=m.PeriodType.Months,d[v.DateStepPeriod.Weeks]=m.PeriodType.Weeks,d[v.DateStepPeriod.Days]=m.PeriodType.Days,d[v.DateStepPeriod.Hours]=m.PeriodType.Hours,d[v.DateStepPeriod.Minutes]=m.PeriodType.Minutes,d[v.DateStepPeriod.Seconds]=m.PeriodType.Seconds,d)),e.dateRangeType=new b.EnumConverter(((y={})[v.DateRangeType.Current]=m.DateRangeType.Current,y[v.DateRangeType.Last]=m.DateRangeType.Last,y[v.DateRangeType.LastN]=m.DateRangeType.LastN,y[v.DateRangeType.Next]=m.DateRangeType.Next,y[v.DateRangeType.NextN]=m.DateRangeType.NextN,y[v.DateRangeType.ToDate]=m.DateRangeType.ToDate,y)),e.errorCode=new b.EnumConverter(((g={})[v.ErrorCodes.INITIALIZATION_ERROR]=m.ErrorCodes.InternalError,g[v.ErrorCodes.INTERNAL_ERROR]=m.ErrorCodes.InternalError,g[v.ErrorCodes.MISSING_ENUM_MAPPING]=m.ErrorCodes.InternalError,g[v.ErrorCodes.MISSING_PARAMETER]=m.ErrorCodes.InternalError,g[v.ErrorCodes.PERMISSION_DENIED]=m.ErrorCodes.InternalError,g[v.ErrorCodes.PRES_MODEL_PARSING_ERROR]=m.ErrorCodes.InternalError,g[v.ErrorCodes.UNKNOWN_VERB_ID]=m.ErrorCodes.InternalError,g[v.ErrorCodes.VERSION_NOT_CONFIGURED]=m.ErrorCodes.APINotInitialized,g[v.ErrorCodes.VISIBILITY_ERROR]=m.ErrorCodes.VisibilityError,g),m.ErrorCodes.InternalError),e.filterType=new b.EnumConverter(((h={})[v.FilterType.Categorical]=m.FilterType.Categorical,h[v.FilterType.Range]=m.FilterType.Range,h[v.FilterType.RelativeDate]=m.FilterType.RelativeDate,h[v.FilterType.Hierarchical]=m.FilterType.Hierarchical,h)),e}();t.InternalToExternalEnumMappings=T},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){var n=r(42),i=r(31);e.exports=function(e){return n(i(e))}},function(e,t,r){var n,i,o,a=r(118),s=r(2),u=r(8),c=r(16),l=r(10),p=r(47),f=r(48),d=r(32),y=s.WeakMap;if(a){var g=p.state||(p.state=new y),h=g.get,m=g.has,v=g.set;n=function(e,t){return t.facade=e,v.call(g,e,t),t},i=function(e){return h.call(g,e)||{}},o=function(e){return m.call(g,e)}}else{var b=f("state");d[b]=!0,n=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return l(e,b)?e[b]:{}},o=function(e){return l(e,b)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!u(t)||(r=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return r}}}},function(e,t){e.exports=!1},function(e,t){e.exports={}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),i=r(6),o=r(12),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e}();t.Param=a},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){e.exports={}},function(e,t,r){var n=r(50),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},function(e,t,r){var n=r(31);e.exports=function(e){return Object(n(e))}},function(e,t,r){var n=r(11),i=r(125);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(r,[]),t=r instanceof Array}catch(e){}return function(r,o){return n(r),i(o),t?e.call(r,o):r.__proto__=o,r}}():void 0)},function(e,t,r){var n,i=r(11),o=r(126),a=r(51),s=r(32),u=r(73),c=r(44),l=r(48),p=l("IE_PROTO"),f=function(){},d=function(e){return"