mailgun.js 5.2.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/formDataBuilder.d.ts +14 -0
- package/interfaces/DomainCredentials.d.ts +6 -6
- package/interfaces/DomainTags.d.ts +4 -4
- package/interfaces/DomainTemplates.d.ts +12 -12
- package/interfaces/DomainTracking.d.ts +6 -6
- package/interfaces/Domains.d.ts +6 -6
- package/interfaces/IpPools.d.ts +40 -4
- package/interfaces/RequestOptions.d.ts +9 -2
- package/interfaces/Supressions.d.ts +4 -4
- package/interfaces/Validate.d.ts +3 -0
- package/interfaces/Webhooks.d.ts +2 -2
- package/interfaces/lists.d.ts +4 -4
- package/interfaces/mailListMembers.d.ts +8 -8
- package/interfaces/routes.d.ts +4 -4
- package/ip-pools.d.ts +5 -15
- package/ips.d.ts +2 -2
- package/mailgun.node.js +2 -2
- package/mailgun.node.js.LICENSE.txt +1 -1
- package/mailgun.web.js +2 -2
- package/mailgun.web.js.LICENSE.txt +1 -1
- package/multipleValidation.d.ts +1 -1
- package/package.json +1 -1
- package/request.d.ts +13 -19
- package/version.md +1 -1
package/mailgun.node.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! For license information please see mailgun.node.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mailgun=t():e.mailgun=t()}(this,(function(){return(()=>{var e={271:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(185);class AbortSignal extends n.EventTarget{constructor(){throw super(),new TypeError("AbortSignal cannot be constructed directly")}get aborted(){const e=o.get(this);if("boolean"!=typeof e)throw new TypeError("Expected 'this' to be an 'AbortSignal' object, but got "+(null===this?"null":typeof this));return e}}n.defineEventAttribute(AbortSignal.prototype,"abort");const o=new WeakMap;Object.defineProperties(AbortSignal.prototype,{aborted:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortSignal.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class AbortController{constructor(){s.set(this,function(){const e=Object.create(AbortSignal.prototype);return n.EventTarget.call(e),o.set(e,!1),e}())}get signal(){return i(this)}abort(){var e;e=i(this),!1===o.get(e)&&(o.set(e,!0),e.dispatchEvent({type:"abort"}))}}const s=new WeakMap;function i(e){const t=s.get(e);if(null==t)throw new TypeError("Expected 'this' to be an 'AbortController' object, but got "+(null===e?"null":typeof e));return t}Object.defineProperties(AbortController.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortController.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"}),t.AbortController=AbortController,t.AbortSignal=AbortSignal,t.default=AbortController,e.exports=AbortController,e.exports.AbortController=e.exports.default=AbortController,e.exports.AbortSignal=AbortSignal},475:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(438)),i=o(r(373)),a=o(r(22)),u=o(r(747)),l=o(r(778)),c=o(r(750)),d=o(r(197)),f=o(r(277)),p=o(r(839)),h=o(r(345)),b=o(r(602)),y=o(r(126)),m=o(r(135)),g=o(r(60)),_=o(r(587)),v=o(r(955)),w=o(r(75)),S=function(e,t){var r=n({},e);if(r.url||(r.url="https://api.mailgun.net"),!r.username)throw new Error('Parameter "username" is required');if(!r.key)throw new Error('Parameter "key" is required');this.request=new s.default(r,t);var o=new m.default(this.request),S=new g.default(this.request),R=new v.default(this.request),T=new w.default(this.request),q=new _.default(this.request);this.domains=new i.default(this.request,S,R,T),this.webhooks=new c.default(this.request),this.events=new a.default(this.request),this.stats=new u.default(this.request),this.suppressions=new l.default(this.request),this.messages=new d.default(this.request),this.routes=new f.default(this.request),this.ips=new h.default(this.request),this.ip_pools=new b.default(this.request),this.lists=new y.default(this.request,o),this.validate=new p.default(this.request,q)};t.default=S},373:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Domain=void 0;var s=o(r(78)),i=o(r(142)),a=function(e,t,r){this.name=e.name,this.require_tls=e.require_tls,this.skip_verification=e.skip_verification,this.state=e.state,this.wildcard=e.wildcard,this.spam_action=e.spam_action,this.created_at=e.created_at,this.smtp_password=e.smtp_password,this.smtp_login=e.smtp_login,this.type=e.type,this.receiving_dns_records=t||null,this.sending_dns_records=r||null};t.Domain=a;var u=function(){function e(e,t,r,n){this.request=e,this.domainCredentials=t,this.domainTemplates=r,this.domainTags=n}return e.prototype._parseMessage=function(e){return e.body},e.prototype._parseDomainList=function(e){return e.body.items.map((function(e){return new a(e)}))},e.prototype._parseDomain=function(e){return new a(e.body.domain,e.body.receiving_dns_records,e.body.sending_dns_records)},e.prototype._parseTrackingSettings=function(e){return e.body.tracking},e.prototype._parseTrackingUpdate=function(e){return e.body},e.prototype.list=function(e){var t=this;return this.request.get("/v3/domains",e).then((function(e){return t._parseDomainList(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/domains/".concat(e)).then((function(e){return t._parseDomain(e)}))},e.prototype.create=function(e){var t=this,r=n({},e);return"force_dkim_authority"in r&&"boolean"==typeof r.force_dkim_authority&&(r.force_dkim_authority="true"===r.toString()?"true":"false"),this.request.postWithFD("/v3/domains",r).then((function(e){return t._parseDomain(e)}))},e.prototype.verify=function(e){var t=this;return this.request.put("/v3/domains/".concat(e,"/verify"),{}).then((function(e){return t._parseDomain(e)}))},e.prototype.destroy=function(e){var t=this;return this.request.delete("/v3/domains/".concat(e)).then((function(e){return t._parseMessage(e)}))},e.prototype.getConnection=function(e){return this.request.get("/v3/domains/".concat(e,"/connection")).then((function(e){return e})).then((function(e){return e.body.connection}))},e.prototype.updateConnection=function(e,t){return this.request.put("/v3/domains/".concat(e,"/connection"),t).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.getTracking=function(e){return this.request.get((0,s.default)("/v3/domains",e,"tracking")).then(this._parseTrackingSettings)},e.prototype.updateTracking=function(e,t,r){var n=this;if("boolean"==typeof(null==r?void 0:r.active))throw new i.default({status:400,statusText:"Received boolean value for active property",body:{message:'Property "active" must contain string value.'}});return this.request.putWithFD((0,s.default)("/v3/domains",e,"tracking",t),r).then((function(e){return n._parseTrackingUpdate(e)}))},e.prototype.getIps=function(e){return this.request.get((0,s.default)("/v3/domains",e,"ips")).then((function(e){var t;return null===(t=null==e?void 0:e.body)||void 0===t?void 0:t.items}))},e.prototype.assignIp=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{ip:t})},e.prototype.deleteIp=function(e,t){return this.request.delete((0,s.default)("/v3/domains",e,"ips",t))},e.prototype.linkIpPool=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{pool_id:t})},e.prototype.unlinkIpPoll=function(e,t){var r="";if(t.pool_id&&t.ip)throw new i.default({status:400,statusText:"Too much data for replacement",body:{message:"Please specify either pool_id or ip (not both)"}});return t.pool_id?r="?pool_id=".concat(t.pool_id):t.ip&&(r="?ip=".concat(t.ip)),this.request.delete((0,s.default)("/v3/domains",e,"ips","ip_pool",r))},e.prototype.updateDKIMAuthority=function(e,t){return this.request.put("/v3/domains/".concat(e,"/dkim_authority"),{},{query:"self=".concat(t.self)}).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.updateDKIMSelector=function(e,t){return this.request.put("/v3/domains/".concat(e,"/dkim_selector"),{},{query:"dkim_selector=".concat(t.dkimSelector)}).then((function(e){return e}))},e.prototype.updateWebPrefix=function(e,t){return this.request.put("/v3/domains/".concat(e,"/web_prefix"),{},{query:"web_prefix=".concat(t.webPrefix)}).then((function(e){return e}))},e}();t.default=u},60:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(78)),s=function(){function e(e){this.request=e,this.baseRoute="/v3/domains/"}return e.prototype._parseDomainCredentialsList=function(e){return{items:e.body.items,totalCount:e.body.total_count}},e.prototype._parseMessageResponse=function(e){return{status:e.status,message:e.body.message}},e.prototype._parseDeletedResponse=function(e){return{status:e.status,message:e.body.message,spec:e.body.spec}},e.prototype.list=function(e,t){var r=this;return this.request.get((0,o.default)(this.baseRoute,e,"/credentials"),t).then((function(e){return r._parseDomainCredentialsList(e)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD("".concat(this.baseRoute).concat(e,"/credentials"),t).then((function(e){return r._parseMessageResponse(e)}))},e.prototype.update=function(e,t,r){var n=this;return this.request.putWithFD("".concat(this.baseRoute).concat(e,"/credentials/").concat(t),r).then((function(e){return n._parseMessageResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete("".concat(this.baseRoute).concat(e,"/credentials/").concat(t)).then((function(e){return r._parseDeletedResponse(e)}))},e}();t.default=s},75:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTagStatistic=t.DomainTag=void 0;var s=o(r(78)),i=function(e){this.tag=e.tag,this.description=e.description,this["first-seen"]=new Date(e["first-seen"]),this["last-seen"]=new Date(e["last-seen"])};t.DomainTag=i;var a=function(e){this.tag=e.body.tag,this.description=e.body.description,this.start=new Date(e.body.start),this.end=new Date(e.body.end),this.resolution=e.body.resolution,this.stats=e.body.stats.map((function(e){return n(n({},e),{time:new Date(e.time)})}))};t.DomainTagStatistic=a;var u=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype._parsePageLinks=function(e){return Object.entries(e.body.paging).reduce((function(e,t){var r=t[0],n=t[1];return e[r]={id:r,url:n},e}),{})},e.prototype._parseDomainTagsList=function(e){return{items:e.body.items.map((function(e){return new i(e)})),pages:this._parsePageLinks(e)}},e.prototype._parseTagStatistic=function(e){return new a(e)},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/tags"),t).then((function(e){return r._parseDomainTagsList(e)}))},e.prototype.get=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t)).then((function(e){return new i(e.body)}))},e.prototype.update=function(e,t,r){return this.request.put((0,s.default)(this.baseRoute,e,"/tags",t),r).then((function(e){return e.body}))},e.prototype.destroy=function(e,t){return this.request.delete("".concat(this.baseRoute).concat(e,"/tags/").concat(t)).then((function(e){return{message:e.body.message,status:e.status}}))},e.prototype.statistic=function(e,t,r){var n=this;return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats"),r).then((function(e){return n._parseTagStatistic(e)}))},e.prototype.countries=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/countries")).then((function(e){return e.body}))},e.prototype.providers=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/providers")).then((function(e){return e.body}))},e.prototype.devices=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/devices")).then((function(e){return e.body}))},e}();t.default=u},955:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTemplateItem=void 0;var s=o(r(78)),i=function(e){this.name=e.name,this.description=e.description,this.createdAt=e.createdAt?new Date(e.createdAt):"",this.createdBy=e.createdBy,this.id=e.id,e.version&&(this.version=e.version,e.version.createdAt&&(this.version.createdAt=new Date(e.version.createdAt))),e.versions&&e.versions.length&&(this.versions=e.versions.map((function(e){var t=n({},e);return t.createdAt=new Date(e.createdAt),t})))};t.DomainTemplateItem=i;var a=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype.parseCreationResponse=function(e){return new i(e.body.template)},e.prototype.parseCreationVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.template=new i(e.body.template)),t},e.prototype.parseMutationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.templateName=e.body.template.name),t},e.prototype.parseNotificationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,t},e.prototype.parseMutateTemplateVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body.template&&(t.templateName=e.body.template.name,t.templateVersion={tag:e.body.template.version.tag}),t},e.prototype.parseList=function(e){var t={};return t.items=e.body.items.map((function(e){return new i(e)})),t.pages=e.body.paging,t},e.prototype.parseListTemplateVersions=function(e){var t={};return t.template=new i(e.body.template),t.pages=e.body.paging,t},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseList(e)}))},e.prototype.get=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return new i(e.body.template)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseCreationResponse(e)}))},e.prototype.update=function(e,t,r){var n=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return n.parseMutationResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t)).then((function(e){return r.parseMutationResponse(e)}))},e.prototype.destroyAll=function(e){var t=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates")).then((function(e){return t.parseNotificationResponse(e)}))},e.prototype.createVersion=function(e,t,r){var n=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions"),r).then((function(e){return n.parseCreationVersionResponse(e)}))},e.prototype.getVersion=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return new i(e.body.template)}))},e.prototype.updateVersion=function(e,t,r,n){var o=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r),n).then((function(e){return o.parseMutateTemplateVersionResponse(e)}))},e.prototype.destroyVersion=function(e,t,r){var n=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return n.parseMutateTemplateVersionResponse(e)}))},e.prototype.listVersions=function(e,t,r){var n=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates",t,"/versions"),r).then((function(e){return n.parseListTemplateVersions(e)}))},e}();t.default=a},142:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=t.status,n=t.statusText,o=t.message,s=t.body,i=void 0===s?{}:s,a=this,u=i.message,l=i.error;return(a=e.call(this)||this).stack="",a.status=r,a.message=o||l||n,a.details=u,a}return n(t,e),t}(Error);t.default=o},22:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(78)),i=function(){function e(e){this.request=e}return e.prototype._parsePageNumber=function(e){return e.split("/").pop()||""},e.prototype._parsePage=function(e,t){return{id:e,number:this._parsePageNumber(t),url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var n=r[0],o=r[1];return e[n]=t._parsePage(n,o),e}),{})},e.prototype._parseEventList=function(e){return{items:e.body.items,pages:this._parsePageLinks(e)}},e.prototype.get=function(e,t){var r,o=this,i=n({},t);return i&&i.page?(r=(0,s.default)("/v3",e,"events",i.page),delete i.page):r=(0,s.default)("/v3",e,"events"),this.request.get(r,i).then((function(e){return o._parseEventList(e)}))},e}();t.default=i},175:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(475)),s=function(){function e(e){this.formData=e}return Object.defineProperty(e,"default",{get:function(){return this},enumerable:!1,configurable:!0}),e.prototype.client=function(e){return new o.default(e,this.formData)},e}();t.default=s},990:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SuppressionModels=void 0,function(e){e.BOUNCES="bounces",e.COMPLAINTS="complaints",e.UNSUBSCRIBES="unsubscribes",e.WHITELISTS="whitelists"}(t.SuppressionModels||(t.SuppressionModels={}))},602:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){var t=this;return this.request.get("/v1/ip_pools",e).then((function(e){return t.parseIpPoolsResponse(e)}))},e.prototype.create=function(e){return this.request.postWithFD("/v1/ip_pools",e).then((function(e){return null==e?void 0:e.body}))},e.prototype.update=function(e,t){return this.request.patchWithFD("/v1/ip_pools/".concat(e),t).then((function(e){return null==e?void 0:e.body}))},e.prototype.delete=function(e,t){return this.request.delete("/v1/ip_pools/".concat(e),t).then((function(e){return null==e?void 0:e.body}))},e.prototype.parseIpPoolsResponse=function(e){return e.body.ip_pools},e}();t.default=r},345:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){var t=this;return this.request.get("/v3/ips",e).then((function(e){return t.parseIpsResponse(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/ips/".concat(e)).then((function(e){return t.parseIpsResponse(e)}))},e.prototype.parseIpsResponse=function(e){return e.body},e}();t.default=r},126:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){this.request=e,this.baseRoute="/v3/lists",this.members=t}return e.prototype.parseValidationResult=function(e,t){return{status:e,validationResult:r(r({},t),{created_at:new Date(1e3*t.created_at)})}},e.prototype.list=function(e){return this.request.get("".concat(this.baseRoute,"/pages"),e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get("".concat(this.baseRoute,"/").concat(e)).then((function(e){return e.body.list}))},e.prototype.create=function(e){return this.request.postWithFD(this.baseRoute,e).then((function(e){return e.body.list}))},e.prototype.update=function(e,t){return this.request.putWithFD("".concat(this.baseRoute,"/").concat(e),t).then((function(e){return e.body.list}))},e.prototype.destroy=function(e){return this.request.delete("".concat(this.baseRoute,"/").concat(e)).then((function(e){return e.body}))},e.prototype.validate=function(e){return this.request.post("".concat(this.baseRoute,"/").concat(e,"/validate"),{}).then((function(e){return r({status:e.status},e.body)}))},e.prototype.validationResult=function(e){var t=this;return this.request.get("".concat(this.baseRoute,"/").concat(e,"/validate")).then((function(e){return t.parseValidationResult(e.status,e.body)}))},e.prototype.cancelValidation=function(e){return this.request.delete("".concat(this.baseRoute,"/").concat(e,"/validate")).then((function(e){return{status:e.status,message:e.body.message}}))},e}();t.default=n},135:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.request=e,this.baseRoute="/v3/lists"}return e.prototype.checkAndUpdateData=function(e){var t=r({},e);return"object"==typeof e.vars&&(t.vars=JSON.stringify(t.vars)),"boolean"==typeof e.subscribed&&(t.subscribed=e.subscribed?"yes":"no"),t},e.prototype.listMembers=function(e,t){return this.request.get("".concat(this.baseRoute,"/").concat(e,"/members/pages"),t).then((function(e){return e.body.items}))},e.prototype.getMember=function(e,t){return this.request.get("".concat(this.baseRoute,"/").concat(e,"/members/").concat(t)).then((function(e){return e.body.member}))},e.prototype.createMember=function(e,t){var r=this.checkAndUpdateData(t);return this.request.postWithFD("".concat(this.baseRoute,"/").concat(e,"/members"),r).then((function(e){return e.body.member}))},e.prototype.createMembers=function(e,t){var r={members:Array.isArray(t.members)?JSON.stringify(t.members):t.members,upsert:t.upsert};return this.request.postWithFD("".concat(this.baseRoute,"/").concat(e,"/members.json"),r).then((function(e){return e.body}))},e.prototype.updateMember=function(e,t,r){var n=this.checkAndUpdateData(r);return this.request.putWithFD("".concat(this.baseRoute,"/").concat(e,"/members/").concat(t),n).then((function(e){return e.body.member}))},e.prototype.destroyMember=function(e,t){return this.request.delete("".concat(this.baseRoute,"/").concat(e,"/members/").concat(t)).then((function(e){return e.body}))},e}();t.default=n},197:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.request=e}return e.prototype._parseResponse=function(e){return r({status:e.status},e.body)},e.prototype.create=function(e,t){return t.message?this.request.postWithFD("/v3/".concat(e,"/messages.mime"),t).then(this._parseResponse):this.request.postWithFD("/v3/".concat(e,"/messages"),t).then(this._parseResponse)},e}();t.default=n},587:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(){return this.request.get("/v4/address/validate/bulk").then((function(e){return e.body}))},e.prototype.get=function(e){return this.request.get("/v4/address/validate/bulk/".concat(e)).then((function(e){return e.body}))},e.prototype.create=function(e,t){return this.request.postWithFD("/v4/address/validate/bulk/".concat(e),t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v4/address/validate/bulk/".concat(e)).then((function(e){return e}))},e}();t.default=r},438:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return s(t,e),t},a=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,s){function i(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((n=n.apply(e,t||[])).next())}))},u=this&&this.__generator||function(e,t){var r,n,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var c=i(r(501)),d=l(r(78)),f=l(r(556)),p=l(r(142)),h=function(e){return"object"==typeof e&&"function"==typeof e.pipe};function b(e){return void 0!==e.getHeaders}var y=function(){function e(e,t){this.username=e.username,this.key=e.key,this.url=e.url,this.timeout=e.timeout,this.headers=e.headers||{},this.FormDataConstructor=t}return e.prototype.request=function(e,t,r){return a(this,void 0,void 0,(function(){var o,s,i,a,l,b,y;return u(this,(function(u){switch(u.label){case 0:return o=n({},r),s=c.encode("".concat(this.username,":").concat(this.key)),i=n(n({Authorization:"Basic ".concat(s)},this.headers),null==o?void 0:o.headers),null==o||delete o.headers,i["Content-Type"]||delete i["Content-Type"],a=n({},o),(null==o?void 0:o.query)&&Object.getOwnPropertyNames(null==o?void 0:o.query).length>0&&(a.searchParams=o.query,delete a.query),[4,(0,f.default)((0,d.default)(this.url,t),n({method:e.toLocaleUpperCase(),headers:i,throwHttpErrors:!1,timeout:this.timeout},a))];case 1:return(null==(l=u.sent())?void 0:l.ok)?[3,6]:(null==l?void 0:l.body)&&h(l.body)?[4,(m=l.body,g=[],new Promise((function(e,t){m.on("data",(function(e){return g.push(e)})),m.on("error",t),m.on("end",(function(){return e(Buffer.concat(g).toString("utf8"))}))})))]:[3,3];case 2:return y=u.sent(),[3,5];case 3:return[4,null==l?void 0:l.json()];case 4:y=u.sent(),u.label=5;case 5:throw b=y,new p.default({status:null==l?void 0:l.status,statusText:null==l?void 0:l.statusText,body:{message:b}});case 6:return[4,this.getResponseBody(l)];case 7:return[2,u.sent()]}var m,g}))}))},e.prototype.getResponseBody=function(e){return a(this,void 0,void 0,(function(){var t,r,n;return u(this,(function(o){switch(o.label){case 0:t={body:{},status:null==e?void 0:e.status},r="",o.label=1;case 1:return o.trys.push([1,3,,4]),[4,e.text()];case 2:return r=o.sent(),n=JSON.parse(r),t.body=n,[2,t];case 3:return o.sent(),t.status=400,t.body={message:r},[2,t];case 4:return[2]}}))}))},e.prototype.query=function(e,t,r,o){return this.request(e,t,n({query:r},o))},e.prototype.command=function(e,t,r,o){return this.request(e,t,n({headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r},o))},e.prototype.get=function(e,t,r){return this.query("get",e,t,r)},e.prototype.head=function(e,t,r){return this.query("head",e,t,r)},e.prototype.options=function(e,t,r){return this.query("options",e,t,r)},e.prototype.post=function(e,t,r){return this.command("post",e,t,r)},e.prototype.postWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("post",e,r,{headers:{"Content-Type":null}})},e.prototype.putWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("put",e,r,{headers:{"Content-Type":null}})},e.prototype.patchWithFD=function(e,t){if(!t)throw new Error("Please provide data object");var r=this.createFormData(t);return this.command("patch",e,r,{headers:{"Content-Type":null}})},e.prototype.createFormData=function(e){var t=this;return Object.keys(e).filter((function(t){return e[t]})).reduce((function(r,n){return["attachment","inline","file"].includes(n)?(t.addFilesToFD(n,e[n],r),r):"message"===n?(t.addMimeDataToFD(n,e[n],r),r):(t.addCommonPropertyToFD(n,e[n],r),r)}),new this.FormDataConstructor)},e.prototype.addMimeDataToFD=function(e,t,r){b(r)?Buffer.isBuffer(t)&&r.append(e,t,{filename:"MimeMessage"}):r.append(e,t,"MimeMessage")},e.prototype.addFilesToFD=function(e,t,r){var o=function(e,t,r){var o=h(t)?t:t.data,s=function(e){if("object"!=typeof e||h(e))return{};var t=e.filename,r=e.contentType,o=e.knownLength;return n(n(n({},t?{filename:t}:{filename:"file"}),r&&{contentType:r}),o&&{knownLength:o})}(t);b(r)?r.append(e,o,s):r.append(e,o,s.filename)};Array.isArray(t)?t.forEach((function(t){o(e,t,r)})):o(e,t,r)},e.prototype.addCommonPropertyToFD=function(e,t,r){Array.isArray(t)?t.forEach((function(t){r.append(e,t)})):null!=t&&r.append(e,t)},e.prototype.put=function(e,t,r){return this.command("put",e,t,r)},e.prototype.patch=function(e,t,r){return this.command("patch",e,t,r)},e.prototype.delete=function(e,t,r){return this.command("delete",e,t,r)},e}();t.default=y},277:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){return this.request.get("/v3/routes",e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get("/v3/routes/".concat(e)).then((function(e){return e.body.route}))},e.prototype.create=function(e){return this.request.postWithFD("/v3/routes",e).then((function(e){return e.body.route}))},e.prototype.update=function(e,t){return this.request.putWithFD("/v3/routes/".concat(e),t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v3/routes/".concat(e)).then((function(e){return e.body}))},e}();t.default=r},747:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var i=s(r(78)),a=function(e){this.start=new Date(e.start),this.end=new Date(e.end),this.resolution=e.resolution,this.stats=e.stats.map((function(e){var t=n({},e);return t.time=new Date(e.time),t}))},u=function(){function e(e){this.request=e}return e.prototype.prepareSearchParams=function(e){var t=[];return"object"==typeof e&&Object.keys(e).length&&(t=Object.entries(e).reduce((function(e,t){var r=t[0],n=t[1];if(Array.isArray(n)&&n.length){var s=n.map((function(e){return[r,e]}));return o(o([],e,!0),s,!0)}return e.push([r,n]),e}),[])),t},e.prototype._parseStats=function(e){return new a(e.body)},e.prototype.getDomain=function(e,t){var r=this.prepareSearchParams(t);return this.request.get((0,i.default)("/v3",e,"stats/total"),r).then(this._parseStats)},e.prototype.getAccount=function(e){var t=this.prepareSearchParams(e);return this.request.get("/v3/stats/total",t).then(this._parseStats)},e}();t.default=u},778:function(e,t,r){"use strict";var n,o=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)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.WhiteList=t.Unsubscribe=t.Complaint=t.Bounce=t.Suppression=void 0;var a=i(r(78)),u=r(990),l=i(r(142)),c={headers:{"Content-Type":"application/json"}},d=function(e){this.type=e};t.Suppression=d;var f=function(e){function t(t){var r=e.call(this,u.SuppressionModels.BOUNCES)||this;return r.address=t.address,r.code=+t.code,r.error=t.error,r.created_at=new Date(t.created_at),r}return o(t,e),t}(d);t.Bounce=f;var p=function(e){function t(t){var r=e.call(this,u.SuppressionModels.COMPLAINTS)||this;return r.address=t.address,r.created_at=new Date(t.created_at),r}return o(t,e),t}(d);t.Complaint=p;var h=function(e){function t(t){var r=e.call(this,u.SuppressionModels.UNSUBSCRIBES)||this;return r.address=t.address,r.tags=t.tags,r.created_at=new Date(t.created_at),r}return o(t,e),t}(d);t.Unsubscribe=h;var b=function(e){function t(t){var r=e.call(this,u.SuppressionModels.WHITELISTS)||this;return r.value=t.value,r.reason=t.reason,r.createdAt=new Date(t.createdAt),r}return o(t,e),t}(d);t.WhiteList=b;var y=function(){function e(e){this.request=e,this.models=new Map,this.models.set("bounces",f),this.models.set("complaints",p),this.models.set("unsubscribes",h),this.models.set("whitelists",b)}return e.prototype._parsePage=function(e,t){var r=new URL(t).searchParams;return{id:e,page:r.has("page")?r.get("page"):void 0,address:r.has("address")?r.get("address"):void 0,url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var n=r[0],o=r[1];return e[n]=t._parsePage(n,o),e}),{})},e.prototype._parseList=function(e,t){var r={};return r.items=e.body.items.map((function(e){return new t(e)})),r.pages=this._parsePageLinks(e),r},e.prototype._parseItem=function(e,t){return new t(e)},e.prototype.createWhiteList=function(e,t){if(Array.isArray(t))throw new l.default({status:400,statusText:"Data property should be an object",body:{message:"Whitelist's creation process does not support multiple creations. Data property should be an object"}});return this.request.postWithFD((0,a.default)("v3",e,"whitelists"),t).then(this.prepareResponse)},e.prototype.checkType=function(e){if(!this.models.has(e))throw new l.default({status:400,statusText:"Unknown type value",body:{message:"Type may be only one of [bounces, complaints, unsubscribes, whitelists]"}})},e.prototype.prepareResponse=function(e){return{message:e.body.message,type:e.body.type||"",value:e.body.value||"",status:e.status}},e.prototype.list=function(e,t,r){var n=this;this.checkType(t);var o=this.models.get(t);return this.request.get((0,a.default)("v3",e,t),r).then((function(e){return n._parseList(e,o)}))},e.prototype.get=function(e,t,r){var n=this;this.checkType(t);var o=this.models.get(t);return this.request.get((0,a.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return n._parseItem(e.body,o)}))},e.prototype.create=function(e,t,r){var n;return this.checkType(t),"whitelists"===t?this.createWhiteList(e,r):(n=Array.isArray(r)?s([],r,!0):[r],this.request.post((0,a.default)("v3",e,t),JSON.stringify(n),c).then(this.prepareResponse))},e.prototype.destroy=function(e,t,r){return this.checkType(t),this.request.delete((0,a.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return{message:e.body.message,value:e.body.value||"",address:e.body.address||"",status:e.status}}))},e}();t.default=y,e.exports=y},839:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this.request=e,this.multipleValidation=t}return e.prototype.get=function(e){return this.request.get("/v4/address/validate",{address:e}).then((function(e){return e})).then((function(e){return e.body}))},e}();t.default=r},750:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(78)),s=function(e,t){this.id=e,this.url=t},i=function(){function e(e){this.request=e}return e.prototype._parseWebhookList=function(e){return e.body.webhooks},e.prototype._parseWebhookWithID=function(e){return function(t){var r,n=null===(r=null==t?void 0:t.body)||void 0===r?void 0:r.webhook,o=null==n?void 0:n.url;return o||(o=(null==n?void 0:n.urls)&&n.urls.length?n.urls[0]:void 0),new s(e,o)}},e.prototype._parseWebhookTest=function(e){return{code:e.body.code,message:e.body.message}},e.prototype.list=function(e,t){return this.request.get((0,o.default)("/v3/domains",e,"webhooks"),t).then(this._parseWebhookList)},e.prototype.get=function(e,t){return this.request.get((0,o.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e.prototype.create=function(e,t,r,n){return void 0===n&&(n=!1),n?this.request.putWithFD((0,o.default)("/v3/domains",e,"webhooks",t,"test"),{url:r}).then(this._parseWebhookTest):this.request.postWithFD((0,o.default)("/v3/domains",e,"webhooks"),{id:t,url:r}).then(this._parseWebhookWithID(t))},e.prototype.update=function(e,t,r){return this.request.putWithFD((0,o.default)("/v3/domains",e,"webhooks",t),{url:r}).then(this._parseWebhookWithID(t))},e.prototype.destroy=function(e,t){return this.request.delete((0,o.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e}();t.default=i},501:function(e,t,r){var n;e=r.nmd(e),function(o){var s=t,i=(e&&e.exports,"object"==typeof global&&global);i.global!==i&&i.window;var a=function(e){this.message=e};(a.prototype=new Error).name="InvalidCharacterError";var u=function(e){throw new a(e)},l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=/[\t\n\f\r ]/g,d={encode:function(e){e=String(e),/[^\0-\xFF]/.test(e)&&u("The string to be encoded contains characters outside of the Latin1 range.");for(var t,r,n,o,s=e.length%3,i="",a=-1,c=e.length-s;++a<c;)t=e.charCodeAt(a)<<16,r=e.charCodeAt(++a)<<8,n=e.charCodeAt(++a),i+=l.charAt((o=t+r+n)>>18&63)+l.charAt(o>>12&63)+l.charAt(o>>6&63)+l.charAt(63&o);return 2==s?(t=e.charCodeAt(a)<<8,r=e.charCodeAt(++a),i+=l.charAt((o=t+r)>>10)+l.charAt(o>>4&63)+l.charAt(o<<2&63)+"="):1==s&&(o=e.charCodeAt(a),i+=l.charAt(o>>2)+l.charAt(o<<4&63)+"=="),i},decode:function(e){var t=(e=String(e).replace(c,"")).length;t%4==0&&(t=(e=e.replace(/==?$/,"")).length),(t%4==1||/[^+a-zA-Z0-9/]/.test(e))&&u("Invalid character: the string to be decoded is not correctly encoded.");for(var r,n,o=0,s="",i=-1;++i<t;)n=l.indexOf(e.charAt(i)),r=o%4?64*r+n:n,o++%4&&(s+=String.fromCharCode(255&r>>(-2*o&6)));return s},version:"1.0.0"};void 0===(n=function(){return d}.call(t,r,t,e))||(e.exports=n)}()},94:e=>{"use strict";e.exports=function(e){if(!/^data:/i.test(e))throw new TypeError('`uri` does not appear to be a Data URI (must begin with "data:")');const t=(e=e.replace(/\r?\n/g,"")).indexOf(",");if(-1===t||t<=4)throw new TypeError("malformed data: URI");const r=e.substring(5,t).split(";");let n="",o=!1;const s=r[0]||"text/plain";let i=s;for(let e=1;e<r.length;e++)"base64"===r[e]?o=!0:(i+=`;${r[e]}`,0===r[e].indexOf("charset=")&&(n=r[e].substring(8)));r[0]||n.length||(i+=";charset=US-ASCII",n="US-ASCII");const a=o?"base64":"ascii",u=unescape(e.substring(t+1)),l=Buffer.from(u,a);return l.type=s,l.typeFull=i,l.charset=n,l}},185:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=new WeakMap,n=new WeakMap;function o(e){const t=r.get(e);return console.assert(null!=t,"'this' is expected an Event object, but got",e),t}function s(e){null==e.passiveListener?e.event.cancelable&&(e.canceled=!0,"function"==typeof e.event.preventDefault&&e.event.preventDefault()):"undefined"!=typeof console&&"function"==typeof console.error&&console.error("Unable to preventDefault inside passive event listener invocation.",e.passiveListener)}function i(e,t){r.set(this,{eventTarget:e,event:t,eventPhase:2,currentTarget:e,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:t.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});const n=Object.keys(t);for(let e=0;e<n.length;++e){const t=n[e];t in this||Object.defineProperty(this,t,a(t))}}function a(e){return{get(){return o(this).event[e]},set(t){o(this).event[e]=t},configurable:!0,enumerable:!0}}function u(e){return{value(){const t=o(this).event;return t[e].apply(t,arguments)},configurable:!0,enumerable:!0}}function l(e){if(null==e||e===Object.prototype)return i;let t=n.get(e);return null==t&&(t=function(e,t){const r=Object.keys(t);if(0===r.length)return e;function n(t,r){e.call(this,t,r)}n.prototype=Object.create(e.prototype,{constructor:{value:n,configurable:!0,writable:!0}});for(let o=0;o<r.length;++o){const s=r[o];if(!(s in e.prototype)){const e="function"==typeof Object.getOwnPropertyDescriptor(t,s).value;Object.defineProperty(n.prototype,s,e?u(s):a(s))}}return n}(l(Object.getPrototypeOf(e)),e),n.set(e,t)),t}function c(e){return o(e).immediateStopped}function d(e,t){o(e).passiveListener=t}i.prototype={get type(){return o(this).event.type},get target(){return o(this).eventTarget},get currentTarget(){return o(this).currentTarget},composedPath(){const e=o(this).currentTarget;return null==e?[]:[e]},get NONE(){return 0},get CAPTURING_PHASE(){return 1},get AT_TARGET(){return 2},get BUBBLING_PHASE(){return 3},get eventPhase(){return o(this).eventPhase},stopPropagation(){const e=o(this);e.stopped=!0,"function"==typeof e.event.stopPropagation&&e.event.stopPropagation()},stopImmediatePropagation(){const e=o(this);e.stopped=!0,e.immediateStopped=!0,"function"==typeof e.event.stopImmediatePropagation&&e.event.stopImmediatePropagation()},get bubbles(){return Boolean(o(this).event.bubbles)},get cancelable(){return Boolean(o(this).event.cancelable)},preventDefault(){s(o(this))},get defaultPrevented(){return o(this).canceled},get composed(){return Boolean(o(this).event.composed)},get timeStamp(){return o(this).timeStamp},get srcElement(){return o(this).eventTarget},get cancelBubble(){return o(this).stopped},set cancelBubble(e){if(!e)return;const t=o(this);t.stopped=!0,"boolean"==typeof t.event.cancelBubble&&(t.event.cancelBubble=!0)},get returnValue(){return!o(this).canceled},set returnValue(e){e||s(o(this))},initEvent(){}},Object.defineProperty(i.prototype,"constructor",{value:i,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.Event&&(Object.setPrototypeOf(i.prototype,window.Event.prototype),n.set(window.Event.prototype,i));const f=new WeakMap;function p(e){return null!==e&&"object"==typeof e}function h(e){const t=f.get(e);if(null==t)throw new TypeError("'this' is expected an EventTarget object, but got another value.");return t}function b(e,t){Object.defineProperty(e,`on${t}`,function(e){return{get(){let t=h(this).get(e);for(;null!=t;){if(3===t.listenerType)return t.listener;t=t.next}return null},set(t){"function"==typeof t||p(t)||(t=null);const r=h(this);let n=null,o=r.get(e);for(;null!=o;)3===o.listenerType?null!==n?n.next=o.next:null!==o.next?r.set(e,o.next):r.delete(e):n=o,o=o.next;if(null!==t){const o={listener:t,listenerType:3,passive:!1,once:!1,next:null};null===n?r.set(e,o):n.next=o}},configurable:!0,enumerable:!0}}(t))}function y(e){function t(){m.call(this)}t.prototype=Object.create(m.prototype,{constructor:{value:t,configurable:!0,writable:!0}});for(let r=0;r<e.length;++r)b(t.prototype,e[r]);return t}function m(){if(!(this instanceof m)){if(1===arguments.length&&Array.isArray(arguments[0]))return y(arguments[0]);if(arguments.length>0){const e=new Array(arguments.length);for(let t=0;t<arguments.length;++t)e[t]=arguments[t];return y(e)}throw new TypeError("Cannot call a class as a function")}f.set(this,new Map)}m.prototype={addEventListener(e,t,r){if(null==t)return;if("function"!=typeof t&&!p(t))throw new TypeError("'listener' should be a function or an object.");const n=h(this),o=p(r),s=(o?Boolean(r.capture):Boolean(r))?1:2,i={listener:t,listenerType:s,passive:o&&Boolean(r.passive),once:o&&Boolean(r.once),next:null};let a=n.get(e);if(void 0===a)return void n.set(e,i);let u=null;for(;null!=a;){if(a.listener===t&&a.listenerType===s)return;u=a,a=a.next}u.next=i},removeEventListener(e,t,r){if(null==t)return;const n=h(this),o=(p(r)?Boolean(r.capture):Boolean(r))?1:2;let s=null,i=n.get(e);for(;null!=i;){if(i.listener===t&&i.listenerType===o)return void(null!==s?s.next=i.next:null!==i.next?n.set(e,i.next):n.delete(e));s=i,i=i.next}},dispatchEvent(e){if(null==e||"string"!=typeof e.type)throw new TypeError('"event.type" should be a string.');const t=h(this),r=e.type;let n=t.get(r);if(null==n)return!0;const s=function(e,t){return new(l(Object.getPrototypeOf(t)))(e,t)}(this,e);let i=null;for(;null!=n;){if(n.once?null!==i?i.next=n.next:null!==n.next?t.set(r,n.next):t.delete(r):i=n,d(s,n.passive?n.listener:null),"function"==typeof n.listener)try{n.listener.call(this,s)}catch(e){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(e)}else 3!==n.listenerType&&"function"==typeof n.listener.handleEvent&&n.listener.handleEvent(s);if(c(s))break;n=n.next}return d(s,null),function(e,t){o(e).eventPhase=t}(s,0),function(e,t){o(e).currentTarget=t}(s,null),!s.defaultPrevented}},Object.defineProperty(m.prototype,"constructor",{value:m,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.EventTarget&&Object.setPrototypeOf(m.prototype,window.EventTarget.prototype),t.defineEventAttribute=b,t.EventTarget=m,t.default=m,e.exports=m,e.exports.EventTarget=e.exports.default=m,e.exports.defineEventAttribute=b},30:(e,t,r)=>{const{Readable:n}=r(781),o=new WeakMap;class Blob{constructor(e=[],t={}){let r=0;const n=e.map((e=>{let t;return t=e instanceof Buffer?e:ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer?Buffer.from(e):e instanceof Blob?e:Buffer.from("string"==typeof e?e:String(e)),r+=t.length||t.size||0,t})),s=void 0===t.type?"":String(t.type).toLowerCase();o.set(this,{type:/[^\u0020-\u007E]/.test(s)?"":s,size:r,parts:n})}get size(){return o.get(this).size}get type(){return o.get(this).type}async text(){return Buffer.from(await this.arrayBuffer()).toString()}async arrayBuffer(){const e=new Uint8Array(this.size);let t=0;for await(const r of this.stream())e.set(r,t),t+=r.length;return e.buffer}stream(){return n.from(async function*(e){for(const t of e)"stream"in t?yield*t.stream():yield t}(o.get(this).parts))}slice(e=0,t=this.size,r=""){const{size:n}=this;let s=e<0?Math.max(n+e,0):Math.min(e,n),i=t<0?Math.max(n+t,0):Math.min(t,n);const a=Math.max(i-s,0),u=o.get(this).parts.values(),l=[];let c=0;for(const e of u){const t=ArrayBuffer.isView(e)?e.byteLength:e.size;if(s&&t<=s)s-=t,i-=t;else{const r=e.slice(s,Math.min(t,i));if(l.push(r),c+=ArrayBuffer.isView(r)?r.byteLength:r.size,s=0,c>=a)break}}const d=new Blob([],{type:String(r).toLowerCase()});return Object.assign(o.get(d),{size:a,parts:l}),d}get[Symbol.toStringTag](){return"Blob"}static[Symbol.hasInstance](e){return e&&"object"==typeof e&&"function"==typeof e.stream&&0===e.stream.length&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[Symbol.toStringTag])}}Object.defineProperties(Blob.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}}),e.exports=Blob},556:(e,t,r)=>{"use strict";const n=r(594),o=r(271);if(global.fetch||(global.fetch=(e,t)=>n(e,{highWaterMark:1e7,...t})),global.Headers||(global.Headers=n.Headers),global.Request||(global.Request=n.Request),global.Response||(global.Response=n.Response),global.AbortController||(global.AbortController=o),!global.ReadableStream)try{global.ReadableStream=r(902)}catch(e){}e.exports=r(721)},721:function(e){var t;t=function(){"use strict";const e={},t=e=>"undefined"!=typeof self&&self&&e in self?self:"undefined"!=typeof window&&window&&e in window?window:"undefined"!=typeof global&&global&&e in global?global:"undefined"!=typeof globalThis&&globalThis?globalThis:void 0,r=["Headers","Request","Response","ReadableStream","fetch","AbortController","FormData"];for(const n of r)Object.defineProperty(e,n,{get(){const e=t(n),r=e&&e[n];return"function"==typeof r?r.bind(e):r}});const n=e=>null!==e&&"object"==typeof e,o="function"==typeof e.AbortController,s="function"==typeof e.ReadableStream,i="function"==typeof e.FormData,a=(t,r)=>{const n=new e.Headers(t||{}),o=r instanceof e.Headers,s=new e.Headers(r||{});for(const[e,t]of s)o&&"undefined"===t||void 0===t?n.delete(e):n.set(e,t);return n},u=(...e)=>{let t={},r={};for(const o of e){if(Array.isArray(o))Array.isArray(t)||(t=[]),t=[...t,...o];else if(n(o)){for(let[e,r]of Object.entries(o))n(r)&&e in t&&(r=u(t[e],r)),t={...t,[e]:r};n(o.headers)&&(r=a(r,o.headers))}t.headers=r}return t},l=["get","post","put","patch","head","delete"],c={json:"application/json",text:"text/*",formData:"multipart/form-data",arrayBuffer:"*/*",blob:"*/*"},d=[413,429,503],f=Symbol("stop");class HTTPError extends Error{constructor(e){super(e.statusText||String(0===e.status||e.status?e.status:"Unknown response error")),this.name="HTTPError",this.response=e}}class TimeoutError extends Error{constructor(e){super("Request timed out"),this.name="TimeoutError",this.request=e}}const p=e=>new Promise((t=>setTimeout(t,e))),h=e=>l.includes(e)?e.toUpperCase():e,b={limit:2,methods:["get","put","head","delete","options","trace"],statusCodes:[408,413,429,500,502,503,504],afterStatusCodes:d},y=(e={})=>{if("number"==typeof e)return{...b,limit:e};if(e.methods&&!Array.isArray(e.methods))throw new Error("retry.methods must be an array");if(e.statusCodes&&!Array.isArray(e.statusCodes))throw new Error("retry.statusCodes must be an array");return{...b,...e,afterStatusCodes:d}},m=2147483647;class Ky{constructor(t,r={}){if(this._retryCount=0,this._input=t,this._options={credentials:this._input.credentials||"same-origin",...r,headers:a(this._input.headers,r.headers),hooks:u({beforeRequest:[],beforeRetry:[],afterResponse:[]},r.hooks),method:h(r.method||this._input.method),prefixUrl:String(r.prefixUrl||""),retry:y(r.retry),throwHttpErrors:!1!==r.throwHttpErrors,timeout:void 0===r.timeout?1e4:r.timeout,fetch:r.fetch||e.fetch},"string"!=typeof this._input&&!(this._input instanceof URL||this._input instanceof e.Request))throw new TypeError("`input` must be a string, URL, or Request");if(this._options.prefixUrl&&"string"==typeof this._input){if(this._input.startsWith("/"))throw new Error("`input` must not begin with a slash when using `prefixUrl`");this._options.prefixUrl.endsWith("/")||(this._options.prefixUrl+="/"),this._input=this._options.prefixUrl+this._input}if(o&&(this.abortController=new e.AbortController,this._options.signal&&this._options.signal.addEventListener("abort",(()=>{this.abortController.abort()})),this._options.signal=this.abortController.signal),this.request=new e.Request(this._input,this._options),this._options.searchParams){const t="?"+new URLSearchParams(this._options.searchParams).toString(),r=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,t);!(i&&this._options.body instanceof e.FormData||this._options.body instanceof URLSearchParams)||this._options.headers&&this._options.headers["content-type"]||this.request.headers.delete("content-type"),this.request=new e.Request(new e.Request(r,this.request),this._options)}void 0!==this._options.json&&(this._options.body=JSON.stringify(this._options.json),this.request.headers.set("content-type","application/json"),this.request=new e.Request(this.request,{body:this._options.body}));const n=async()=>{if(this._options.timeout>m)throw new RangeError("The `timeout` option cannot be greater than 2147483647");await p(1);let t=await this._fetch();for(const r of this._options.hooks.afterResponse){const n=await r(this.request,this._options,this._decorateResponse(t.clone()));n instanceof e.Response&&(t=n)}if(this._decorateResponse(t),!t.ok&&this._options.throwHttpErrors)throw new HTTPError(t);if(this._options.onDownloadProgress){if("function"!=typeof this._options.onDownloadProgress)throw new TypeError("The `onDownloadProgress` option must be a function");if(!s)throw new Error("Streams are not supported in your environment. `ReadableStream` is missing.");return this._stream(t.clone(),this._options.onDownloadProgress)}return t},l=this._options.retry.methods.includes(this.request.method.toLowerCase())?this._retry(n):n();for(const[e,t]of Object.entries(c))l[e]=async()=>{this.request.headers.set("accept",this.request.headers.get("accept")||t);const n=(await l).clone();if("json"===e){if(204===n.status)return"";if(r.parseJson)return r.parseJson(await n.text())}return n[e]()};return l}_calculateRetryDelay(e){if(this._retryCount++,this._retryCount<this._options.retry.limit&&!(e instanceof TimeoutError)){if(e instanceof HTTPError){if(!this._options.retry.statusCodes.includes(e.response.status))return 0;const t=e.response.headers.get("Retry-After");if(t&&this._options.retry.afterStatusCodes.includes(e.response.status)){let e=Number(t);return Number.isNaN(e)?e=Date.parse(t)-Date.now():e*=1e3,void 0!==this._options.retry.maxRetryAfter&&e>this._options.retry.maxRetryAfter?0:e}if(413===e.response.status)return 0}return.3*2**(this._retryCount-1)*1e3}return 0}_decorateResponse(e){return this._options.parseJson&&(e.json=async()=>this._options.parseJson(await e.text())),e}async _retry(e){try{return await e()}catch(t){const r=Math.min(this._calculateRetryDelay(t),m);if(0!==r&&this._retryCount>0){await p(r);for(const e of this._options.hooks.beforeRetry)if(await e({request:this.request,options:this._options,error:t,retryCount:this._retryCount})===f)return;return this._retry(e)}if(this._options.throwHttpErrors)throw t}}async _fetch(){for(const e of this._options.hooks.beforeRequest){const t=await e(this.request,this._options);if(t instanceof Request){this.request=t;break}if(t instanceof Response)return t}return!1===this._options.timeout?this._options.fetch(this.request.clone()):(e=this.request.clone(),t=this.abortController,r=this._options,new Promise(((n,o)=>{const s=setTimeout((()=>{t&&t.abort(),o(new TimeoutError(e))}),r.timeout);r.fetch(e).then(n).catch(o).then((()=>{clearTimeout(s)}))})));var e,t,r}_stream(t,r){const n=Number(t.headers.get("content-length"))||0;let o=0;return new e.Response(new e.ReadableStream({start(e){const s=t.body.getReader();r&&r({percent:0,transferredBytes:0,totalBytes:n},new Uint8Array),async function t(){const{done:i,value:a}=await s.read();i?e.close():(r&&(o+=a.byteLength,r({percent:0===n?0:o/n,transferredBytes:o,totalBytes:n},a)),e.enqueue(a),t())}()}}))}}const g=(...e)=>{for(const t of e)if((!n(t)||Array.isArray(t))&&void 0!==t)throw new TypeError("The `options` argument must be an object");return u({},...e)},_=e=>{const t=(t,r)=>new Ky(t,g(e,r));for(const r of l)t[r]=(t,n)=>new Ky(t,g(e,n,{method:r}));return t.HTTPError=HTTPError,t.TimeoutError=TimeoutError,t.create=e=>_(g(e)),t.extend=t=>_(g(e,t)),t.stop=f,t};return _()},e.exports=t()},78:function(e,t,r){var n,o,s;s=function(){function e(e){var t=[];if(0===e.length)return"";if("string"!=typeof e[0])throw new TypeError("Url must be a string. Received "+e[0]);if(e[0].match(/^[^/:]+:\/*$/)&&e.length>1){var r=e.shift();e[0]=r+e[0]}e[0].match(/^file:\/\/\//)?e[0]=e[0].replace(/^([^/:]+):\/*/,"$1:///"):e[0]=e[0].replace(/^([^/:]+):\/*/,"$1://");for(var n=0;n<e.length;n++){var o=e[n];if("string"!=typeof o)throw new TypeError("Url must be a string. Received "+o);""!==o&&(n>0&&(o=o.replace(/^[\/]+/,"")),o=n<e.length-1?o.replace(/[\/]+$/,""):o.replace(/[\/]+$/,"/"),t.push(o))}var s=t.join("/"),i=(s=s.replace(/\/(\?|&|#[^!])/g,"$1")).split("?");return s=i.shift()+(i.length>0?"?":"")+i.join("&")}return function(){return e("object"==typeof arguments[0]?arguments[0]:[].slice.call(arguments))}},e.exports?e.exports=s():void 0===(o="function"==typeof(n=s)?n.call(t,r,t,e):n)||(e.exports=o)},113:e=>{"use strict";e.exports=require("crypto")},685:e=>{"use strict";e.exports=require("http")},687:e=>{"use strict";e.exports=require("https")},781:e=>{"use strict";e.exports=require("stream")},310:e=>{"use strict";e.exports=require("url")},837:e=>{"use strict";e.exports=require("util")},796:e=>{"use strict";e.exports=require("zlib")},594:(e,t,r)=>{"use strict";t=e.exports=W;const n=r(685),o=r(687),s=r(796),i=r(781),a=r(94),u=r(837),l=r(30),c=r(113),d=r(310);class FetchBaseError extends Error{constructor(e,t){super(e),Error.captureStackTrace(this,this.constructor),this.type=t}get name(){return this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}}class FetchError extends FetchBaseError{constructor(e,t,r){super(e,t),r&&(this.code=this.errno=r.code,this.erroredSysCall=r.syscall)}}const f=Symbol.toStringTag,p=e=>"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.delete&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.has&&"function"==typeof e.set&&"function"==typeof e.sort&&"URLSearchParams"===e[f],h=e=>"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[f]);function b(e){return"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.set&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.delete&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries&&"function"==typeof e.constructor&&"FormData"===e[f]}const y="\r\n",m="-".repeat(2),g=Buffer.byteLength(y),_=e=>`${m}${e}${m}${y.repeat(2)}`;function v(e,t,r){let n="";return n+=`${m}${e}\r\n`,n+=`Content-Disposition: form-data; name="${t}"`,h(r)&&(n+=`; filename="${r.name}"\r\n`,n+=`Content-Type: ${r.type||"application/octet-stream"}`),`${n}${y.repeat(2)}`}const w=Symbol("Body internals");class Body{constructor(e,{size:t=0}={}){let r=null;null===e?e=null:p(e)?e=Buffer.from(e.toString()):h(e)||Buffer.isBuffer(e)||(u.types.isAnyArrayBuffer(e)?e=Buffer.from(e):ArrayBuffer.isView(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof i||(b(e)?(r=`NodeFetchFormDataBoundary${c.randomBytes(8).toString("hex")}`,e=i.Readable.from(async function*(e,t){for(const[r,n]of e)yield v(t,r,n),h(n)?yield*n.stream():yield n,yield y;yield _(t)}(e,r))):e=Buffer.from(String(e)))),this[w]={body:e,boundary:r,disturbed:!1,error:null},this.size=t,e instanceof i&&e.on("error",(e=>{const t=e instanceof FetchBaseError?e:new FetchError(`Invalid response body while trying to fetch ${this.url}: ${e.message}`,"system",e);this[w].error=t}))}get body(){return this[w].body}get bodyUsed(){return this[w].disturbed}async arrayBuffer(){const{buffer:e,byteOffset:t,byteLength:r}=await S(this);return e.slice(t,t+r)}async blob(){const e=this.headers&&this.headers.get("content-type")||this[w].body&&this[w].body.type||"",t=await this.buffer();return new l([t],{type:e})}async json(){const e=await S(this);return JSON.parse(e.toString())}async text(){return(await S(this)).toString()}buffer(){return S(this)}}async function S(e){if(e[w].disturbed)throw new TypeError(`body used already for: ${e.url}`);if(e[w].disturbed=!0,e[w].error)throw e[w].error;let{body:t}=e;if(null===t)return Buffer.alloc(0);if(h(t)&&(t=t.stream()),Buffer.isBuffer(t))return t;if(!(t instanceof i))return Buffer.alloc(0);const r=[];let n=0;try{for await(const o of t){if(e.size>0&&n+o.length>e.size){const r=new FetchError(`content size at ${e.url} over limit: ${e.size}`,"max-size");throw t.destroy(r),r}n+=o.length,r.push(o)}}catch(t){throw t instanceof FetchBaseError?t:new FetchError(`Invalid response body while trying to fetch ${e.url}: ${t.message}`,"system",t)}if(!0!==t.readableEnded&&!0!==t._readableState.ended)throw new FetchError(`Premature close of server response while trying to fetch ${e.url}`);try{return r.every((e=>"string"==typeof e))?Buffer.from(r.join("")):Buffer.concat(r,n)}catch(t){throw new FetchError(`Could not create Buffer from response body for ${e.url}: ${t.message}`,"system",t)}}Object.defineProperties(Body.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}});const R=(e,t)=>{let r,n,{body:o}=e;if(e.bodyUsed)throw new Error("cannot clone body after it is used");return o instanceof i&&"function"!=typeof o.getBoundary&&(r=new i.PassThrough({highWaterMark:t}),n=new i.PassThrough({highWaterMark:t}),o.pipe(r),o.pipe(n),e[w].body=r,o=n),o},T=(e,t)=>null===e?null:"string"==typeof e?"text/plain;charset=UTF-8":p(e)?"application/x-www-form-urlencoded;charset=UTF-8":h(e)?e.type||null:Buffer.isBuffer(e)||u.types.isAnyArrayBuffer(e)||ArrayBuffer.isView(e)?null:e&&"function"==typeof e.getBoundary?`multipart/form-data;boundary=${e.getBoundary()}`:b(e)?`multipart/form-data; boundary=${t[w].boundary}`:e instanceof i?null:"text/plain;charset=UTF-8",q=e=>{const{body:t}=e;return null===t?0:h(t)?t.size:Buffer.isBuffer(t)?t.length:t&&"function"==typeof t.getLengthSync?t.hasKnownLength&&t.hasKnownLength()?t.getLengthSync():null:b(t)?function(e,t){let r=0;for(const[n,o]of e)r+=Buffer.byteLength(v(t,n,o)),h(o)?r+=o.size:r+=Buffer.byteLength(String(o)),r+=g;return r+=Buffer.byteLength(_(t)),r}(e[w].boundary):null},P="function"==typeof n.validateHeaderName?n.validateHeaderName:e=>{if(!/^[\^`\-\w!#$%&'*+.|~]+$/.test(e)){const t=new TypeError(`Header name must be a valid HTTP token [${e}]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_HTTP_TOKEN"}),t}},C="function"==typeof n.validateHeaderValue?n.validateHeaderValue:(e,t)=>{if(/[^\t\u0020-\u007E\u0080-\u00FF]/.test(t)){const t=new TypeError(`Invalid character in header content ["${e}"]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_CHAR"}),t}};class Headers extends URLSearchParams{constructor(e){let t=[];if(e instanceof Headers){const r=e.raw();for(const[e,n]of Object.entries(r))t.push(...n.map((t=>[e,t])))}else if(null==e);else{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Failed to construct 'Headers': The provided value is not of type '(sequence<sequence<ByteString>> or record<ByteString, ByteString>)");{const r=e[Symbol.iterator];if(null==r)t.push(...Object.entries(e));else{if("function"!=typeof r)throw new TypeError("Header pairs must be iterable");t=[...e].map((e=>{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Each header pair must be an iterable object");return[...e]})).map((e=>{if(2!==e.length)throw new TypeError("Each header pair must be a name/value tuple");return[...e]}))}}}return t=t.length>0?t.map((([e,t])=>(P(e),C(e,String(t)),[String(e).toLowerCase(),String(t)]))):void 0,super(t),new Proxy(this,{get(e,t,r){switch(t){case"append":case"set":return(e,n)=>(P(e),C(e,String(n)),URLSearchParams.prototype[t].call(r,String(e).toLowerCase(),String(n)));case"delete":case"has":case"getAll":return e=>(P(e),URLSearchParams.prototype[t].call(r,String(e).toLowerCase()));case"keys":return()=>(e.sort(),new Set(URLSearchParams.prototype.keys.call(e)).keys());default:return Reflect.get(e,t,r)}}})}get[Symbol.toStringTag](){return this.constructor.name}toString(){return Object.prototype.toString.call(this)}get(e){const t=this.getAll(e);if(0===t.length)return null;let r=t.join(", ");return/^content-encoding$/i.test(e)&&(r=r.toLowerCase()),r}forEach(e){for(const t of this.keys())e(this.get(t),t)}*values(){for(const e of this.keys())yield this.get(e)}*entries(){for(const e of this.keys())yield[e,this.get(e)]}[Symbol.iterator](){return this.entries()}raw(){return[...this.keys()].reduce(((e,t)=>(e[t]=this.getAll(t),e)),{})}[Symbol.for("nodejs.util.inspect.custom")](){return[...this.keys()].reduce(((e,t)=>{const r=this.getAll(t);return e[t]="host"===t?r[0]:r.length>1?r:r[0],e}),{})}}Object.defineProperties(Headers.prototype,["get","entries","forEach","values"].reduce(((e,t)=>(e[t]={enumerable:!0},e)),{}));const E=new Set([301,302,303,307,308]),O=e=>E.has(e),j=Symbol("Response internals");class Response extends Body{constructor(e=null,t={}){super(e,t);const r=t.status||200,n=new Headers(t.headers);if(null!==e&&!n.has("Content-Type")){const t=T(e);t&&n.append("Content-Type",t)}this[j]={url:t.url,status:r,statusText:t.statusText||"",headers:n,counter:t.counter,highWaterMark:t.highWaterMark}}get url(){return this[j].url||""}get status(){return this[j].status}get ok(){return this[j].status>=200&&this[j].status<300}get redirected(){return this[j].counter>0}get statusText(){return this[j].statusText}get headers(){return this[j].headers}get highWaterMark(){return this[j].highWaterMark}clone(){return new Response(R(this,this.highWaterMark),{url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected,size:this.size})}static redirect(e,t=302){if(!O(t))throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');return new Response(null,{headers:{location:new URL(e).toString()},status:t})}get[Symbol.toStringTag](){return"Response"}}Object.defineProperties(Response.prototype,{url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}});const A=Symbol("Request internals"),k=e=>"object"==typeof e&&"object"==typeof e[A];class Request extends Body{constructor(e,t={}){let r;k(e)?r=new URL(e.url):(r=new URL(e),e={});let n=t.method||e.method||"GET";if(n=n.toUpperCase(),(null!=t.body||k(e))&&null!==e.body&&("GET"===n||"HEAD"===n))throw new TypeError("Request with GET/HEAD method cannot have body");const o=t.body?t.body:k(e)&&null!==e.body?R(e):null;super(o,{size:t.size||e.size||0});const s=new Headers(t.headers||e.headers||{});if(null!==o&&!s.has("Content-Type")){const e=T(o,this);e&&s.append("Content-Type",e)}let i=k(e)?e.signal:null;if("signal"in t&&(i=t.signal),null!==i&&("object"!=typeof(a=i)||"AbortSignal"!==a[f]))throw new TypeError("Expected signal to be an instanceof AbortSignal");var a;this[A]={method:n,redirect:t.redirect||e.redirect||"follow",headers:s,parsedURL:r,signal:i},this.follow=void 0===t.follow?void 0===e.follow?20:e.follow:t.follow,this.compress=void 0===t.compress?void 0===e.compress||e.compress:t.compress,this.counter=t.counter||e.counter||0,this.agent=t.agent||e.agent,this.highWaterMark=t.highWaterMark||e.highWaterMark||16384,this.insecureHTTPParser=t.insecureHTTPParser||e.insecureHTTPParser||!1}get method(){return this[A].method}get url(){return d.format(this[A].parsedURL)}get headers(){return this[A].headers}get redirect(){return this[A].redirect}get signal(){return this[A].signal}clone(){return new Request(this)}get[Symbol.toStringTag](){return"Request"}}Object.defineProperties(Request.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}});class AbortError extends FetchBaseError{constructor(e,t="aborted"){super(e,t)}}const B=new Set(["data:","http:","https:"]);async function W(e,t){return new Promise(((r,u)=>{const l=new Request(e,t),c=(e=>{const{parsedURL:t}=e[A],r=new Headers(e[A].headers);r.has("Accept")||r.set("Accept","*/*");let n=null;if(null===e.body&&/^(post|put)$/i.test(e.method)&&(n="0"),null!==e.body){const t=q(e);"number"!=typeof t||Number.isNaN(t)||(n=String(t))}n&&r.set("Content-Length",n),r.has("User-Agent")||r.set("User-Agent","node-fetch"),e.compress&&!r.has("Accept-Encoding")&&r.set("Accept-Encoding","gzip,deflate,br");let{agent:o}=e;"function"==typeof o&&(o=o(t)),r.has("Connection")||o||r.set("Connection","close");const s=(e=>{if(e.search)return e.search;const t=e.href.length-1,r=e.hash||("#"===e.href[t]?"#":"");return"?"===e.href[t-r.length]?"?":""})(t);return{path:t.pathname+s,pathname:t.pathname,hostname:t.hostname,protocol:t.protocol,port:t.port,hash:t.hash,search:t.search,query:t.query,href:t.href,method:e.method,headers:r[Symbol.for("nodejs.util.inspect.custom")](),insecureHTTPParser:e.insecureHTTPParser,agent:o}})(l);if(!B.has(c.protocol))throw new TypeError(`node-fetch cannot load ${e}. URL scheme "${c.protocol.replace(/:$/,"")}" is not supported.`);if("data:"===c.protocol){const e=a(l.url),t=new Response(e,{headers:{"Content-Type":e.typeFull}});return void r(t)}const d=("https:"===c.protocol?o:n).request,{signal:f}=l;let p=null;const b=()=>{const e=new AbortError("The operation was aborted.");u(e),l.body&&l.body instanceof i.Readable&&l.body.destroy(e),p&&p.body&&p.body.emit("error",e)};if(f&&f.aborted)return void b();const y=()=>{b(),g()},m=d(c);f&&f.addEventListener("abort",y);const g=()=>{m.abort(),f&&f.removeEventListener("abort",y)};m.on("error",(e=>{u(new FetchError(`request to ${l.url} failed, reason: ${e.message}`,"system",e)),g()})),m.on("response",(e=>{m.setTimeout(0);const n=function(e=[]){return new Headers(e.reduce(((e,t,r,n)=>(r%2==0&&e.push(n.slice(r,r+2)),e)),[]).filter((([e,t])=>{try{return P(e),C(e,String(t)),!0}catch{return!1}})))}(e.rawHeaders);if(O(e.statusCode)){const o=n.get("Location"),s=null===o?null:new URL(o,l.url);switch(l.redirect){case"error":return u(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${l.url}`,"no-redirect")),void g();case"manual":if(null!==s)try{n.set("Location",s)}catch(e){u(e)}break;case"follow":{if(null===s)break;if(l.counter>=l.follow)return u(new FetchError(`maximum redirect reached at: ${l.url}`,"max-redirect")),void g();const n={headers:new Headers(l.headers),follow:l.follow,counter:l.counter+1,agent:l.agent,compress:l.compress,method:l.method,body:l.body,signal:l.signal,size:l.size};return 303!==e.statusCode&&l.body&&t.body instanceof i.Readable?(u(new FetchError("Cannot follow redirect with body being a readable stream","unsupported-redirect")),void g()):(303!==e.statusCode&&(301!==e.statusCode&&302!==e.statusCode||"POST"!==l.method)||(n.method="GET",n.body=void 0,n.headers.delete("content-length")),r(W(new Request(s,n))),void g())}}}e.once("end",(()=>{f&&f.removeEventListener("abort",y)}));let o=i.pipeline(e,new i.PassThrough,(e=>{u(e)}));process.version<"v12.10"&&e.on("aborted",y);const a={url:l.url,status:e.statusCode,statusText:e.statusMessage,headers:n,size:l.size,counter:l.counter,highWaterMark:l.highWaterMark},c=n.get("Content-Encoding");if(!l.compress||"HEAD"===l.method||null===c||204===e.statusCode||304===e.statusCode)return p=new Response(o,a),void r(p);const d={flush:s.Z_SYNC_FLUSH,finishFlush:s.Z_SYNC_FLUSH};if("gzip"===c||"x-gzip"===c)return o=i.pipeline(o,s.createGunzip(d),(e=>{u(e)})),p=new Response(o,a),void r(p);if("deflate"!==c&&"x-deflate"!==c){if("br"===c)return o=i.pipeline(o,s.createBrotliDecompress(),(e=>{u(e)})),p=new Response(o,a),void r(p);p=new Response(o,a),r(p)}else{i.pipeline(e,new i.PassThrough,(e=>{u(e)})).once("data",(e=>{o=8==(15&e[0])?i.pipeline(o,s.createInflate(),(e=>{u(e)})):i.pipeline(o,s.createInflateRaw(),(e=>{u(e)})),p=new Response(o,a),r(p)}))}})),((e,{body:t})=>{null===t?e.end():h(t)?t.stream().pipe(e):Buffer.isBuffer(t)?(e.write(t),e.end()):t.pipe(e)})(m,l)}))}t.AbortError=AbortError,t.FetchError=FetchError,t.Headers=Headers,t.Request=Request,t.Response=Response,t.default=W,t.isRedirect=O},902:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ByteLengthQueuingStrategy:()=>ByteLengthQueuingStrategy,CountQueuingStrategy:()=>CountQueuingStrategy,ReadableByteStreamController:()=>ReadableByteStreamController,ReadableStream:()=>ReadableStream,ReadableStreamBYOBReader:()=>ReadableStreamBYOBReader,ReadableStreamBYOBRequest:()=>ReadableStreamBYOBRequest,ReadableStreamDefaultController:()=>ReadableStreamDefaultController,ReadableStreamDefaultReader:()=>ReadableStreamDefaultReader,TransformStream:()=>TransformStream,TransformStreamDefaultController:()=>TransformStreamDefaultController,WritableStream:()=>WritableStream,WritableStreamDefaultController:()=>WritableStreamDefaultController,WritableStreamDefaultWriter:()=>WritableStreamDefaultWriter});const n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function o(){}const s="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0;function i(e){return"object"==typeof e&&null!==e||"function"==typeof e}const a=o,u=Promise,l=Promise.prototype.then,c=Promise.resolve.bind(u),d=Promise.reject.bind(u);function f(e){return new u(e)}function p(e){return c(e)}function h(e){return d(e)}function b(e,t,r){return l.call(e,t,r)}function y(e,t,r){b(b(e,t,r),void 0,a)}function m(e,t){y(e,t)}function g(e,t){y(e,void 0,t)}function _(e,t,r){return b(e,t,r)}function v(e){b(e,void 0,a)}const w=(()=>{const e=s&&s.queueMicrotask;if("function"==typeof e)return e;const t=p(void 0);return e=>b(t,e)})();function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function R(e,t,r){try{return p(S(e,t,r))}catch(e){return h(e)}}class SimpleQueue{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let n=r+1;const o=e._elements,s=o[r];return 16384===n&&(t=e._next,n=0),--this._size,this._cursor=n,e!==t&&(this._front=t),o[r]=void 0,s}forEach(e){let t=this._cursor,r=this._front,n=r._elements;for(;!(t===n.length&&void 0===r._next||t===n.length&&(r=r._next,n=r._elements,t=0,0===n.length));)e(n[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}function T(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?E(e):"closed"===t._state?function(e){E(e),A(e)}(e):O(e,t._storedError)}function q(e,t){return pr(e._ownerReadableStream,t)}function P(e){"readable"===e._ownerReadableStream._state?j(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){O(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function C(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function E(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function O(e,t){E(e),j(e,t)}function j(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function A(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const k=n("[[AbortSteps]]"),B=n("[[ErrorSteps]]"),W=n("[[CancelSteps]]"),D=n("[[PullSteps]]"),x=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},L=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function F(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function M(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function I(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function z(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function $(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function U(e){return Number(e)}function H(e){return 0===e?0:e}function N(e,t){const r=Number.MAX_SAFE_INTEGER;let n=Number(e);if(n=H(n),!x(n))throw new TypeError(`${t} is not a finite number`);if(n=function(e){return H(L(e))}(n),n<0||n>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return x(n)&&0!==n?n:0}function Q(e,t){if(!dr(e))throw new TypeError(`${t} is not a ReadableStream.`)}function V(e){return new ReadableStreamDefaultReader(e)}function Y(e,t){e._reader._readRequests.push(t)}function G(e,t,r){const n=e._reader._readRequests.shift();r?n._closeSteps():n._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(z(e,1,"ReadableStreamDefaultReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");T(this,e),this._readRequests=new SimpleQueue}get closed(){return Z(this)?this._closedPromise:h(ee("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(ee("cancel"))}read(){if(!Z(this))return h(ee("read"));if(void 0===this._ownerReadableStream)return h(C("read from"));let e,t;const r=f(((r,n)=>{e=r,t=n}));return X(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw ee("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function Z(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function X(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[D](t)}function ee(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,n.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});const te=Object.getPrototypeOf(Object.getPrototypeOf((async function*(){})).prototype);class ReadableStreamAsyncIteratorImpl{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?_(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?_(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;if(void 0===e._ownerReadableStream)return h(C("iterate"));let t,r;const n=f(((e,n)=>{t=e,r=n}));return X(e,{_chunkSteps:e=>{this._ongoingPromise=void 0,w((()=>t({value:e,done:!1})))},_closeSteps:()=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),t({value:void 0,done:!0})},_errorSteps:t=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),r(t)}}),n}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t._ownerReadableStream)return h(C("finish iterating"));if(!this._preventCancel){const r=q(t,e);return P(t),_(r,(()=>({value:e,done:!0})))}return P(t),p({value:e,done:!0})}}const re={next(){return ne(this)?this._asyncIteratorImpl.next():h(oe("next"))},return(e){return ne(this)?this._asyncIteratorImpl.return(e):h(oe("return"))}};function ne(e){if(!i(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof ReadableStreamAsyncIteratorImpl}catch(e){return!1}}function oe(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}void 0!==te&&Object.setPrototypeOf(re,te);const se=Number.isNaN||function(e){return e!=e};function ie(e){return e.slice()}function ae(e,t,r,n,o){new Uint8Array(e).set(new Uint8Array(r,n,o),t)}function ue(e,t,r){if(e.slice)return e.slice(t,r);const n=r-t,o=new ArrayBuffer(n);return ae(o,0,e,t,n),o}function le(e){const t=ue(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ce(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function de(e,t,r){if("number"!=typeof(n=r)||se(n)||n<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var n;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function fe(e){e._queue=new SimpleQueue,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!he(this))throw xe("view");return this._view}respond(e){if(!he(this))throw xe("respond");if(z(e,1,"respond"),e=N(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,Be(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!he(this))throw xe("respondWithNewView");if(z(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,We(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,n.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!pe(this))throw Le("byobRequest");return Ae(this)}get desiredSize(){if(!pe(this))throw Le("desiredSize");return ke(this)}close(){if(!pe(this))throw Le("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);Ee(this)}enqueue(e){if(!pe(this))throw Le("enqueue");if(z(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);Oe(this,e)}error(e){if(!pe(this))throw Le("error");je(this,e)}[W](e){ye(this),fe(this);const t=this._cancelAlgorithm(e);return Ce(this),t}[D](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0){const t=this._queue.shift();this._queueTotalSize-=t.byteLength,Se(this);const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);return void e._chunkSteps(r)}const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const n={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(n)}Y(t,e),be(this)}}function pe(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function he(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function be(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(ze(t)&&Ie(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,be(e))}),(t=>{je(e,t)}))}function ye(e){Re(e),e._pendingPullIntos=new SimpleQueue}function me(e,t){let r=!1;"closed"===e._state&&(r=!0);const n=ge(t);"default"===t.readerType?G(e,n,r):function(e,t,r){const n=e._reader._readIntoRequests.shift();r?n._closeSteps(t):n._chunkSteps(t)}(e,n,r)}function ge(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function _e(e,t,r,n){e._queue.push({buffer:t,byteOffset:r,byteLength:n}),e._queueTotalSize+=n}function ve(e,t){const r=t.elementSize,n=t.bytesFilled-t.bytesFilled%r,o=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),s=t.bytesFilled+o,i=s-s%r;let a=o,u=!1;i>n&&(a=i-t.bytesFilled,u=!0);const l=e._queue;for(;a>0;){const r=l.peek(),n=Math.min(a,r.byteLength),o=t.byteOffset+t.bytesFilled;ae(t.buffer,o,r.buffer,r.byteOffset,n),r.byteLength===n?l.shift():(r.byteOffset+=n,r.byteLength-=n),e._queueTotalSize-=n,we(e,n,t),a-=n}return u}function we(e,t,r){r.bytesFilled+=t}function Se(e){0===e._queueTotalSize&&e._closeRequested?(Ce(e),hr(e._controlledReadableByteStream)):be(e)}function Re(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function Te(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();ve(e,t)&&(Pe(e),me(e._controlledReadableByteStream,t))}}function qe(e,t){const r=e._pendingPullIntos.peek();Re(e);"closed"===e._controlledReadableByteStream._state?function(e,t){const r=e._controlledReadableByteStream;if(ze(r))for(;Ie(r)>0;)me(r,Pe(e))}(e):function(e,t,r){if(we(0,t,r),r.bytesFilled<r.elementSize)return;Pe(e);const n=r.bytesFilled%r.elementSize;if(n>0){const t=r.byteOffset+r.bytesFilled,o=ue(r.buffer,t-n,t);_e(e,o,0,o.byteLength)}r.bytesFilled-=n,me(e._controlledReadableByteStream,r),Te(e)}(e,t,r),be(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ce(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function Ee(e){const t=e._controlledReadableByteStream;if(!e._closeRequested&&"readable"===t._state)if(e._queueTotalSize>0)e._closeRequested=!0;else{if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw je(e,t),t}}Ce(e),hr(t)}}function Oe(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const n=t.buffer,o=t.byteOffset,s=t.byteLength,i=n;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,t.buffer=t.buffer}if(Re(e),K(r))if(0===J(r))_e(e,i,o,s);else{e._pendingPullIntos.length>0&&Pe(e);G(r,new Uint8Array(i,o,s),!1)}else ze(r)?(_e(e,i,o,s),Te(e)):_e(e,i,o,s);be(e)}function je(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(ye(e),fe(e),Ce(e),br(r,t))}function Ae(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),n=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(n,e,r),e._byobRequest=n}return e._byobRequest}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,qe(e,t)}function We(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");const n=t.byteLength;r.buffer=t.buffer,qe(e,n)}function De(e,t,r,n,o,s,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,fe(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=s,t._pullAlgorithm=n,t._cancelAlgorithm=o,t._autoAllocateChunkSize=i,t._pendingPullIntos=new SimpleQueue,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,be(t)}),(e=>{je(t,e)}))}function xe(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function Le(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function Fe(e){return new ReadableStreamBYOBReader(e)}function Me(e,t){e._reader._readIntoRequests.push(t)}function Ie(e){return e._reader._readIntoRequests.length}function ze(e){const t=e._reader;return void 0!==t&&!!$e(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,n.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(z(e,1,"ReadableStreamBYOBReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!pe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");T(this,e),this._readIntoRequests=new SimpleQueue}get closed(){return $e(this)?this._closedPromise:h(He("closed"))}cancel(e){return $e(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(He("cancel"))}read(e){if(!$e(this))return h(He("read"));if(!ArrayBuffer.isView(e))return h(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return h(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return h(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return h(C("read from"));let t,r;const n=f(((e,n)=>{t=e,r=n}));return Ue(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),n}releaseLock(){if(!$e(this))throw He("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function $e(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function Ue(e,t,r){const n=e._ownerReadableStream;n._disturbed=!0,"errored"===n._state?r._errorSteps(n._storedError):function(e,t,r){const n=e._controlledReadableByteStream;let o=1;t.constructor!==DataView&&(o=t.constructor.BYTES_PER_ELEMENT);const s=t.constructor,i=t.buffer,a={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:o,viewConstructor:s,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(a),void Me(n,r);if("closed"!==n._state){if(e._queueTotalSize>0){if(ve(e,a)){const t=ge(a);return Se(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return je(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(a),Me(n,r),be(e)}else{const e=new s(a.buffer,a.byteOffset,0);r._closeSteps(e)}}(n._readableStreamController,t,r)}function He(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Ne(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(se(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Qe(e){const{size:t}=e;return t||(()=>1)}function Ve(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark,n=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:U(r),size:void 0===n?void 0:Ye(n,`${t} has member 'size' that`)}}function Ye(e,t){return M(e,t),t=>U(e(t))}function Ge(e,t,r){return M(e,r),r=>R(e,t,[r])}function Je(e,t,r){return M(e,r),()=>R(e,t,[])}function Ke(e,t,r){return M(e,r),r=>S(e,t,[r])}function Ze(e,t,r){return M(e,r),(r,n)=>R(e,t,[r,n])}function Xe(e,t){if(!nt(e))throw new TypeError(`${t} is not a WritableStream.`)}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,n.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const et="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:I(e,"First parameter");const r=Ve(t,"Second parameter"),n=function(e,t){F(e,t);const r=null==e?void 0:e.abort,n=null==e?void 0:e.close,o=null==e?void 0:e.start,s=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:Ge(r,e,`${t} has member 'abort' that`),close:void 0===n?void 0:Je(n,e,`${t} has member 'close' that`),start:void 0===o?void 0:Ke(o,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ze(i,e,`${t} has member 'write' that`),type:s}}(e,"First parameter");rt(this);if(void 0!==n.type)throw new RangeError("Invalid type is specified");const o=Qe(r);!function(e,t,r,n){const o=Object.create(WritableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0),u=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(o));void 0!==t.write&&(i=e=>t.write(e,o));void 0!==t.close&&(a=()=>t.close());void 0!==t.abort&&(u=e=>t.abort(e));wt(e,o,s,i,a,u,r,n)}(this,n,Ne(r,1),o)}get locked(){if(!nt(this))throw Et("locked");return ot(this)}abort(e){return nt(this)?ot(this)?h(new TypeError("Cannot abort a stream that already has a writer")):st(this,e):h(Et("abort"))}close(){return nt(this)?ot(this)?h(new TypeError("Cannot close a stream that already has a writer")):ct(this)?h(new TypeError("Cannot close an already-closing stream")):it(this):h(Et("close"))}getWriter(){if(!nt(this))throw Et("getWriter");return tt(this)}}function tt(e){return new WritableStreamDefaultWriter(e)}function rt(e){e._state="writable",e._storedError=void 0,e._writer=void 0,e._writableStreamController=void 0,e._writeRequests=new SimpleQueue,e._inFlightWriteRequest=void 0,e._closeRequest=void 0,e._inFlightCloseRequest=void 0,e._pendingAbortRequest=void 0,e._backpressure=!1}function nt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function ot(e){return void 0!==e._writer}function st(e,t){var r;if("closed"===e._state||"errored"===e._state)return p(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort();const n=e._state;if("closed"===n||"errored"===n)return p(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let o=!1;"erroring"===n&&(o=!0,t=void 0);const s=f(((r,n)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:n,_reason:t,_wasAlreadyErroring:o}}));return e._pendingAbortRequest._promise=s,o||ut(e,t),s}function it(e){const t=e._state;if("closed"===t||"errored"===t)return h(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=f(((t,r)=>{const n={_resolve:t,_reject:r};e._closeRequest=n})),n=e._writer;var o;return void 0!==n&&e._backpressure&&"writable"===t&&It(n),de(o=e._writableStreamController,_t,0),Tt(o),r}function at(e,t){"writable"!==e._state?lt(e):ut(e,t)}function ut(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const n=e._writer;void 0!==n&&yt(n,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&<(e)}function lt(e){e._state="errored",e._writableStreamController[B]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new SimpleQueue,void 0===e._pendingAbortRequest)return void dt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void dt(e);y(e._writableStreamController[k](r._reason),(()=>{r._resolve(),dt(e)}),(t=>{r._reject(t),dt(e)}))}function ct(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function dt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&Wt(t,e._storedError)}function ft(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){xt(e)}(r):It(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStream.prototype,n.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(z(e,1,"WritableStreamDefaultWriter"),Xe(e,"First parameter"),ot(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ct(e)&&e._backpressure?xt(this):Ft(this),kt(this);else if("erroring"===t)Lt(this,e._storedError),kt(this);else if("closed"===t)Ft(this),kt(r=this),Dt(r);else{const t=e._storedError;Lt(this,t),Bt(this,t)}var r}get closed(){return pt(this)?this._closedPromise:h(jt("closed"))}get desiredSize(){if(!pt(this))throw jt("desiredSize");if(void 0===this._ownerWritableStream)throw At("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return Rt(t._writableStreamController)}(this)}get ready(){return pt(this)?this._readyPromise:h(jt("ready"))}abort(e){return pt(this)?void 0===this._ownerWritableStream?h(At("abort")):function(e,t){return st(e._ownerWritableStream,t)}(this,e):h(jt("abort"))}close(){if(!pt(this))return h(jt("close"));const e=this._ownerWritableStream;return void 0===e?h(At("close")):ct(e)?h(new TypeError("Cannot close an already-closing stream")):ht(this)}releaseLock(){if(!pt(this))throw jt("releaseLock");void 0!==this._ownerWritableStream&&mt(this)}write(e){return pt(this)?void 0===this._ownerWritableStream?h(At("write to")):gt(this,e):h(jt("write"))}}function pt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function ht(e){return it(e._ownerWritableStream)}function bt(e,t){"pending"===e._closedPromiseState?Wt(e,t):function(e,t){Bt(e,t)}(e,t)}function yt(e,t){"pending"===e._readyPromiseState?Mt(e,t):function(e,t){Lt(e,t)}(e,t)}function mt(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");yt(e,r),bt(e,r),t._writer=void 0,e._ownerWritableStream=void 0}function gt(e,t){const r=e._ownerWritableStream,n=r._writableStreamController,o=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return qt(e,t),1}}(n,t);if(r!==e._ownerWritableStream)return h(At("write to"));const s=r._state;if("errored"===s)return h(r._storedError);if(ct(r)||"closed"===s)return h(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===s)return h(r._storedError);const i=function(e){return f(((t,r)=>{const n={_resolve:t,_reject:r};e._writeRequests.push(n)}))}(r);return function(e,t,r){try{de(e,t,r)}catch(t){return void qt(e,t)}const n=e._controlledWritableStream;if(!ct(n)&&"writable"===n._state){ft(n,Pt(e))}Tt(e)}(n,t,o),i}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,n.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const _t={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!vt(this))throw Ot("abortReason");return this._abortReason}get signal(){if(!vt(this))throw Ot("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!vt(this))throw Ot("error");"writable"===this._controlledWritableStream._state&&Ct(this,e)}[k](e){const t=this._abortAlgorithm(e);return St(this),t}[B](){fe(this)}}function vt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function wt(e,t,r,n,o,s,i,a){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._abortReason=void 0,t._abortController=function(){if(et)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=a,t._strategyHWM=i,t._writeAlgorithm=n,t._closeAlgorithm=o,t._abortAlgorithm=s;const u=Pt(t);ft(e,u);y(p(r()),(()=>{t._started=!0,Tt(t)}),(r=>{t._started=!0,at(e,r)}))}function St(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Rt(e){return e._strategyHWM-e._queueTotalSize}function Tt(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void lt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===_t?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ce(e);const r=e._closeAlgorithm();St(e),y(r,(()=>{!function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Dt(t)}(t)}),(e=>{!function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),at(e,t)}(t,e)}))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);y(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ce(e),!ct(r)&&"writable"===t){const t=Pt(e);ft(r,t)}Tt(e)}),(t=>{"writable"===r._state&&St(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,at(e,t)}(r,t)}))}(e,r)}function qt(e,t){"writable"===e._controlledWritableStream._state&&Ct(e,t)}function Pt(e){return Rt(e)<=0}function Ct(e,t){const r=e._controlledWritableStream;St(e),ut(r,t)}function Et(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function Ot(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function jt(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function At(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function kt(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function Bt(e,t){kt(e),Wt(e,t)}function Wt(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Dt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function xt(e){e._readyPromise=f(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function Lt(e,t){xt(e),Mt(e,t)}function Ft(e){xt(e),It(e)}function Mt(e,t){void 0!==e._readyPromise_reject&&(v(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function It(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{abortReason:{enumerable:!0},signal:{enumerable:!0},error:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,n.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const zt="undefined"!=typeof DOMException?DOMException:void 0;const $t=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(zt)?zt:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function Ut(e,t,r,n,s,i){const a=V(e),u=tt(t);e._disturbed=!0;let l=!1,c=p(void 0);return f(((d,_)=>{let w;if(void 0!==i){if(w=()=>{const r=new $t("Aborted","AbortError"),o=[];n||o.push((()=>"writable"===t._state?st(t,r):p(void 0))),s||o.push((()=>"readable"===e._state?pr(e,r):p(void 0))),E((()=>Promise.all(o.map((e=>e())))),!0,r)},i.aborted)return void w();i.addEventListener("abort",w)}var S,R,T;if(C(e,a._closedPromise,(e=>{n?O(!0,e):E((()=>st(t,e)),!0,e)})),C(t,u._closedPromise,(t=>{s?O(!0,t):E((()=>pr(e,t)),!0,t)})),S=e,R=a._closedPromise,T=()=>{r?O():E((()=>function(e){const t=e._ownerWritableStream,r=t._state;return ct(t)||"closed"===r?p(void 0):"errored"===r?h(t._storedError):ht(e)}(u)))},"closed"===S._state?T():m(R,T),ct(t)||"closed"===t._state){const t=new TypeError("the destination writable stream closed before all data could be piped to it");s?O(!0,t):E((()=>pr(e,t)),!0,t)}function q(){const e=c;return b(c,(()=>e!==c?q():void 0))}function C(e,t,r){"errored"===e._state?r(e._storedError):g(t,r)}function E(e,r,n){function o(){y(e(),(()=>j(r,n)),(e=>j(!0,e)))}l||(l=!0,"writable"!==t._state||ct(t)?o():m(q(),o))}function O(e,r){l||(l=!0,"writable"!==t._state||ct(t)?j(e,r):m(q(),(()=>j(e,r))))}function j(e,t){mt(u),P(a),void 0!==i&&i.removeEventListener("abort",w),e?_(t):d(void 0)}v(f(((e,t)=>{!function r(n){n?e():b(l?p(!0):b(u._readyPromise,(()=>f(((e,t)=>{X(a,{_chunkSteps:t=>{c=b(gt(u,t),void 0,o),e(!1)},_closeSteps:()=>e(!0),_errorSteps:t})})))),r,t)}(!1)})))}))}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Ht(this))throw er("desiredSize");return Kt(this)}close(){if(!Ht(this))throw er("close");if(!Zt(this))throw new TypeError("The stream is not in a state that permits close");Yt(this)}enqueue(e){if(!Ht(this))throw er("enqueue");if(!Zt(this))throw new TypeError("The stream is not in a state that permits enqueue");return Gt(this,e)}error(e){if(!Ht(this))throw er("error");Jt(this,e)}[W](e){fe(this);const t=this._cancelAlgorithm(e);return Vt(this),t}[D](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ce(this);this._closeRequested&&0===this._queue.length?(Vt(this),hr(t)):Nt(this),e._chunkSteps(r)}else Y(t,e),Nt(this)}}function Ht(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function Nt(e){if(!Qt(e))return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,Nt(e))}),(t=>{Jt(e,t)}))}function Qt(e){const t=e._controlledReadableStream;if(!Zt(e))return!1;if(!e._started)return!1;if(fr(t)&&J(t)>0)return!0;return Kt(e)>0}function Vt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Yt(e){if(!Zt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(Vt(e),hr(t))}function Gt(e,t){if(!Zt(e))return;const r=e._controlledReadableStream;if(fr(r)&&J(r)>0)G(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Jt(e,t),t}try{de(e,t,r)}catch(t){throw Jt(e,t),t}}Nt(e)}function Jt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(fe(e),Vt(e),br(r,t))}function Kt(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Zt(e){const t=e._controlledReadableStream._state;return!e._closeRequested&&"readable"===t}function Xt(e,t,r,n,o,s,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=s,t._pullAlgorithm=n,t._cancelAlgorithm=o,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,Nt(t)}),(e=>{Jt(t,e)}))}function er(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function tr(e,t){return pe(e._readableStreamController)?function(e){let t,r,n,o,s,i=V(e),a=!1,u=!1,l=!1,c=!1,d=!1;const h=f((e=>{s=e}));function b(e){g(e._closedPromise,(t=>{e===i&&(je(n._readableStreamController,t),je(o._readableStreamController,t),c&&d||s(void 0))}))}function y(){$e(i)&&(P(i),i=V(e),b(i));X(i,{_chunkSteps:t=>{w((()=>{u=!1,l=!1;const r=t;let i=t;if(!c&&!d)try{i=le(t)}catch(t){return je(n._readableStreamController,t),je(o._readableStreamController,t),void s(pr(e,t))}c||Oe(n._readableStreamController,r),d||Oe(o._readableStreamController,i),a=!1,u?_():l&&v()}))},_closeSteps:()=>{a=!1,c||Ee(n._readableStreamController),d||Ee(o._readableStreamController),n._readableStreamController._pendingPullIntos.length>0&&Be(n._readableStreamController,0),o._readableStreamController._pendingPullIntos.length>0&&Be(o._readableStreamController,0),c&&d||s(void 0)},_errorSteps:()=>{a=!1}})}function m(t,r){Z(i)&&(P(i),i=Fe(e),b(i));const f=r?o:n,p=r?n:o;Ue(i,t,{_chunkSteps:t=>{w((()=>{u=!1,l=!1;const n=r?d:c;if(r?c:d)n||We(f._readableStreamController,t);else{let r;try{r=le(t)}catch(t){return je(f._readableStreamController,t),je(p._readableStreamController,t),void s(pr(e,t))}n||We(f._readableStreamController,t),Oe(p._readableStreamController,r)}a=!1,u?_():l&&v()}))},_closeSteps:e=>{a=!1;const t=r?d:c,n=r?c:d;t||Ee(f._readableStreamController),n||Ee(p._readableStreamController),void 0!==e&&(t||We(f._readableStreamController,e),!n&&p._readableStreamController._pendingPullIntos.length>0&&Be(p._readableStreamController,0)),t&&n||s(void 0)},_errorSteps:()=>{a=!1}})}function _(){if(a)return u=!0,p(void 0);a=!0;const e=Ae(n._readableStreamController);return null===e?y():m(e._view,!1),p(void 0)}function v(){if(a)return l=!0,p(void 0);a=!0;const e=Ae(o._readableStreamController);return null===e?y():m(e._view,!0),p(void 0)}function S(n){if(c=!0,t=n,d){const n=ie([t,r]),o=pr(e,n);s(o)}return h}function R(n){if(d=!0,r=n,c){const n=ie([t,r]),o=pr(e,n);s(o)}return h}function T(){}return n=lr(T,_,S),o=lr(T,v,R),b(i),[n,o]}(e):function(e,t){const r=V(e);let n,o,s,i,a,u=!1,l=!1,c=!1,d=!1;const h=f((e=>{a=e}));function b(){if(u)return l=!0,p(void 0);u=!0;return X(r,{_chunkSteps:e=>{w((()=>{l=!1;const t=e,r=e;c||Gt(s._readableStreamController,t),d||Gt(i._readableStreamController,r),u=!1,l&&b()}))},_closeSteps:()=>{u=!1,c||Yt(s._readableStreamController),d||Yt(i._readableStreamController),c&&d||a(void 0)},_errorSteps:()=>{u=!1}}),p(void 0)}function y(t){if(c=!0,n=t,d){const t=ie([n,o]),r=pr(e,t);a(r)}return h}function m(t){if(d=!0,o=t,c){const t=ie([n,o]),r=pr(e,t);a(r)}return h}function _(){}return s=ur(_,b,y),i=ur(_,b,m),g(r._closedPromise,(e=>{Jt(s._readableStreamController,e),Jt(i._readableStreamController,e),c&&d||a(void 0)})),[s,i]}(e)}function rr(e,t,r){return M(e,r),r=>R(e,t,[r])}function nr(e,t,r){return M(e,r),r=>R(e,t,[r])}function or(e,t,r){return M(e,r),r=>S(e,t,[r])}function sr(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function ir(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function ar(e,t){F(e,t);const r=null==e?void 0:e.preventAbort,n=null==e?void 0:e.preventCancel,o=null==e?void 0:e.preventClose,s=null==e?void 0:e.signal;return void 0!==s&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(s,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(n),preventClose:Boolean(o),signal:s}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,n.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:I(e,"First parameter");const r=Ve(t,"Second parameter"),n=function(e,t){F(e,t);const r=e,n=null==r?void 0:r.autoAllocateChunkSize,o=null==r?void 0:r.cancel,s=null==r?void 0:r.pull,i=null==r?void 0:r.start,a=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===n?void 0:N(n,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===o?void 0:rr(o,r,`${t} has member 'cancel' that`),pull:void 0===s?void 0:nr(s,r,`${t} has member 'pull' that`),start:void 0===i?void 0:or(i,r,`${t} has member 'start' that`),type:void 0===a?void 0:sr(a,`${t} has member 'type' that`)}}(e,"First parameter");if(cr(this),"bytes"===n.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");!function(e,t,r){const n=Object.create(ReadableByteStreamController.prototype);let o=()=>{},s=()=>p(void 0),i=()=>p(void 0);void 0!==t.start&&(o=()=>t.start(n)),void 0!==t.pull&&(s=()=>t.pull(n)),void 0!==t.cancel&&(i=e=>t.cancel(e));const a=t.autoAllocateChunkSize;if(0===a)throw new TypeError("autoAllocateChunkSize must be greater than 0");De(e,n,o,s,i,r,a)}(this,n,Ne(r,0))}else{const e=Qe(r);!function(e,t,r,n){const o=Object.create(ReadableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(o)),void 0!==t.pull&&(i=()=>t.pull(o)),void 0!==t.cancel&&(a=e=>t.cancel(e)),Xt(e,o,s,i,a,r,n)}(this,n,Ne(r,1),e)}}get locked(){if(!dr(this))throw yr("locked");return fr(this)}cancel(e){return dr(this)?fr(this)?h(new TypeError("Cannot cancel a stream that already has a reader")):pr(this,e):h(yr("cancel"))}getReader(e){if(!dr(this))throw yr("getReader");return void 0===function(e,t){F(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:ir(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?V(this):Fe(this)}pipeThrough(e,t={}){if(!dr(this))throw yr("pipeThrough");z(e,1,"pipeThrough");const r=function(e,t){F(e,t);const r=null==e?void 0:e.readable;$(r,"readable","ReadableWritablePair"),Q(r,`${t} has member 'readable' that`);const n=null==e?void 0:e.writable;return $(n,"writable","ReadableWritablePair"),Xe(n,`${t} has member 'writable' that`),{readable:r,writable:n}}(e,"First parameter"),n=ar(t,"Second parameter");if(fr(this))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(ot(r.writable))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return v(Ut(this,r.writable,n.preventClose,n.preventAbort,n.preventCancel,n.signal)),r.readable}pipeTo(e,t={}){if(!dr(this))return h(yr("pipeTo"));if(void 0===e)return h("Parameter 1 is required in 'pipeTo'.");if(!nt(e))return h(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=ar(t,"Second parameter")}catch(e){return h(e)}return fr(this)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):ot(e)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):Ut(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!dr(this))throw yr("tee");return ie(tr(this))}values(e){if(!dr(this))throw yr("values");return function(e,t){const r=V(e),n=new ReadableStreamAsyncIteratorImpl(r,t),o=Object.create(re);return o._asyncIteratorImpl=n,o}(this,function(e,t){F(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function ur(e,t,r,n=1,o=(()=>1)){const s=Object.create(ReadableStream.prototype);cr(s);return Xt(s,Object.create(ReadableStreamDefaultController.prototype),e,t,r,n,o),s}function lr(e,t,r){const n=Object.create(ReadableStream.prototype);cr(n);return De(n,Object.create(ReadableByteStreamController.prototype),e,t,r,0,void 0),n}function cr(e){e._state="readable",e._reader=void 0,e._storedError=void 0,e._disturbed=!1}function dr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function fr(e){return void 0!==e._reader}function pr(e,t){if(e._disturbed=!0,"closed"===e._state)return p(void 0);if("errored"===e._state)return h(e._storedError);hr(e);const r=e._reader;void 0!==r&&$e(r)&&(r._readIntoRequests.forEach((e=>{e._closeSteps(void 0)})),r._readIntoRequests=new SimpleQueue);return _(e._readableStreamController[W](t),o)}function hr(e){e._state="closed";const t=e._reader;void 0!==t&&(A(t),Z(t)&&(t._readRequests.forEach((e=>{e._closeSteps()})),t._readRequests=new SimpleQueue))}function br(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(j(r,t),Z(r)?(r._readRequests.forEach((e=>{e._errorSteps(t)})),r._readRequests=new SimpleQueue):(r._readIntoRequests.forEach((e=>{e._errorSteps(t)})),r._readIntoRequests=new SimpleQueue))}function yr(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function mr(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark;return $(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:U(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStream.prototype,n.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof n.asyncIterator&&Object.defineProperty(ReadableStream.prototype,n.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const gr=e=>e.byteLength;Object.defineProperty(gr,"name",{value:"size",configurable:!0});class ByteLengthQueuingStrategy{constructor(e){z(e,1,"ByteLengthQueuingStrategy"),e=mr(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!vr(this))throw _r("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!vr(this))throw _r("size");return gr}}function _r(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function vr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,n.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const wr=()=>1;Object.defineProperty(wr,"name",{value:"size",configurable:!0});class CountQueuingStrategy{constructor(e){z(e,1,"CountQueuingStrategy"),e=mr(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!Rr(this))throw Sr("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!Rr(this))throw Sr("size");return wr}}function Sr(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function Rr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function Tr(e,t,r){return M(e,r),r=>R(e,t,[r])}function qr(e,t,r){return M(e,r),r=>S(e,t,[r])}function Pr(e,t,r){return M(e,r),(r,n)=>R(e,t,[r,n])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,n.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const n=Ve(t,"Second parameter"),o=Ve(r,"Third parameter"),s=function(e,t){F(e,t);const r=null==e?void 0:e.flush,n=null==e?void 0:e.readableType,o=null==e?void 0:e.start,s=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:Tr(r,e,`${t} has member 'flush' that`),readableType:n,start:void 0===o?void 0:qr(o,e,`${t} has member 'start' that`),transform:void 0===s?void 0:Pr(s,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==s.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==s.writableType)throw new RangeError("Invalid writableType specified");const i=Ne(o,0),a=Qe(o),u=Ne(n,1),l=Qe(n);let c;!function(e,t,r,n,o,s){function i(){return t}function a(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return _(e._backpressureChangePromise,(()=>{const n=e._writable;if("erroring"===n._state)throw n._storedError;return Wr(r,t)}))}return Wr(r,t)}(e,t)}function u(t){return function(e,t){return Er(e,t),p(void 0)}(e,t)}function l(){return function(e){const t=e._readable,r=e._transformStreamController,n=r._flushAlgorithm();return kr(r),_(n,(()=>{if("errored"===t._state)throw t._storedError;Yt(t._readableStreamController)}),(r=>{throw Er(e,r),t._storedError}))}(e)}function c(){return function(e){return jr(e,!1),e._backpressureChangePromise}(e)}function d(t){return Or(e,t),p(void 0)}e._writable=function(e,t,r,n,o=1,s=(()=>1)){const i=Object.create(WritableStream.prototype);return rt(i),wt(i,Object.create(WritableStreamDefaultController.prototype),e,t,r,n,o,s),i}(i,a,l,u,r,n),e._readable=ur(i,c,d,o,s),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,jr(e,!0),e._transformStreamController=void 0}(this,f((e=>{c=e})),u,l,i,a),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let n=e=>{try{return Br(r,e),p(void 0)}catch(e){return h(e)}},o=()=>p(void 0);void 0!==t.transform&&(n=e=>t.transform(e,r));void 0!==t.flush&&(o=()=>t.flush(r));!function(e,t,r,n){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=n}(e,r,n,o)}(this,s),void 0!==s.start?c(s.start(this._transformStreamController)):c(void 0)}get readable(){if(!Cr(this))throw xr("readable");return this._readable}get writable(){if(!Cr(this))throw xr("writable");return this._writable}}function Cr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function Er(e,t){Jt(e._readable._readableStreamController,t),Or(e,t)}function Or(e,t){kr(e._transformStreamController),qt(e._writable._writableStreamController,t),e._backpressure&&jr(e,!1)}function jr(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=f((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(TransformStream.prototype,n.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Ar(this))throw Dr("desiredSize");return Kt(this._controlledTransformStream._readable._readableStreamController)}enqueue(e){if(!Ar(this))throw Dr("enqueue");Br(this,e)}error(e){if(!Ar(this))throw Dr("error");var t;t=e,Er(this._controlledTransformStream,t)}terminate(){if(!Ar(this))throw Dr("terminate");!function(e){const t=e._controlledTransformStream;Yt(t._readable._readableStreamController);const r=new TypeError("TransformStream terminated");Or(t,r)}(this)}}function Ar(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function kr(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function Br(e,t){const r=e._controlledTransformStream,n=r._readable._readableStreamController;if(!Zt(n))throw new TypeError("Readable side is not in a state that permits enqueue");try{Gt(n,t)}catch(e){throw Or(r,e),r._readable._storedError}const o=function(e){return!Qt(e)}(n);o!==r._backpressure&&jr(r,!0)}function Wr(e,t){return _(e._transformAlgorithm(t),void 0,(t=>{throw Er(e._controlledTransformStream,t),t}))}function Dr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function xr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,n.toStringTag,{value:"TransformStreamDefaultController",configurable:!0})}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={id:n,loaded:!1,exports:{}};return e[n].call(s.exports,s,s.exports,r),s.loaded=!0,s.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var n=r(175);return n=n.default})()}));
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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S2krQixJQUFVOXZDLE9BQU9hLFVBQVV3ekIsZUFBZTV5QixLQUFLb1EsRUFBS2krQixHQ0NsRk4sRUFBb0J4VCxFQUFLcjhCLElBQ0gsb0JBQVhzQixRQUEwQkEsT0FBT0MsYUFDMUNsQixPQUFPQyxlQUFlTixFQUFTc0IsT0FBT0MsWUFBYSxDQUFFaEIsTUFBTyxXQUU3REYsT0FBT0MsZUFBZU4sRUFBUyxhQUFjLENBQUVPLE9BQU8sS0NMdkRzdkMsRUFBb0JPLElBQU9ud0MsSUFDMUJBLEVBQU9vd0MsTUFBUSxHQUNWcHdDLEVBQU9xd0MsV0FBVXJ3QyxFQUFPcXdDLFNBQVcsSUFDakNyd0MsR0NBUixJQUFJc3dDLEVBQXNCVixFQUFvQix5QjVDTzlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9hYm9ydC1jb250cm9sbGVyL2Rpc3QvYWJvcnQtY29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2NsaWVudC50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9kb21haW5zQ3JlZGVudGlhbHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9kb21haW5zVGFncy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnNUZW1wbGF0ZXMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9lcnJvci50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2V2ZW50cy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2luZGV4LnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvaW50ZXJmYWNlcy9TdXByZXNzaW9ucy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2lwLXBvb2xzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvaXBzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvbGlzdHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9tYWlsTGlzdE1lbWJlcnMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9tZXNzYWdlcy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL211bHRpcGxlVmFsaWRhdGlvbi50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3JlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9yb3V0ZXMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9zdGF0cy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3N1cHByZXNzaW9ucy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3ZhbGlkYXRlLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvd2ViaG9va3MudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9iYXNlLTY0L2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2RhdGEtdXJpLXRvLWJ1ZmZlci9kaXN0L3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2V2ZW50LXRhcmdldC1zaGltL2Rpc3QvZXZlbnQtdGFyZ2V0LXNoaW0uanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9mZXRjaC1ibG9iL2luZGV4LmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMva3ktdW5pdmVyc2FsL2luZGV4LmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMva3kvdW1kLmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvdXJsLWpvaW4vbGliL3VybC1qb2luLmpzIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImNyeXB0b1wiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwc1wiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInN0cmVhbVwiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInVybFwiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInV0aWxcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ6bGliXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9ub2RlLWZldGNoL2Rpc3QvaW5kZXguY2pzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvd2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb255ZmlsbC5lczIwMTgubWpzIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3N0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wibWFpbGd1blwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJtYWlsZ3VuXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hIDxodHRwczovL2dpdGh1Yi5jb20vbXlzdGljYXRlYT5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBkaXJlY3RvcnkgZm9yIGZ1bGwgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgZXZlbnRUYXJnZXRTaGltID0gcmVxdWlyZSgnZXZlbnQtdGFyZ2V0LXNoaW0nKTtcblxuLyoqXG4gKiBUaGUgc2lnbmFsIGNsYXNzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0c2lnbmFsXG4gKi9cbmNsYXNzIEFib3J0U2lnbmFsIGV4dGVuZHMgZXZlbnRUYXJnZXRTaGltLkV2ZW50VGFyZ2V0IHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBYm9ydFNpZ25hbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHlcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYEFib3J0U2lnbmFsYCdzIGBBYm9ydENvbnRyb2xsZXJgIGhhcyBzaWduYWxlZCB0byBhYm9ydCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGdldCBhYm9ydGVkKCkge1xuICAgICAgICBjb25zdCBhYm9ydGVkID0gYWJvcnRlZEZsYWdzLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhYm9ydGVkICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJ3RoaXMnIHRvIGJlIGFuICdBYm9ydFNpZ25hbCcgb2JqZWN0LCBidXQgZ290ICR7dGhpcyA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHRoaXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFib3J0ZWQ7XG4gICAgfVxufVxuZXZlbnRUYXJnZXRTaGltLmRlZmluZUV2ZW50QXR0cmlidXRlKEFib3J0U2lnbmFsLnByb3RvdHlwZSwgXCJhYm9ydFwiKTtcbi8qKlxuICogQ3JlYXRlIGFuIEFib3J0U2lnbmFsIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQWJvcnRTaWduYWwoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gT2JqZWN0LmNyZWF0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUpO1xuICAgIGV2ZW50VGFyZ2V0U2hpbS5FdmVudFRhcmdldC5jYWxsKHNpZ25hbCk7XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIGZhbHNlKTtcbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLyoqXG4gKiBBYm9ydCBhIGdpdmVuIHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRTaWduYWwoc2lnbmFsKSB7XG4gICAgaWYgKGFib3J0ZWRGbGFncy5nZXQoc2lnbmFsKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgdHJ1ZSk7XG4gICAgc2lnbmFsLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBcImFib3J0XCIgfSk7XG59XG4vKipcbiAqIEFib3J0ZWQgZmxhZyBmb3IgZWFjaCBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IGFib3J0ZWRGbGFncyA9IG5ldyBXZWFrTWFwKCk7XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRTaWduYWwucHJvdG90eXBlLCB7XG4gICAgYWJvcnRlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbi8vIGB0b1N0cmluZygpYCBzaG91bGQgcmV0dXJuIGBcIltvYmplY3QgQWJvcnRTaWduYWxdXCJgXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRTaWduYWwucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydFNpZ25hbFwiLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBBYm9ydENvbnRyb2xsZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRjb250cm9sbGVyXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHNpZ25hbHMuc2V0KHRoaXMsIGNyZWF0ZUFib3J0U2lnbmFsKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25hbCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnQgYW5kIHNpZ25hbCB0byBhbnkgb2JzZXJ2ZXJzIHRoYXQgdGhlIGFzc29jaWF0ZWQgYWN0aXZpdHkgaXMgdG8gYmUgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwoZ2V0U2lnbmFsKHRoaXMpKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc29jaWF0ZWQgc2lnbmFscy5cbiAqL1xuY29uc3Qgc2lnbmFscyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCB0aGUgYXNzb2NpYXRlZCBzaWduYWwgb2YgYSBnaXZlbiBjb250cm9sbGVyLlxuICovXG5mdW5jdGlvbiBnZXRTaWduYWwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZ2V0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0Q29udHJvbGxlcicgb2JqZWN0LCBidXQgZ290ICR7Y29udHJvbGxlciA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGNvbnRyb2xsZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWw7XG59XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRDb250cm9sbGVyXCIsXG4gICAgfSk7XG59XG5cbmV4cG9ydHMuQWJvcnRDb250cm9sbGVyID0gQWJvcnRDb250cm9sbGVyO1xuZXhwb3J0cy5BYm9ydFNpZ25hbCA9IEFib3J0U2lnbmFsO1xuZXhwb3J0cy5kZWZhdWx0ID0gQWJvcnRDb250cm9sbGVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFib3J0Q29udHJvbGxlclxubW9kdWxlLmV4cG9ydHMuQWJvcnRDb250cm9sbGVyID0gbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQWJvcnRDb250cm9sbGVyXG5tb2R1bGUuZXhwb3J0cy5BYm9ydFNpZ25hbCA9IEFib3J0U2lnbmFsXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hYm9ydC1jb250cm9sbGVyLmpzLm1hcFxuIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL09wdGlvbnMnO1xuaW1wb3J0IFJlcXVlc3RPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9SZXF1ZXN0T3B0aW9ucyc7XG5cbmltcG9ydCBEb21haW5DbGllbnQgZnJvbSAnLi9kb21haW5zJztcbmltcG9ydCBFdmVudENsaWVudCBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgU3RhdHNDbGllbnQgZnJvbSAnLi9zdGF0cyc7XG5pbXBvcnQgU3VwcHJlc3Npb25DbGllbnQgZnJvbSAnLi9zdXBwcmVzc2lvbnMnO1xuaW1wb3J0IFdlYmhvb2tDbGllbnQgZnJvbSAnLi93ZWJob29rcyc7XG5pbXBvcnQgTWVzc2FnZXNDbGllbnQgZnJvbSAnLi9tZXNzYWdlcyc7XG5pbXBvcnQgUm91dGVzQ2xpZW50IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCBWYWxpZGF0ZUNsaWVudCBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBJcHNDbGllbnQgZnJvbSAnLi9pcHMnO1xuaW1wb3J0IElwUG9vbHNDbGllbnQgZnJvbSAnLi9pcC1wb29scyc7XG5pbXBvcnQgTGlzdHNDbGllbnQgZnJvbSAnLi9saXN0cyc7XG5pbXBvcnQgTWFpbExpc3RzTWVtYmVycyBmcm9tICcuL21haWxMaXN0TWVtYmVycyc7XG5pbXBvcnQgeyBJbnB1dEZvcm1EYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lGb3JtRGF0YSc7XG5pbXBvcnQgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQgZnJvbSAnLi9kb21haW5zQ3JlZGVudGlhbHMnO1xuaW1wb3J0IE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCBmcm9tICcuL211bHRpcGxlVmFsaWRhdGlvbic7XG5pbXBvcnQgRG9tYWluVGVtcGxhdGVzQ2xpZW50IGZyb20gJy4vZG9tYWluc1RlbXBsYXRlcyc7XG5pbXBvcnQgRG9tYWluVGFnc0NsaWVudCBmcm9tICcuL2RvbWFpbnNUYWdzJztcbmltcG9ydCB7IElNYWlsZ3VuQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNYWlsZ3VuQ2xpZW50JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50IGltcGxlbWVudHMgSU1haWxndW5DbGllbnQge1xuICBwcml2YXRlIHJlcXVlc3Q7XG5cbiAgcHVibGljIGRvbWFpbnM7XG4gIHB1YmxpYyB3ZWJob29rcztcbiAgcHVibGljIGV2ZW50cztcbiAgcHVibGljIHN0YXRzO1xuICBwdWJsaWMgc3VwcHJlc3Npb25zO1xuICBwdWJsaWMgbWVzc2FnZXM7XG4gIHB1YmxpYyByb3V0ZXM7XG4gIHB1YmxpYyB2YWxpZGF0ZTtcbiAgcHVibGljIGlwcztcbiAgcHVibGljIGlwX3Bvb2xzO1xuICBwdWJsaWMgbGlzdHM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucywgZm9ybURhdGE6IElucHV0Rm9ybURhdGEpIHtcbiAgICBjb25zdCBjb25maWc6IFJlcXVlc3RPcHRpb25zID0geyAuLi5vcHRpb25zIH0gYXMgUmVxdWVzdE9wdGlvbnM7XG5cbiAgICBpZiAoIWNvbmZpZy51cmwpIHtcbiAgICAgIGNvbmZpZy51cmwgPSAnaHR0cHM6Ly9hcGkubWFpbGd1bi5uZXQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBcInVzZXJuYW1lXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIFwia2V5XCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3QoY29uZmlnLCBmb3JtRGF0YSk7XG4gICAgY29uc3QgbWFpbExpc3RzTWVtYmVycyA9IG5ldyBNYWlsTGlzdHNNZW1iZXJzKHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQgPSBuZXcgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICBjb25zdCBkb21haW5UZW1wbGF0ZXNDbGllbnQgPSBuZXcgRG9tYWluVGVtcGxhdGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgZG9tYWluVGFnc0NsaWVudCA9IG5ldyBEb21haW5UYWdzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50ID0gbmV3IE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCh0aGlzLnJlcXVlc3QpO1xuXG4gICAgdGhpcy5kb21haW5zID0gbmV3IERvbWFpbkNsaWVudChcbiAgICAgIHRoaXMucmVxdWVzdCxcbiAgICAgIGRvbWFpbkNyZWRlbnRpYWxzQ2xpZW50LFxuICAgICAgZG9tYWluVGVtcGxhdGVzQ2xpZW50LFxuICAgICAgZG9tYWluVGFnc0NsaWVudFxuICAgICk7XG4gICAgdGhpcy53ZWJob29rcyA9IG5ldyBXZWJob29rQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLnN0YXRzID0gbmV3IFN0YXRzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5zdXBwcmVzc2lvbnMgPSBuZXcgU3VwcHJlc3Npb25DbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5yb3V0ZXMgPSBuZXcgUm91dGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcHMgPSBuZXcgSXBzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcF9wb29scyA9IG5ldyBJcFBvb2xzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5saXN0cyA9IG5ldyBMaXN0c0NsaWVudCh0aGlzLnJlcXVlc3QsIG1haWxMaXN0c01lbWJlcnMpO1xuICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgVmFsaWRhdGVDbGllbnQodGhpcy5yZXF1ZXN0LCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7XG4gIERvbWFpblJlc3BvbnNlRGF0YSxcbiAgRGVzdHJveWVkRG9tYWluUmVzcG9uc2UsXG4gIERvbWFpbnNRdWVyeSxcbiAgRG9tYWluSW5mbyxcbiAgRG9tYWluTGlzdFJlc3BvbnNlRGF0YSxcbiAgRG9tYWluU2hvcnREYXRhLFxuICBETlNSZWNvcmQsXG4gIENvbm5lY3Rpb25TZXR0aW5nc1Jlc3BvbnNlLFxuICBDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3NSZXMsXG4gIERLSU1BdXRob3JpdHlJbmZvLFxuICBVcGRhdGVkREtJTUF1dGhvcml0eSxcbiAgVXBkYXRlZERLSU1BdXRob3JpdHlSZXNwb25zZSxcbiAgREtJTVNlbGVjdG9ySW5mbyxcbiAgVXBkYXRlZERLSU1TZWxlY3RvclJlc3BvbnNlLFxuICBXZWJQcmVmaXhJbmZvLFxuICBVcGRhdGVkV2ViUHJlZml4UmVzcG9uc2UsXG4gIFJlcGxhY2VtZW50Rm9yUG9vbCxcbiAgTWVzc2FnZVJlc3BvbnNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWlucyc7XG5cbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIERvbWFpblRyYWNraW5nUmVzcG9uc2UsXG4gIERvbWFpblRyYWNraW5nRGF0YSxcbiAgT3BlblRyYWNraW5nSW5mbyxcbiAgQ2xpY2tUcmFja2luZ0luZm8sXG4gIFVuc3Vic2NyaWJlVHJhY2tpbmdJbmZvLFxuICBVcGRhdGVEb21haW5UcmFja2luZ1Jlc3BvbnNlLFxuICBVcGRhdGVkT3BlblRyYWNraW5nXG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UcmFja2luZyc7XG5pbXBvcnQgeyBJRG9tYWluQ3JlZGVudGlhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluQ3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgSURvbWFpblRlbXBsYXRlc0NsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UZW1wbGF0ZXMnO1xuaW1wb3J0IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50IGZyb20gJy4vZG9tYWluc0NyZWRlbnRpYWxzJztcbmltcG9ydCBEb21haW5UZW1wbGF0ZXNDbGllbnQgZnJvbSAnLi9kb21haW5zVGVtcGxhdGVzJztcbmltcG9ydCB7IElEb21haW5UYWdzQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0RvbWFpblRhZ3MnO1xuaW1wb3J0IERvbWFpblRhZ3NDbGllbnQgZnJvbSAnLi9kb21haW5zVGFncyc7XG5cbmV4cG9ydCBjbGFzcyBEb21haW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHJlcXVpcmVfdGxzOiBib29sZWFuO1xuICBza2lwX3ZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgc3RhdGU6IHN0cmluZztcbiAgd2lsZGNhcmQ6IGJvb2xlYW47XG4gIHNwYW1fYWN0aW9uOiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgc210cF9wYXNzd29yZDogc3RyaW5nO1xuICBzbXRwX2xvZ2luOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgcmVjZWl2aW5nX2Ruc19yZWNvcmRzOiBETlNSZWNvcmRbXSB8IG51bGw7XG4gIHNlbmRpbmdfZG5zX3JlY29yZHM6IEROU1JlY29yZFtdIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBEb21haW5TaG9ydERhdGEsIHJlY2VpdmluZz86IEROU1JlY29yZFtdIHwgbnVsbCwgc2VuZGluZz86IEROU1JlY29yZFtdIHwgbnVsbCkge1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnJlcXVpcmVfdGxzID0gZGF0YS5yZXF1aXJlX3RscztcbiAgICB0aGlzLnNraXBfdmVyaWZpY2F0aW9uID0gZGF0YS5za2lwX3ZlcmlmaWNhdGlvbjtcbiAgICB0aGlzLnN0YXRlID0gZGF0YS5zdGF0ZTtcbiAgICB0aGlzLndpbGRjYXJkID0gZGF0YS53aWxkY2FyZDtcbiAgICB0aGlzLnNwYW1fYWN0aW9uID0gZGF0YS5zcGFtX2FjdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRfYXQgPSBkYXRhLmNyZWF0ZWRfYXQ7XG4gICAgdGhpcy5zbXRwX3Bhc3N3b3JkID0gZGF0YS5zbXRwX3Bhc3N3b3JkO1xuICAgIHRoaXMuc210cF9sb2dpbiA9IGRhdGEuc210cF9sb2dpbjtcbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICB0aGlzLnJlY2VpdmluZ19kbnNfcmVjb3JkcyA9IHJlY2VpdmluZyB8fCBudWxsO1xuICAgIHRoaXMuc2VuZGluZ19kbnNfcmVjb3JkcyA9IHNlbmRpbmcgfHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5DbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuICBwdWJsaWMgZG9tYWluQ3JlZGVudGlhbHM6IElEb21haW5DcmVkZW50aWFscztcbiAgcHVibGljIGRvbWFpblRlbXBsYXRlczogSURvbWFpblRlbXBsYXRlc0NsaWVudDtcbiAgcHVibGljIGRvbWFpblRhZ3M6IElEb21haW5UYWdzQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ6IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50LFxuICAgIGRvbWFpblRlbXBsYXRlc0NsaWVudDogRG9tYWluVGVtcGxhdGVzQ2xpZW50LFxuICAgIGRvbWFpblRhZ3NDbGllbnQ6IERvbWFpblRhZ3NDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmRvbWFpbkNyZWRlbnRpYWxzID0gZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UZW1wbGF0ZXMgPSBkb21haW5UZW1wbGF0ZXNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UYWdzID0gZG9tYWluVGFnc0NsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlTWVzc2FnZShyZXNwb25zZTogRGVzdHJveWVkRG9tYWluUmVzcG9uc2UpIDogTWVzc2FnZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluTGlzdChyZXNwb25zZTogRG9tYWluTGlzdFJlc3BvbnNlRGF0YSk6IERvbWFpbltdIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBuZXcgRG9tYWluKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEb21haW4ocmVzcG9uc2U6IERvbWFpblJlc3BvbnNlRGF0YSk6IERvbWFpbiB7XG4gICAgcmV0dXJuIG5ldyBEb21haW4oXG4gICAgICByZXNwb25zZS5ib2R5LmRvbWFpbixcbiAgICAgIHJlc3BvbnNlLmJvZHkucmVjZWl2aW5nX2Ruc19yZWNvcmRzLFxuICAgICAgcmVzcG9uc2UuYm9keS5zZW5kaW5nX2Ruc19yZWNvcmRzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVHJhY2tpbmdTZXR0aW5ncyhyZXNwb25zZTogRG9tYWluVHJhY2tpbmdSZXNwb25zZSkgOiBEb21haW5UcmFja2luZ0RhdGEge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5LnRyYWNraW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VUcmFja2luZ1VwZGF0ZShyZXNwb25zZTogVXBkYXRlRG9tYWluVHJhY2tpbmdSZXNwb25zZSkgOlVwZGF0ZWRPcGVuVHJhY2tpbmcge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICB9XG5cbiAgbGlzdChxdWVyeT86IERvbWFpbnNRdWVyeSk6IFByb21pc2U8RG9tYWluW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL2RvbWFpbnMnLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW5MaXN0KHJlcyBhcyBEb21haW5MaXN0UmVzcG9uc2VEYXRhKSk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcpIDogUHJvbWlzZTxEb21haW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3YzL2RvbWFpbnMvJHtkb21haW59YClcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW4ocmVzIGFzIERvbWFpblJlc3BvbnNlRGF0YSkpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IERvbWFpbkluZm8pIDogUHJvbWlzZTxEb21haW4+IHtcbiAgICBjb25zdCBwb3N0T2JqID0geyAuLi5kYXRhIH07XG4gICAgaWYgKCdmb3JjZV9ka2ltX2F1dGhvcml0eScgaW4gcG9zdE9iaiAmJiB0eXBlb2YgcG9zdE9iai5mb3JjZV9ka2ltX2F1dGhvcml0eSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBwb3N0T2JqLmZvcmNlX2RraW1fYXV0aG9yaXR5ID0gcG9zdE9iai50b1N0cmluZygpID09PSAndHJ1ZScgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCgnL3YzL2RvbWFpbnMnLCBwb3N0T2JqKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZURvbWFpbihyZXMgYXMgRG9tYWluUmVzcG9uc2VEYXRhKSk7XG4gIH1cblxuICB2ZXJpZnkoZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpbj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vdmVyaWZ5YCwge30pXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRG9tYWluKHJlcyBhcyBEb21haW5SZXNwb25zZURhdGEpKTtcbiAgfVxuXG4gIGRlc3Ryb3koZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAvdjMvZG9tYWlucy8ke2RvbWFpbn1gKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZU1lc3NhZ2UocmVzIGFzIERlc3Ryb3llZERvbWFpblJlc3BvbnNlKSk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3YzL2RvbWFpbnMvJHtkb21haW59L2Nvbm5lY3Rpb25gKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiByZXMgYXMgQ29ubmVjdGlvblNldHRpbmdzUmVzcG9uc2UpXG4gICAgICAudGhlbigocmVzOkNvbm5lY3Rpb25TZXR0aW5nc1Jlc3BvbnNlKSA9PiByZXMuYm9keS5jb25uZWN0aW9uIGFzIENvbm5lY3Rpb25TZXR0aW5ncyk7XG4gIH1cblxuICB1cGRhdGVDb25uZWN0aW9uKGRvbWFpbjogc3RyaW5nLCBkYXRhOiBDb25uZWN0aW9uU2V0dGluZ3MpOiBQcm9taXNlPFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dChgL3YzL2RvbWFpbnMvJHtkb21haW59L2Nvbm5lY3Rpb25gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiByZXMgYXMgVXBkYXRlZENvbm5lY3Rpb25TZXR0aW5nc1JlcylcbiAgICAgIC50aGVuKChyZXM6VXBkYXRlZENvbm5lY3Rpb25TZXR0aW5nc1JlcykgPT4gcmVzLmJvZHkgYXMgVXBkYXRlZENvbm5lY3Rpb25TZXR0aW5ncyk7XG4gIH1cblxuICAvLyBUcmFja2luZ1xuXG4gIGdldFRyYWNraW5nKGRvbWFpbjogc3RyaW5nKSA6IFByb21pc2U8RG9tYWluVHJhY2tpbmdEYXRhPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd0cmFja2luZycpKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VUcmFja2luZ1NldHRpbmdzKTtcbiAgfVxuXG4gIHVwZGF0ZVRyYWNraW5nKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBkYXRhOiBPcGVuVHJhY2tpbmdJbmZvIHwgQ2xpY2tUcmFja2luZ0luZm8gfCBVbnN1YnNjcmliZVRyYWNraW5nSW5mb1xuICApOiBQcm9taXNlPFVwZGF0ZWRPcGVuVHJhY2tpbmc+IHtcbiAgICBpZiAodHlwZW9mIGRhdGE/LmFjdGl2ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoeyBzdGF0dXM6IDQwMCwgc3RhdHVzVGV4dDogJ1JlY2VpdmVkIGJvb2xlYW4gdmFsdWUgZm9yIGFjdGl2ZSBwcm9wZXJ0eScsIGJvZHk6IHsgbWVzc2FnZTogJ1Byb3BlcnR5IFwiYWN0aXZlXCIgbXVzdCBjb250YWluIHN0cmluZyB2YWx1ZS4nIH0gfSBhcyBBUElFcnJvck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3RyYWNraW5nJywgdHlwZSksIGRhdGEpXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlVHJhY2tpbmdVcGRhdGUocmVzIGFzIFVwZGF0ZURvbWFpblRyYWNraW5nUmVzcG9uc2UpKTtcbiAgfVxuXG4gIC8vIElQc1xuXG4gIGdldElwcyhkb21haW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ2lwcycpKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBBUElSZXNwb25zZSkgPT4gcmVzcG9uc2U/LmJvZHk/Lml0ZW1zKTtcbiAgfVxuXG4gIGFzc2lnbklwKGRvbWFpbjogc3RyaW5nLCBpcDogc3RyaW5nKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ2lwcycpLCB7IGlwIH0pO1xuICB9XG5cbiAgZGVsZXRlSXAoZG9tYWluOiBzdHJpbmcsIGlwOiBzdHJpbmcpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICdpcHMnLCBpcCkpO1xuICB9XG5cbiAgbGlua0lwUG9vbChkb21haW46IHN0cmluZywgcG9vbF9pZDogc3RyaW5nKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ2lwcycpLCB7IHBvb2xfaWQgfSk7XG4gIH1cblxuICB1bmxpbmtJcFBvbGwoZG9tYWluOiBzdHJpbmcsIHJlcGxhY2VtZW50OiBSZXBsYWNlbWVudEZvclBvb2wpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgbGV0IHNlYXJjaFBhcmFtcyA9ICcnO1xuICAgIGlmIChyZXBsYWNlbWVudC5wb29sX2lkICYmIHJlcGxhY2VtZW50LmlwKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICBzdGF0dXNUZXh0OiAnVG9vIG11Y2ggZGF0YSBmb3IgcmVwbGFjZW1lbnQnLFxuICAgICAgICAgIGJvZHk6IHsgbWVzc2FnZTogJ1BsZWFzZSBzcGVjaWZ5IGVpdGhlciBwb29sX2lkIG9yIGlwIChub3QgYm90aCknIH1cbiAgICAgICAgfSBhcyBBUElFcnJvck9wdGlvbnNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChyZXBsYWNlbWVudC5wb29sX2lkKSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBgP3Bvb2xfaWQ9JHtyZXBsYWNlbWVudC5wb29sX2lkfWA7XG4gICAgfSBlbHNlIGlmIChyZXBsYWNlbWVudC5pcCkge1xuICAgICAgc2VhcmNoUGFyYW1zID0gYD9pcD0ke3JlcGxhY2VtZW50LmlwfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJywgJ2lwX3Bvb2wnLCBzZWFyY2hQYXJhbXMpKTtcbiAgfVxuXG4gIHVwZGF0ZURLSU1BdXRob3JpdHkoZG9tYWluOiBzdHJpbmcsIGRhdGE6IERLSU1BdXRob3JpdHlJbmZvKTogUHJvbWlzZTxVcGRhdGVkREtJTUF1dGhvcml0eT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vZGtpbV9hdXRob3JpdHlgLCB7fSwgeyBxdWVyeTogYHNlbGY9JHtkYXRhLnNlbGZ9YCB9KVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiByZXMgYXMgVXBkYXRlZERLSU1BdXRob3JpdHlSZXNwb25zZSlcbiAgICAgIC50aGVuKChyZXMgOiBVcGRhdGVkREtJTUF1dGhvcml0eVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBVcGRhdGVkREtJTUF1dGhvcml0eSk7XG4gIH1cblxuICB1cGRhdGVES0lNU2VsZWN0b3IoZG9tYWluOiBzdHJpbmcsIGRhdGE6IERLSU1TZWxlY3RvckluZm8pOiBQcm9taXNlPFVwZGF0ZWRES0lNU2VsZWN0b3JSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vZGtpbV9zZWxlY3RvcmAsIHt9LCB7IHF1ZXJ5OiBgZGtpbV9zZWxlY3Rvcj0ke2RhdGEuZGtpbVNlbGVjdG9yfWAgfSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gcmVzIGFzIFVwZGF0ZWRES0lNU2VsZWN0b3JSZXNwb25zZSk7XG4gIH1cblxuICB1cGRhdGVXZWJQcmVmaXgoZG9tYWluOiBzdHJpbmcsIGRhdGE6IFdlYlByZWZpeEluZm8pOiBQcm9taXNlPFVwZGF0ZWRXZWJQcmVmaXhSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vd2ViX3ByZWZpeGAsIHt9LCB7IHF1ZXJ5OiBgd2ViX3ByZWZpeD0ke2RhdGEud2ViUHJlZml4fWAgfSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gcmVzIGFzIFVwZGF0ZWRXZWJQcmVmaXhSZXNwb25zZSk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuaW1wb3J0IHtcbiAgQ3JlYXRlZFVwZGF0ZWREb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlLFxuICBEZWxldGVkRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZSxcbiAgRG9tYWluQ3JlZGVudGlhbHMsXG4gIERvbWFpbkNyZWRlbnRpYWxzTGlzdCxcbiAgRG9tYWluQ3JlZGVudGlhbHNRdWVyeSxcbiAgRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZURhdGEsXG4gIERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0LFxuICBJRG9tYWluQ3JlZGVudGlhbHMsXG4gIFVwZGF0ZURvbWFpbkNyZWRlbnRpYWxzRGF0YVxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluQ3JlZGVudGlhbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5DcmVkZW50aWFsc0NsaWVudCBpbXBsZW1lbnRzIElEb21haW5DcmVkZW50aWFscyB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuYmFzZVJvdXRlID0gJy92My9kb21haW5zLyc7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZURvbWFpbkNyZWRlbnRpYWxzTGlzdChcbiAgICByZXNwb25zZTogRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZURhdGFcbiAgKTogRG9tYWluQ3JlZGVudGlhbHNMaXN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHJlc3BvbnNlLmJvZHkuaXRlbXMsXG4gICAgICB0b3RhbENvdW50OiByZXNwb25zZS5ib2R5LnRvdGFsX2NvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlTWVzc2FnZVJlc3BvbnNlKFxuICAgIHJlc3BvbnNlOiBDcmVhdGVkVXBkYXRlZERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VcbiAgKTogRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlXG4gICAgfSBhcyBEb21haW5DcmVkZW50aWFsc1Jlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEZWxldGVkUmVzcG9uc2UoXG4gICAgcmVzcG9uc2U6RGVsZXRlZERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VcbiAgKTogRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlLFxuICAgICAgc3BlYzogcmVzcG9uc2UuYm9keS5zcGVjXG4gICAgfSBhcyBEb21haW5DcmVkZW50aWFsc1Jlc3VsdDtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IERvbWFpbkNyZWRlbnRpYWxzUXVlcnkpOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy9jcmVkZW50aWFscycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW5DcmVkZW50aWFsc0xpc3QocmVzIGFzIERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2VEYXRhKVxuICAgICAgKTtcbiAgfVxuXG4gIGNyZWF0ZShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5DcmVkZW50aWFsc1xuICApOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS9jcmVkZW50aWFsc2AsIGRhdGEpXG4gICAgICAudGhlbigocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VNZXNzYWdlUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICB1cGRhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHNMb2dpbjogc3RyaW5nLFxuICAgIGRhdGE6IFVwZGF0ZURvbWFpbkNyZWRlbnRpYWxzRGF0YVxuICApOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9JHtkb21haW59L2NyZWRlbnRpYWxzLyR7Y3JlZGVudGlhbHNMb2dpbn1gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlTWVzc2FnZVJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgZGVzdHJveShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBjcmVkZW50aWFsc0xvZ2luOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEb21haW5DcmVkZW50aWFsc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS9jcmVkZW50aWFscy8ke2NyZWRlbnRpYWxzTG9naW59YClcbiAgICAgIC50aGVuKChyZXM6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZURlbGV0ZWRSZXNwb25zZShyZXMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuaW1wb3J0IEFQSVJlc3BvbnNlIGZyb20gJy4vaW50ZXJmYWNlcy9BcGlSZXNwb25zZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5pbXBvcnQge1xuICBEb21haW5UYWdBUElSZXNwb25zZVN0YXRzSXRlbSxcbiAgRG9tYWluVGFnQ291bnRyaWVzQWdncmVnYXRpb24sXG4gIERvbWFpblRhZ0NvdW50cmllc0FQSVJlc3BvbnNlLFxuICBEb21haW5UYWdEZXZpY2VzQWdncmVnYXRpb24sXG4gIERvbWFpblRhZ0RldmljZXNBUElSZXNwb25zZSxcbiAgRG9tYWluVGFnUHJvdmlkZXJzQWdncmVnYXRpb24sXG4gIERvbWFpblRhZ1Byb3ZpZGVyc0FQSVJlc3BvbnNlLFxuICBEb21haW5UYWdzSXRlbSxcbiAgRG9tYWluVGFnc0l0ZW1JbmZvLFxuICBEb21haW5UYWdzTGlzdCxcbiAgRG9tYWluVGFnc01lc3NhZ2VSZXMsXG4gIERvbWFpblRhZ3NRdWVyeSxcbiAgRG9tYWluVGFnc1Jlc3BvbnNlRGF0YSxcbiAgRG9tYWluVGFnc1N0YXRpc3RpY1F1ZXJ5LFxuICBEb21haW5UYWdTdGF0QVBJUmVzcG9uc2UsXG4gIERvbWFpblRhZ1N0YXRpc3RpY0l0ZW0sXG4gIERvbWFpblRhZ1N0YXRpc3RpY1Jlc3VsdCxcbiAgSURvbWFpblRhZ3NDbGllbnQsXG4gIFBhZ2VzTGlzdCxcbiAgUGFnZXNMaXN0QWNjdW11bGF0b3IsXG4gIFBhcnNlZFBhZ2VzTGlzdCxcbiAgUmVzb2x1dGlvblxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluVGFncyc7XG5cbmV4cG9ydCBjbGFzcyBEb21haW5UYWcgaW1wbGVtZW50cyBEb21haW5UYWdzSXRlbSB7XG4gIHRhZzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAnZmlyc3Qtc2Vlbic6IERhdGU7XG4gICdsYXN0LXNlZW4nOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKHRhZ0luZm86IERvbWFpblRhZ3NJdGVtSW5mbykge1xuICAgIHRoaXMudGFnID0gdGFnSW5mby50YWc7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRhZ0luZm8uZGVzY3JpcHRpb247XG4gICAgdGhpc1snZmlyc3Qtc2VlbiddID0gbmV3IERhdGUodGFnSW5mb1snZmlyc3Qtc2VlbiddKTtcbiAgICB0aGlzWydsYXN0LXNlZW4nXSA9IG5ldyBEYXRlKHRhZ0luZm9bJ2xhc3Qtc2VlbiddKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9tYWluVGFnU3RhdGlzdGljIGltcGxlbWVudHMgRG9tYWluVGFnU3RhdGlzdGljUmVzdWx0IHtcbiAgdGFnOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YXJ0OiBEYXRlO1xuICBlbmQ6IERhdGU7XG4gIHJlc29sdXRpb246IFJlc29sdXRpb247XG4gIHN0YXRzOiBEb21haW5UYWdTdGF0aXN0aWNJdGVtW107XG5cbiAgY29uc3RydWN0b3IodGFnU3RhdGlzdGljSW5mbzogRG9tYWluVGFnU3RhdEFQSVJlc3BvbnNlKSB7XG4gICAgdGhpcy50YWcgPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkudGFnO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkuZGVzY3JpcHRpb247XG4gICAgdGhpcy5zdGFydCA9IG5ldyBEYXRlKHRhZ1N0YXRpc3RpY0luZm8uYm9keS5zdGFydCk7XG4gICAgdGhpcy5lbmQgPSBuZXcgRGF0ZSh0YWdTdGF0aXN0aWNJbmZvLmJvZHkuZW5kKTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkucmVzb2x1dGlvbjtcbiAgICB0aGlzLnN0YXRzID0gdGFnU3RhdGlzdGljSW5mby5ib2R5LnN0YXRzLm1hcChmdW5jdGlvbiAoc3RhdDogRG9tYWluVGFnQVBJUmVzcG9uc2VTdGF0c0l0ZW0pIHtcbiAgICAgIGNvbnN0IHJlcyA9IHsgLi4uc3RhdCwgdGltZTogbmV3IERhdGUoc3RhdC50aW1lKSB9O1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5UYWdzQ2xpZW50IGltcGxlbWVudHMgSURvbWFpblRhZ3NDbGllbnQge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvJztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlOiBEb21haW5UYWdzUmVzcG9uc2VEYXRhKTogUGFyc2VkUGFnZXNMaXN0IHtcbiAgICBjb25zdCBwYWdlcyA9IE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmJvZHkucGFnaW5nIGFzIFBhZ2VzTGlzdCk7XG4gICAgcmV0dXJuIHBhZ2VzLnJlZHVjZShcbiAgICAgIChhY2M6IFBhZ2VzTGlzdEFjY3VtdWxhdG9yLCBlbnRyaWU6IFt1cmw6IHN0cmluZywgaWQ6IHN0cmluZ10pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBlbnRyaWVbMF07XG4gICAgICAgIGNvbnN0IHVybCA9IGVudHJpZVsxXTtcbiAgICAgICAgYWNjW2lkXSA9IHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB1cmxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9XG4gICAgKSBhcyB1bmtub3duIGFzIFBhcnNlZFBhZ2VzTGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluVGFnc0xpc3QoXG4gICAgcmVzcG9uc2U6IERvbWFpblRhZ3NSZXNwb25zZURhdGFcbiAgKTogRG9tYWluVGFnc0xpc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoKHRhZ0luZm8pID0+IG5ldyBEb21haW5UYWcodGFnSW5mbykpLFxuICAgICAgcGFnZXM6IHRoaXMuX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVRhZ1N0YXRpc3RpYyhcbiAgICByZXNwb25zZTogRG9tYWluVGFnU3RhdEFQSVJlc3BvbnNlXG4gICk6IERvbWFpblRhZ1N0YXRpc3RpYyB7XG4gICAgcmV0dXJuIG5ldyBEb21haW5UYWdTdGF0aXN0aWMocmVzcG9uc2UpO1xuICB9XG5cbiAgbGlzdChkb21haW46IHN0cmluZywgcXVlcnk/OiBEb21haW5UYWdzUXVlcnkpOiBQcm9taXNlPERvbWFpblRhZ3NMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRG9tYWluVGFnc0xpc3QocmVzIGFzIERvbWFpblRhZ3NSZXNwb25zZURhdGEpXG4gICAgICApO1xuICB9XG5cbiAgZ2V0KGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGFnc0l0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZykpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IG5ldyBEb21haW5UYWcocmVzLmJvZHkpXG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlKGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGFnc01lc3NhZ2VSZXM+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZyksIGRlc2NyaXB0aW9uKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IEFQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdzTWVzc2FnZVJlc1xuICAgICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3koXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEb21haW5UYWdzTWVzc2FnZVJlcz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAke3RoaXMuYmFzZVJvdXRlfSR7ZG9tYWlufS90YWdzLyR7dGFnfWApXG4gICAgICAudGhlbigocmVzOiBBUElSZXNwb25zZSkgPT4gKFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogcmVzLmJvZHkubWVzc2FnZSxcbiAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXNcbiAgICAgICAgfSBhcyBEb21haW5UYWdzTWVzc2FnZVJlcykpO1xuICB9XG5cbiAgc3RhdGlzdGljKGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZywgcXVlcnk6IERvbWFpblRhZ3NTdGF0aXN0aWNRdWVyeSlcbiAgICA6IFByb21pc2U8RG9tYWluVGFnU3RhdGlzdGljPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnLCB0YWcsICdzdGF0cycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VUYWdTdGF0aXN0aWMocmVzKVxuICAgICAgKTtcbiAgfVxuXG4gIGNvdW50cmllcyhkb21haW46IHN0cmluZywgdGFnOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpblRhZ0NvdW50cmllc0FnZ3JlZ2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnLCB0YWcsICdzdGF0cy9hZ2dyZWdhdGVzL2NvdW50cmllcycpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IERvbWFpblRhZ0NvdW50cmllc0FQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdDb3VudHJpZXNBZ2dyZWdhdGlvblxuICAgICAgKTtcbiAgfVxuXG4gIHByb3ZpZGVycyhkb21haW46IHN0cmluZywgdGFnOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpblRhZ1Byb3ZpZGVyc0FnZ3JlZ2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RhZ3MnLCB0YWcsICdzdGF0cy9hZ2dyZWdhdGVzL3Byb3ZpZGVycycpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IERvbWFpblRhZ1Byb3ZpZGVyc0FQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdQcm92aWRlcnNBZ2dyZWdhdGlvblxuICAgICAgKTtcbiAgfVxuXG4gIGRldmljZXMoZG9tYWluOiBzdHJpbmcsIHRhZzogc3RyaW5nKTogUHJvbWlzZTxEb21haW5UYWdEZXZpY2VzQWdncmVnYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZywgJ3N0YXRzL2FnZ3JlZ2F0ZXMvZGV2aWNlcycpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IERvbWFpblRhZ0RldmljZXNBUElSZXNwb25zZSkgPT4gcmVzLmJvZHkgYXMgRG9tYWluVGFnRGV2aWNlc0FnZ3JlZ2F0aW9uXG4gICAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQgQVBJUmVzcG9uc2UgZnJvbSAnLi9pbnRlcmZhY2VzL0FwaVJlc3BvbnNlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmltcG9ydCB7XG4gIENyZWF0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UsXG4gIENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlLFxuICBDcmVhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQsXG4gIERvbWFpblRlbXBsYXRlLCBEb21haW5UZW1wbGF0ZURhdGEsXG4gIERvbWFpblRlbXBsYXRlc1F1ZXJ5LFxuICBEb21haW5UZW1wbGF0ZVVwZGF0ZURhdGEsXG4gIERvbWFpblRlbXBsYXRlVXBkYXRlVmVyc2lvbkRhdGEsXG4gIERvbWFpblRlbXBsYXRlVmVyc2lvbkRhdGEsXG4gIEdldERvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UsXG4gIElEb21haW5UZW1wbGF0ZXNDbGllbnQsXG4gIExpc3REb21haW5UZW1wbGF0ZXNBUElSZXNwb25zZSxcbiAgTGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdCxcbiAgTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNBUElSZXNwb25zZSxcbiAgTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQsXG4gIE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlLFxuICBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQsXG4gIE5vdGlmaWNhdGlvbkFQSVJlc3BvbnNlLFxuICBOb3RpZmljYXRpb25SZXN1bHQsXG4gIFNob3J0VGVtcGxhdGVWZXJzaW9uLFxuICBUZW1wbGF0ZVF1ZXJ5LFxuICBUZW1wbGF0ZVZlcnNpb24sXG4gIFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSxcbiAgVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdFxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluVGVtcGxhdGVzJztcblxuZXhwb3J0IGNsYXNzIERvbWFpblRlbXBsYXRlSXRlbSBpbXBsZW1lbnRzIERvbWFpblRlbXBsYXRlIHtcbiAgbmFtZSA6IHN0cmluZztcbiAgZGVzY3JpcHRpb24gOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdCA6IERhdGUgfCAnJztcbiAgY3JlYXRlZEJ5IDogc3RyaW5nO1xuICBpZCA6IHN0cmluZztcbiAgdmVyc2lvbj86IFRlbXBsYXRlVmVyc2lvbjtcbiAgdmVyc2lvbnM/OiBTaG9ydFRlbXBsYXRlVmVyc2lvbltdO1xuXG4gIGNvbnN0cnVjdG9yKGRvbWFpblRlbXBsYXRlRnJvbUFQSTogRG9tYWluVGVtcGxhdGUpIHtcbiAgICB0aGlzLm5hbWUgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkubmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZG9tYWluVGVtcGxhdGVGcm9tQVBJLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZG9tYWluVGVtcGxhdGVGcm9tQVBJLmNyZWF0ZWRBdCA/IG5ldyBEYXRlKGRvbWFpblRlbXBsYXRlRnJvbUFQSS5jcmVhdGVkQXQpIDogJyc7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuY3JlYXRlZEJ5O1xuICAgIHRoaXMuaWQgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuaWQ7XG5cbiAgICBpZiAoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb24pIHtcbiAgICAgIHRoaXMudmVyc2lvbiA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9uO1xuICAgICAgaWYgKGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9uLmNyZWF0ZWRBdCkge1xuICAgICAgICB0aGlzLnZlcnNpb24uY3JlYXRlZEF0ID0gbmV3IERhdGUoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb24uY3JlYXRlZEF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb25zICYmIGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmVyc2lvbnMgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbnMubWFwKCh2ZXJzaW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4udmVyc2lvbiB9O1xuICAgICAgICByZXN1bHQuY3JlYXRlZEF0ID0gbmV3IERhdGUodmVyc2lvbi5jcmVhdGVkQXQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbWFpblRlbXBsYXRlc0NsaWVudCBpbXBsZW1lbnRzIElEb21haW5UZW1wbGF0ZXNDbGllbnQge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvJztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDcmVhdGlvblJlc3BvbnNlKGRhdGE6IENyZWF0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpOiBEb21haW5UZW1wbGF0ZUl0ZW0ge1xuICAgIHJldHVybiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKGRhdGEuYm9keS50ZW1wbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ3JlYXRpb25WZXJzaW9uUmVzcG9uc2UoXG4gICAgZGF0YTogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2VcbiAgKTogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQ6IENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCA9IHt9IGFzIENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdDtcbiAgICByZXN1bHQuc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBkYXRhLmJvZHkubWVzc2FnZTtcbiAgICBpZiAoZGF0YS5ib2R5ICYmIGRhdGEuYm9keS50ZW1wbGF0ZSkge1xuICAgICAgcmVzdWx0LnRlbXBsYXRlID0gbmV3IERvbWFpblRlbXBsYXRlSXRlbShkYXRhLmJvZHkudGVtcGxhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU11dGF0aW9uUmVzcG9uc2UoXG4gICAgZGF0YTogVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlXG4gICk6IFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdCA9IHt9IGFzIFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQ7XG4gICAgcmVzdWx0LnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJlc3VsdC5tZXNzYWdlID0gZGF0YS5ib2R5Lm1lc3NhZ2U7XG4gICAgaWYgKGRhdGEuYm9keSAmJiBkYXRhLmJvZHkudGVtcGxhdGUpIHtcbiAgICAgIHJlc3VsdC50ZW1wbGF0ZU5hbWUgPSBkYXRhLmJvZHkudGVtcGxhdGUubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VOb3RpZmljYXRpb25SZXNwb25zZShkYXRhOiBOb3RpZmljYXRpb25BUElSZXNwb25zZSk6IE5vdGlmaWNhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBOb3RpZmljYXRpb25SZXN1bHQgPSB7fSBhcyBOb3RpZmljYXRpb25SZXN1bHQ7XG4gICAgcmVzdWx0LnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJlc3VsdC5tZXNzYWdlID0gZGF0YS5ib2R5Lm1lc3NhZ2U7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNdXRhdGVUZW1wbGF0ZVZlcnNpb25SZXNwb25zZShcbiAgICBkYXRhOiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25BUElSZXNwb25zZVxuICApOiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0ID0ge30gYXMgTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0O1xuICAgIHJlc3VsdC5zdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICByZXN1bHQubWVzc2FnZSA9IGRhdGEuYm9keS5tZXNzYWdlO1xuICAgIGlmIChkYXRhLmJvZHkudGVtcGxhdGUpIHtcbiAgICAgIHJlc3VsdC50ZW1wbGF0ZU5hbWUgPSBkYXRhLmJvZHkudGVtcGxhdGUubmFtZTtcbiAgICAgIHJlc3VsdC50ZW1wbGF0ZVZlcnNpb24gPSB7IHRhZzogZGF0YS5ib2R5LnRlbXBsYXRlLnZlcnNpb24udGFnIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTGlzdChyZXNwb25zZTogTGlzdERvbWFpblRlbXBsYXRlc0FQSVJlc3BvbnNlKTogTGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdCB7XG4gICAgY29uc3QgZGF0YSA9IHt9IGFzIExpc3REb21haW5UZW1wbGF0ZXNSZXN1bHQ7XG5cbiAgICBkYXRhLml0ZW1zID0gcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoKGQ6IERvbWFpblRlbXBsYXRlKSA9PiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKGQpKTtcblxuICAgIGRhdGEucGFnZXMgPSByZXNwb25zZS5ib2R5LnBhZ2luZztcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxpc3RUZW1wbGF0ZVZlcnNpb25zKFxuICAgIHJlc3BvbnNlOiBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc0FQSVJlc3BvbnNlXG4gICk6IExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zUmVzdWx0IHtcbiAgICBjb25zdCBkYXRhID0ge30gYXMgTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQ7XG5cbiAgICBkYXRhLnRlbXBsYXRlID0gbmV3IERvbWFpblRlbXBsYXRlSXRlbShyZXNwb25zZS5ib2R5LnRlbXBsYXRlKTtcblxuICAgIGRhdGEucGFnZXMgPSByZXNwb25zZS5ib2R5LnBhZ2luZztcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgbGlzdChkb21haW46IHN0cmluZywgcXVlcnk/OiBEb21haW5UZW1wbGF0ZXNRdWVyeSk6IFByb21pc2U8TGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMnKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VMaXN0KHJlcylcbiAgICAgICk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcsIHRlbXBsYXRlTmFtZTogc3RyaW5nLCBxdWVyeT86IFRlbXBsYXRlUXVlcnkpOiBQcm9taXNlPERvbWFpblRlbXBsYXRlSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lKSwgcXVlcnkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogR2V0RG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gbmV3IERvbWFpblRlbXBsYXRlSXRlbShyZXMuYm9keS50ZW1wbGF0ZSlcbiAgICAgICk7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVEYXRhXG4gICk6IFByb21pc2U8RG9tYWluVGVtcGxhdGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMnKSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXM6IENyZWF0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VDcmVhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgdXBkYXRlKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHRlbXBsYXRlTmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IERvbWFpblRlbXBsYXRlVXBkYXRlRGF0YVxuICApOiBQcm9taXNlPFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSksIGRhdGEpXG4gICAgICAudGhlbigocmVzOiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgZGVzdHJveShkb21haW46IHN0cmluZywgdGVtcGxhdGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSkpXG4gICAgICAudGhlbigocmVzOiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgZGVzdHJveUFsbChkb21haW46IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycpKVxuICAgICAgLnRoZW4oKHJlczogTm90aWZpY2F0aW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VOb3RpZmljYXRpb25SZXNwb25zZShyZXMpKTtcbiAgfVxuXG4gIGNyZWF0ZVZlcnNpb24oXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVWZXJzaW9uRGF0YVxuICApOiBQcm9taXNlPENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucycpLCBkYXRhKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlQ3JlYXRpb25WZXJzaW9uUmVzcG9uc2UocmVzKVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFZlcnNpb24oZG9tYWluOiBzdHJpbmcsIHRlbXBsYXRlTmFtZTogc3RyaW5nLCB0YWc6IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGVtcGxhdGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcy8nLCB0ZW1wbGF0ZU5hbWUsICcvdmVyc2lvbnMvJywgdGFnKSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBHZXREb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlKSA9PiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKHJlcy5ib2R5LnRlbXBsYXRlKVxuICAgICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVZlcnNpb24oXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVVcGRhdGVWZXJzaW9uRGF0YVxuICApOiBQcm9taXNlPE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zLycsIHRhZyksIGRhdGEpXG4gICAgICAudGhlbihcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgKHJlczogTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGVUZW1wbGF0ZVZlcnNpb25SZXNwb25zZShyZXMpXG4gICAgICApO1xuICB9XG5cbiAgZGVzdHJveVZlcnNpb24oXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucy8nLCB0YWcpKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIC50aGVuKChyZXM6IE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlTXV0YXRlVGVtcGxhdGVWZXJzaW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBsaXN0VmVyc2lvbnMoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBEb21haW5UZW1wbGF0ZXNRdWVyeVxuICApOiBQcm9taXNlPExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc0FQSVJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlTGlzdFRlbXBsYXRlVmVyc2lvbnMocmVzKVxuICAgICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQVBJRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXR1czogbnVtYmVyIHwgc3RyaW5nO1xuICBzdGFjazogc3RyaW5nO1xuICBkZXRhaWxzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHN0YXR1cyxcbiAgICBzdGF0dXNUZXh0LFxuICAgIG1lc3NhZ2UsXG4gICAgYm9keSA9IHt9XG4gIH06IEFQSUVycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IHsgbWVzc2FnZTogYm9keU1lc3NhZ2UsIGVycm9yIH0gPSBib2R5O1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCBlcnJvciB8fCBzdGF0dXNUZXh0O1xuICAgIHRoaXMuZGV0YWlscyA9IGJvZHlNZXNzYWdlO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQge1xuICBFdmVudHNMaXN0LFxuICBFdmVudHNQYWdlLFxuICBFdmVudHNRdWVyeSxcbiAgRXZlbnRzUmVzcG9uc2UsXG4gIFBhZ2VzTGlzdCxcbiAgUGFnZXNMaXN0QWNjdW11bGF0b3IsXG4gIFBhcnNlZFBhZ2VzTGlzdFxufSBmcm9tICcuL2ludGVyZmFjZXMvRXZlbnRzJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXZlbnRDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgX3BhcnNlUGFnZU51bWJlcih1cmw6IHN0cmluZykgOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoJy8nKS5wb3AoKSB8fCAnJztcbiAgfVxuXG4gIF9wYXJzZVBhZ2UoaWQ6IHN0cmluZywgdXJsOiBzdHJpbmcpIDogRXZlbnRzUGFnZSB7XG4gICAgcmV0dXJuIHsgaWQsIG51bWJlcjogdGhpcy5fcGFyc2VQYWdlTnVtYmVyKHVybCksIHVybCB9O1xuICB9XG5cbiAgX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlOiBFdmVudHNSZXNwb25zZSkgOiBQYXJzZWRQYWdlc0xpc3Qge1xuICAgIGNvbnN0IHBhZ2VzID0gT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuYm9keS5wYWdpbmcgYXMgUGFnZXNMaXN0KTtcbiAgICByZXR1cm4gcGFnZXMucmVkdWNlKFxuICAgICAgKGFjYzogUGFnZXNMaXN0QWNjdW11bGF0b3IsIHBhaXI6IFt1cmw6IHN0cmluZywgaWQ6IHN0cmluZ10pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBwYWlyWzBdO1xuICAgICAgICBjb25zdCB1cmwgPSBwYWlyWzFdO1xuICAgICAgICBhY2NbaWRdID0gdGhpcy5fcGFyc2VQYWdlKGlkLCB1cmwpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApIGFzIHVua25vd24gYXMgUGFyc2VkUGFnZXNMaXN0O1xuICB9XG5cbiAgX3BhcnNlRXZlbnRMaXN0KHJlc3BvbnNlOiBFdmVudHNSZXNwb25zZSkgOiBFdmVudHNMaXN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHJlc3BvbnNlLmJvZHkuaXRlbXMsXG4gICAgICBwYWdlczogdGhpcy5fcGFyc2VQYWdlTGlua3MocmVzcG9uc2UpXG4gICAgfTtcbiAgfVxuXG4gIGdldChkb21haW46IHN0cmluZywgcXVlcnk/OiBFdmVudHNRdWVyeSkgOiBQcm9taXNlPEV2ZW50c0xpc3Q+IHtcbiAgICBsZXQgdXJsO1xuICAgIGNvbnN0IHF1ZXJ5Q29weSA9IHsgLi4ucXVlcnkgfTtcbiAgICBpZiAocXVlcnlDb3B5ICYmIHF1ZXJ5Q29weS5wYWdlKSB7XG4gICAgICB1cmwgPSB1cmxqb2luKCcvdjMnLCBkb21haW4sICdldmVudHMnLCBxdWVyeUNvcHkucGFnZSk7XG4gICAgICBkZWxldGUgcXVlcnlDb3B5LnBhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybCA9IHVybGpvaW4oJy92MycsIGRvbWFpbiwgJ2V2ZW50cycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmwsIHF1ZXJ5Q29weSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogRXZlbnRzUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRXZlbnRMaXN0KHJlc3BvbnNlKSk7XG4gIH1cbn1cbiIsImltcG9ydCBDbGllbnQgZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgSW5wdXRGb3JtRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JRm9ybURhdGEnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL09wdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWlsZ3VuIHtcbiAgc3RhdGljIGdldCBkZWZhdWx0KCk6IHR5cGVvZiBNYWlsZ3VuIHsgcmV0dXJuIHRoaXM7IH1cbiAgcHJpdmF0ZSBmb3JtRGF0YTogSW5wdXRGb3JtRGF0YVxuXG4gIGNvbnN0cnVjdG9yKEZvcm1EYXRhOiBJbnB1dEZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IEZvcm1EYXRhO1xuICB9XG5cbiAgY2xpZW50KG9wdGlvbnM6IE9wdGlvbnMpIDogQ2xpZW50IHtcbiAgICByZXR1cm4gbmV3IENsaWVudChvcHRpb25zLCB0aGlzLmZvcm1EYXRhKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQm91bmNlLCBDb21wbGFpbnQsIFVuc3Vic2NyaWJlLCBXaGl0ZUxpc3Rcbn0gZnJvbSAnLi4vc3VwcHJlc3Npb25zJztcblxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5leHBvcnQgaW50ZXJmYWNlIEJvdW5jZURhdGEge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvZGU6IG51bWJlcjtcbiAgZXJyb3I6IHN0cmluZztcbiAgY3JlYXRlZF9hdDogc3RyaW5nIHwgRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGFpbnREYXRhIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVuc3Vic2NyaWJlRGF0YSB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgdGFnczogYW55O1xuICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdoaXRlTGlzdERhdGEge1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkUGFnZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhZ2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGFkZHJlc3M6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHVybDogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFBhZ2VzTGlzdCB7XG4gIHByZXZpb3VzOiBQYXJzZWRQYWdlO1xuICBmaXJzdDogUGFyc2VkUGFnZTtcbiAgbGFzdDogUGFyc2VkUGFnZTtcbiAgbmV4dDogUGFyc2VkUGFnZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXBwcmVzc2lvbkxpc3Qge1xuICBpdGVtczogKEJvdW5jZSB8IENvbXBsYWludCB8IFVuc3Vic2NyaWJlIHwgV2hpdGVMaXN0KVtdO1xuICBwYWdlczogUGFyc2VkUGFnZXNMaXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VzTGlzdCB7XG4gIHByZXZpb3VzOiBzdHJpbmc7XG4gIGZpcnN0OiBzdHJpbmc7XG4gIGxhc3Q6IHN0cmluZztcbiAgbmV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBTdXBwcmVzc2lvbk1vZGVscyB7XG4gIEJPVU5DRVMgPSAnYm91bmNlcycsXG4gIENPTVBMQUlOVFMgPSAnY29tcGxhaW50cycsXG4gIFVOU1VCU0NSSUJFUyA9ICd1bnN1YnNjcmliZXMnLFxuICBXSElURUxJU1RTID0gJ3doaXRlbGlzdHMnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZXNMaXN0QWNjdW11bGF0b3Ige1xuICBbaW5kZXg6IHN0cmluZ106IFBhcnNlZFBhZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25MaXN0UXVlcnkge1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXBwcmVzc2lvbkxpc3RSZXNwb25zZSB7XG4gIGJvZHk6IHtcbiAgICBpdGVtczogQm91bmNlRGF0YVtdIHwgQ29tcGxhaW50RGF0YVtdIHwgVW5zdWJzY3JpYmVEYXRhW10gfCBXaGl0ZUxpc3REYXRhW107XG4gICAgcGFnaW5nOiBQYWdlc0xpc3Q7XG4gIH1cbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25SZXNwb25zZSB7XG4gIGJvZHk6IEJvdW5jZURhdGEgfCBDb21wbGFpbnREYXRhIHwgVW5zdWJzY3JpYmVEYXRhIHwgV2hpdGVMaXN0RGF0YTtcbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25EZXN0cm95UmVzcG9uc2Uge1xuICBib2R5OiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gIH1cbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25EZXN0cm95UmVzdWx0IHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHByZXNzaW9uQ3JlYXRpb25EYXRhIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjb2RlPzogbnVtYmVyO1xuICBlcnJvcj86IHN0cmluZztcbiAgZG9tYWluPzogc3RyaW5nO1xuICB0YWc/OiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ/OiBzdHJpbmcgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHByZXNzaW9uQ3JlYXRpb25SZXNwb25zZSB7XG4gIGJvZHk6e1xuICAgIG1lc3NhZ2U6c3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH1cbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25DcmVhdGlvblJlc3VsdCB7XG4gIG1lc3NhZ2U6c3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5pbXBvcnQgeyBJcFBvb2wsIElwUG9vbExpc3RSZXNwb25zZSwgSXBQb29sVXBkYXRlRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JcFBvb2xzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSXBQb29sc0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBsaXN0KHF1ZXJ5OiBhbnkpOiBQcm9taXNlPElwUG9vbFtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92MS9pcF9wb29scycsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBJcFBvb2xMaXN0UmVzcG9uc2UpID0+IHRoaXMucGFyc2VJcFBvb2xzUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgfVxuXG4gIGNyZWF0ZShkYXRhOiB7IG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcsIGlwcz86IHN0cmluZ1tdIH0pIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoJy92MS9pcF9wb29scycsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogeyBtZXNzYWdlOiBzdHJpbmcsIHBvb2xfaWQ6IHN0cmluZyB9IH0pID0+IHJlc3BvbnNlPy5ib2R5KTtcbiAgfVxuXG4gIHVwZGF0ZShwb29sSWQ6IHN0cmluZywgZGF0YTogSXBQb29sVXBkYXRlRGF0YSkgOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucGF0Y2hXaXRoRkQoYC92MS9pcF9wb29scy8ke3Bvb2xJZH1gLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiB7IGJvZHk6IGFueSB9KSA9PiByZXNwb25zZT8uYm9keSk7XG4gIH1cblxuICBkZWxldGUocG9vbElkOiBzdHJpbmcsIGRhdGE6IHsgaWQ6IHN0cmluZywgcG9vbF9pZDogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgL3YxL2lwX3Bvb2xzLyR7cG9vbElkfWAsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogYW55IH0pID0+IHJlc3BvbnNlPy5ib2R5KTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJcFBvb2xzUmVzcG9uc2UocmVzcG9uc2U6IHsgYm9keTogYW55IHwgYW55IH0pIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keS5pcF9wb29scztcbiAgfVxufVxuIiwiaW1wb3J0IE1nUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgSXBEYXRhLCBJcHNMaXN0UmVzcG9uc2VCb2R5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lwcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElwc0NsaWVudCB7XG4gIHJlcXVlc3Q6IE1nUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBNZ1JlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgbGlzdChxdWVyeTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92My9pcHMnLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogeyBib2R5OiBJcHNMaXN0UmVzcG9uc2VCb2R5IH0pID0+IHRoaXMucGFyc2VJcHNSZXNwb25zZShyZXNwb25zZSkpO1xuICB9XG5cbiAgZ2V0KGlwOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3YzL2lwcy8ke2lwfWApXG4gICAgICAudGhlbigocmVzcG9uc2U6IHsgYm9keTogSXBEYXRhIH0pID0+IHRoaXMucGFyc2VJcHNSZXNwb25zZShyZXNwb25zZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUlwc1Jlc3BvbnNlKHJlc3BvbnNlOiB7IGJvZHk6IElwc0xpc3RSZXNwb25zZUJvZHkgfCBJcERhdGEgfSkge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICB9XG59XG4iLCJpbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHtcbiAgTGlzdHNRdWVyeSxcbiAgQ3JlYXRlVXBkYXRlTGlzdCxcbiAgRGVzdHJveWVkTGlzdCxcbiAgTWFpbGluZ0xpc3QsXG4gIFZhbGlkYXRpb25BcGlSZXNwb25zZSxcbiAgU3RhcnRWYWxpZGF0aW9uUmVzdWx0LFxuICBWYWxpZGF0aW9uUmVzdWx0LFxuICBDYW5jZWxWYWxpZGF0aW9uUmVzdWx0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9saXN0cyc7XG5pbXBvcnQgeyBJTWFpbExpc3RzTWVtYmVycyB9IGZyb20gJy4vaW50ZXJmYWNlcy9tYWlsTGlzdE1lbWJlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0c0NsaWVudCB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuICBtZW1iZXJzOiBJTWFpbExpc3RzTWVtYmVycztcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0LCBtZW1iZXJzOklNYWlsTGlzdHNNZW1iZXJzKSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvbGlzdHMnO1xuICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmFsaWRhdGlvblJlc3VsdChzdGF0dXM6IG51bWJlciwgZGF0YTogVmFsaWRhdGlvbkFwaVJlc3BvbnNlKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoZGF0YS5jcmVhdGVkX2F0ICogMTAwMCkgLy8gYWRkIG1pbGxpc2Vjb25kIHRvIFVuaXggdGltZXN0YW1wXG4gICAgICB9XG4gICAgfSBhcyBWYWxpZGF0aW9uUmVzdWx0O1xuICB9XG5cbiAgbGlzdChxdWVyeT86IExpc3RzUXVlcnkpOiBQcm9taXNlPE1haWxpbmdMaXN0W10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vcGFnZXNgLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5pdGVtcyBhcyBNYWlsaW5nTGlzdFtdKTtcbiAgfVxuXG4gIGdldChtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8TWFpbGluZ0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5saXN0IGFzIE1haWxpbmdMaXN0KTtcbiAgfVxuXG4gIGNyZWF0ZShkYXRhOiBDcmVhdGVVcGRhdGVMaXN0KTogUHJvbWlzZTxNYWlsaW5nTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh0aGlzLmJhc2VSb3V0ZSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5saXN0IGFzIE1haWxpbmdMaXN0KTtcbiAgfVxuXG4gIHVwZGF0ZShtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgZGF0YTogQ3JlYXRlVXBkYXRlTGlzdCk6IFByb21pc2U8TWFpbGluZ0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5saXN0IGFzIE1haWxpbmdMaXN0KTtcbiAgfVxuXG4gIGRlc3Ryb3kobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPERlc3Ryb3llZExpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSBhcyBEZXN0cm95ZWRMaXN0KTtcbiAgfVxuXG4gIHZhbGlkYXRlKG1haWxMaXN0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxTdGFydFZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3QoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS92YWxpZGF0ZWAsIHt9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiAoe1xuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgLi4ucmVzcG9uc2UuYm9keVxuICAgICAgfSkgYXMgU3RhcnRWYWxpZGF0aW9uUmVzdWx0KTtcbiAgfVxuXG4gIHZhbGlkYXRpb25SZXN1bHQobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L3ZhbGlkYXRlYClcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzcG9uc2UpID0+IHRoaXMucGFyc2VWYWxpZGF0aW9uUmVzdWx0KFxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgcmVzcG9uc2UuYm9keSBhcyBWYWxpZGF0aW9uQXBpUmVzcG9uc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgfVxuXG4gIGNhbmNlbFZhbGlkYXRpb24obWFpbExpc3RBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPENhbmNlbFZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L3ZhbGlkYXRlYClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gKHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZVxuICAgICAgfSBhcyBDYW5jZWxWYWxpZGF0aW9uUmVzdWx0KSk7XG4gIH1cbn1cbiIsImltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQge1xuICBNYWlsTGlzdE1lbWJlcnNRdWVyeSxcbiAgSU1haWxMaXN0c01lbWJlcnMsXG4gIENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVycyxcbiAgTWFpbExpc3RNZW1iZXIsXG4gIE11bHRpcGxlTWVtYmVyc0RhdGEsXG4gIE11bHRpcGxlTWVtYmVyc1JlcURhdGEsXG4gIERlbGV0ZWRNZW1iZXIsXG4gIENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVyc1JlcSxcbiAgTmV3TXVsdGlwbGVNZW1iZXJzUmVzcG9uc2Vcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL21haWxMaXN0TWVtYmVycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haWxMaXN0c01lbWJlcnMgaW1wbGVtZW50cyBJTWFpbExpc3RzTWVtYmVycyB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuYmFzZVJvdXRlID0gJy92My9saXN0cyc7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQW5kVXBkYXRlRGF0YShkYXRhOiBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnMpIHtcbiAgICBjb25zdCBuZXdEYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICBpZiAodHlwZW9mIGRhdGEudmFycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG5ld0RhdGEudmFycyA9IEpTT04uc3RyaW5naWZ5KG5ld0RhdGEudmFycyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhLnN1YnNjcmliZWQgPT09ICdib29sZWFuJykge1xuICAgICAgbmV3RGF0YS5zdWJzY3JpYmVkID0gZGF0YS5zdWJzY3JpYmVkID8gJ3llcycgOiAnbm8nO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdEYXRhIGFzIENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVyc1JlcTtcbiAgfVxuXG4gIGxpc3RNZW1iZXJzKG1haWxMaXN0QWRkcmVzczogc3RyaW5nLCBxdWVyeT86IE1haWxMaXN0TWVtYmVyc1F1ZXJ5KTogUHJvbWlzZTxNYWlsTGlzdE1lbWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzL3BhZ2VzYCwgcXVlcnkpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkuaXRlbXMgYXMgTWFpbExpc3RNZW1iZXJbXSk7XG4gIH1cblxuICBnZXRNZW1iZXIobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsIG1haWxMaXN0TWVtYmVyQWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxNYWlsTGlzdE1lbWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVycy8ke21haWxMaXN0TWVtYmVyQWRkcmVzc31gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lm1lbWJlciBhcyBNYWlsTGlzdE1lbWJlcik7XG4gIH1cblxuICBjcmVhdGVNZW1iZXIoXG4gICAgbWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGF0YTogQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzXG4gICk6IFByb21pc2U8TWFpbExpc3RNZW1iZXI+IHtcbiAgICBjb25zdCByZXFEYXRhID0gdGhpcy5jaGVja0FuZFVwZGF0ZURhdGEoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVyc2AsIHJlcURhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkubWVtYmVyIGFzIE1haWxMaXN0TWVtYmVyKTtcbiAgfVxuXG4gIGNyZWF0ZU1lbWJlcnMoXG4gICAgbWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGF0YTogTXVsdGlwbGVNZW1iZXJzRGF0YVxuICApOiBQcm9taXNlPE5ld011bHRpcGxlTWVtYmVyc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgbmV3RGF0YTogTXVsdGlwbGVNZW1iZXJzUmVxRGF0YSA9IHtcbiAgICAgIG1lbWJlcnM6IEFycmF5LmlzQXJyYXkoZGF0YS5tZW1iZXJzKSA/IEpTT04uc3RyaW5naWZ5KGRhdGEubWVtYmVycykgOiBkYXRhLm1lbWJlcnMsXG4gICAgICB1cHNlcnQ6IGRhdGEudXBzZXJ0XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMuanNvbmAsIG5ld0RhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkgYXMgTmV3TXVsdGlwbGVNZW1iZXJzUmVzcG9uc2UpO1xuICB9XG5cbiAgdXBkYXRlTWVtYmVyKFxuICAgIG1haWxMaXN0QWRkcmVzczogc3RyaW5nLFxuICAgIG1haWxMaXN0TWVtYmVyQWRkcmVzczogc3RyaW5nLFxuICAgIGRhdGE6IENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVyc1xuICApOiBQcm9taXNlPE1haWxMaXN0TWVtYmVyPiB7XG4gICAgY29uc3QgcmVxRGF0YSA9IHRoaXMuY2hlY2tBbmRVcGRhdGVEYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVycy8ke21haWxMaXN0TWVtYmVyQWRkcmVzc31gLCByZXFEYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lm1lbWJlciBhcyBNYWlsTGlzdE1lbWJlcik7XG4gIH1cblxuICBkZXN0cm95TWVtYmVyKG1haWxMaXN0QWRkcmVzczogc3RyaW5nLCBtYWlsTGlzdE1lbWJlckFkZHJlc3M6IHN0cmluZykgOiBQcm9taXNlPERlbGV0ZWRNZW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZShgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMvJHttYWlsTGlzdE1lbWJlckFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSBhcyBEZWxldGVkTWVtYmVyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgTWFpbGd1bk1lc3NhZ2VEYXRhLFxuICBNZXNzYWdlc1NlbmRBUElSZXNwb25zZSxcbiAgTWVzc2FnZXNTZW5kUmVzdWx0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9NZXNzYWdlcyc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZXNzYWdlc0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBfcGFyc2VSZXNwb25zZShyZXNwb25zZTogTWVzc2FnZXNTZW5kQVBJUmVzcG9uc2UpOiBNZXNzYWdlc1NlbmRSZXN1bHQge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIC4uLnJlc3BvbnNlLmJvZHlcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlKGRvbWFpbjogc3RyaW5nLCBkYXRhOiBNYWlsZ3VuTWVzc2FnZURhdGEpOiBQcm9taXNlPE1lc3NhZ2VzU2VuZFJlc3VsdD4ge1xuICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgL3YzLyR7ZG9tYWlufS9tZXNzYWdlcy5taW1lYCwgZGF0YSlcbiAgICAgICAgLnRoZW4odGhpcy5fcGFyc2VSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKGAvdjMvJHtkb21haW59L21lc3NhZ2VzYCwgZGF0YSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlUmVzcG9uc2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDYW5jZWxlZE11bHRpcGxlVmFsaWRhdGlvbkpvYixcbiAgQ3JlYXRlZE11bHRpcGxlVmFsaWRhdGlvbkpvYixcbiAgSU11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCxcbiAgTXVsdGlwbGVWYWxpZGF0aW9uSm9iLFxuICBNdWx0aXBsZVZhbGlkYXRpb25Kb2JzTGlzdFJlc3VsdFxufVxuICBmcm9tICcuL2ludGVyZmFjZXMvTXVsdGlwbGVWYWxpZGF0aW9uJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCBpbXBsZW1lbnRzIElNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgbGlzdCgpOiBQcm9taXNlPE11bHRpcGxlVmFsaWRhdGlvbkpvYnNMaXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsnKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5IGFzIE11bHRpcGxlVmFsaWRhdGlvbkpvYnNMaXN0UmVzdWx0KTtcbiAgfVxuXG4gIGdldChsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8TXVsdGlwbGVWYWxpZGF0aW9uSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYC92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsvJHtsaXN0SWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBjcmVhdGUobGlzdElkOiBzdHJpbmcsIGZpbGU6IGFueSk6IFByb21pc2U8Q3JlYXRlZE11bHRpcGxlVmFsaWRhdGlvbkpvYj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgL3Y0L2FkZHJlc3MvdmFsaWRhdGUvYnVsay8ke2xpc3RJZH1gLCBmaWxlKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGRlc3Ryb3kobGlzdElkOiBzdHJpbmcpOiBQcm9taXNlPENhbmNlbGVkTXVsdGlwbGVWYWxpZGF0aW9uSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsvJHtsaXN0SWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBOb2RlRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJztcbmltcG9ydCAqIGFzIGJhc2U2NCBmcm9tICdiYXNlLTY0JztcbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCBreSBmcm9tICdreS11bml2ZXJzYWwnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IFJlcXVlc3RPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9SZXF1ZXN0T3B0aW9ucyc7XG5pbXBvcnQgQVBJRXJyb3JPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9BUElFcnJvck9wdGlvbnMnO1xuaW1wb3J0IHsgSW5wdXRGb3JtRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JRm9ybURhdGEnO1xuaW1wb3J0IEFQSVJlc3BvbnNlIGZyb20gJy4vaW50ZXJmYWNlcy9BcGlSZXNwb25zZSc7XG5cbmNvbnN0IGlzU3RyZWFtID0gKGRhdGE6IGFueSkgPT4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBkYXRhLnBpcGUgPT09ICdmdW5jdGlvbic7XG5cbmZ1bmN0aW9uIGlzTm9kZUZvcm1EYXRhKGZvcm1EYXRhSW5zdGFuY2U6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhKVxuICA6IGZvcm1EYXRhSW5zdGFuY2UgaXMgTm9kZUZvcm1EYXRhIHtcbiAgcmV0dXJuICg8Tm9kZUZvcm1EYXRhPmZvcm1EYXRhSW5zdGFuY2UpLmdldEhlYWRlcnMgIT09IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZ2V0QXR0YWNobWVudE9wdGlvbnMgPSAoaXRlbTogYW55KToge1xuICBmaWxlbmFtZT86IHN0cmluZyxcbiAgY29udGVudFR5cGU/OiBzdHJpbmcsXG4gIGtub3duTGVuZ3RoPzogbnVtYmVyXG59ID0+IHtcbiAgaWYgKHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyB8fCBpc1N0cmVhbShpdGVtKSkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IHtcbiAgICBmaWxlbmFtZSxcbiAgICBjb250ZW50VHlwZSxcbiAgICBrbm93bkxlbmd0aFxuICB9ID0gaXRlbTtcblxuICByZXR1cm4ge1xuICAgIC4uLihmaWxlbmFtZSA/IHsgZmlsZW5hbWUgfSA6IHsgZmlsZW5hbWU6ICdmaWxlJyB9KSxcbiAgICAuLi4oY29udGVudFR5cGUgJiYgeyBjb250ZW50VHlwZSB9KSxcbiAgICAuLi4oa25vd25MZW5ndGggJiYgeyBrbm93bkxlbmd0aCB9KVxuICB9O1xufTtcblxuY29uc3Qgc3RyZWFtVG9TdHJpbmcgPSAoc3RyZWFtOiBhbnkpID0+IHtcbiAgY29uc3QgY2h1bmtzOiBhbnkgPSBbXTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bms6IGFueSkgPT4gY2h1bmtzLnB1c2goY2h1bmspKTtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGY4JykpKTtcbiAgfSk7XG59O1xuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGtleTogc3RyaW5nO1xuICBwcml2YXRlIHVybDogc3RyaW5nO1xuICBwcml2YXRlIHRpbWVvdXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWFkZXJzOiBhbnk7XG4gIHByaXZhdGUgRm9ybURhdGFDb25zdHJ1Y3RvcjogSW5wdXRGb3JtRGF0YTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgZm9ybURhdGE6IElucHV0Rm9ybURhdGEpIHtcbiAgICB0aGlzLnVzZXJuYW1lID0gb3B0aW9ucy51c2VybmFtZTtcbiAgICB0aGlzLmtleSA9IG9wdGlvbnMua2V5O1xuICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmwgYXMgc3RyaW5nO1xuICAgIHRoaXMudGltZW91dCA9IG9wdGlvbnMudGltZW91dDtcbiAgICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307XG4gICAgdGhpcy5Gb3JtRGF0YUNvbnN0cnVjdG9yID0gZm9ybURhdGE7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgaW5wdXRPcHRpb25zPzogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmlucHV0T3B0aW9ucyB9O1xuICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0LmVuY29kZShgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMua2V5fWApO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY31gLFxuICAgICAgLi4udGhpcy5oZWFkZXJzLFxuICAgICAgLi4ub3B0aW9ucz8uaGVhZGVyc1xuICAgIH07XG5cbiAgICBkZWxldGUgb3B0aW9ucz8uaGVhZGVycztcblxuICAgIGlmICghaGVhZGVyc1snQ29udGVudC1UeXBlJ10pIHtcbiAgICAgIC8vIGZvciBmb3JtLWRhdGEgaXQgd2lsbCBiZSBOdWxsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIGl0XG4gICAgICBkZWxldGUgaGVhZGVyc1snQ29udGVudC1UeXBlJ107XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0geyAuLi5vcHRpb25zIH07XG5cbiAgICBpZiAob3B0aW9ucz8ucXVlcnkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob3B0aW9ucz8ucXVlcnkpLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtcy5zZWFyY2hQYXJhbXMgPSBvcHRpb25zLnF1ZXJ5O1xuICAgICAgZGVsZXRlIHBhcmFtcy5xdWVyeTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGt5KFxuICAgICAgdXJsam9pbih0aGlzLnVybCwgdXJsKSxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBtZXRob2QudG9Mb2NhbGVVcHBlckNhc2UoKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogdGhpcy50aW1lb3V0LFxuICAgICAgICAuLi5wYXJhbXNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKCFyZXNwb25zZT8ub2spIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNwb25zZT8uYm9keSAmJiBpc1N0cmVhbShyZXNwb25zZS5ib2R5KVxuICAgICAgICA/IGF3YWl0IHN0cmVhbVRvU3RyaW5nKHJlc3BvbnNlLmJvZHkpXG4gICAgICAgIDogYXdhaXQgcmVzcG9uc2U/Lmpzb24oKTtcblxuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZT8uc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZT8uc3RhdHVzVGV4dCxcbiAgICAgICAgYm9keTogeyBtZXNzYWdlIH1cbiAgICAgIH0gYXMgQVBJRXJyb3JPcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldFJlc3BvbnNlQm9keShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHJlcyBhcyBBUElSZXNwb25zZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVzcG9uc2VCb2R5KHJlc3BvbnNlOiBhbnkpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0ge1xuICAgICAgYm9keToge30sXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlPy5zdGF0dXNcbiAgICB9IGFzIEFQSVJlc3BvbnNlO1xuICAgIGxldCByZXNwb25zZVN0cmluZyA9ICcnO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZVN0cmluZyA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIGNvbnN0IGpzb25Cb2R5ID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICByZXMuYm9keSA9IGpzb25Cb2R5O1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgcmVzLnN0YXR1cyA9IDQwMDtcbiAgICAgIHJlcy5ib2R5ID0ge1xuICAgICAgICBtZXNzYWdlOiByZXNwb25zZVN0cmluZyxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnk6IGFueSwgb3B0aW9ucz86IGFueSkgOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXRob2QsIHVybCwgeyBxdWVyeSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIGNvbW1hbmQobWV0aG9kOiBzdHJpbmcsIHVybDogc3RyaW5nLCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnkpIDogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWV0aG9kLCB1cmwsIHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KHVybDogc3RyaW5nLCBxdWVyeT86IGFueSwgb3B0aW9ucz86IGFueSkgOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnkoJ2dldCcsIHVybCwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgaGVhZCh1cmw6IHN0cmluZywgcXVlcnk6IGFueSwgb3B0aW9uczogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnaGVhZCcsIHVybCwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgb3B0aW9ucyh1cmw6IHN0cmluZywgcXVlcnk6IGFueSwgb3B0aW9uczogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnb3B0aW9ucycsIHVybCwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgcG9zdCh1cmw6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zPzogYW55KSA6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwb3N0JywgdXJsLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIHBvc3RXaXRoRkQodXJsOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgZGF0YSBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiBudWxsIH1cbiAgICB9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5jcmVhdGVGb3JtRGF0YShkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwb3N0JywgdXJsLCBmb3JtRGF0YSwgcGFyYW1zKTtcbiAgfVxuXG4gIHB1dFdpdGhGRCh1cmw6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBkYXRhIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IG51bGwgfVxuICAgIH07XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmNyZWF0ZUZvcm1EYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3B1dCcsIHVybCwgZm9ybURhdGEsIHBhcmFtcyk7XG4gIH1cblxuICBwYXRjaFdpdGhGRCh1cmw6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBkYXRhIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IG51bGwgfVxuICAgIH07XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmNyZWF0ZUZvcm1EYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3BhdGNoJywgdXJsLCBmb3JtRGF0YSwgcGFyYW1zKTtcbiAgfVxuXG4gIGNyZWF0ZUZvcm1EYXRhKGRhdGE6IGFueSk6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhIHtcbiAgICBjb25zdCBmb3JtRGF0YTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBkYXRhW2tleV07IH0pXG4gICAgICAucmVkdWNlKChmb3JtRGF0YUFjYzogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5cyA9IFsnYXR0YWNobWVudCcsICdpbmxpbmUnLCAnZmlsZSddO1xuICAgICAgICBpZiAoZmlsZUtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuYWRkRmlsZXNUb0ZEKGtleSwgZGF0YVtrZXldLCBmb3JtRGF0YUFjYyk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ21lc3NhZ2UnKSB7IC8vIG1pbWUgbWVzc2FnZVxuICAgICAgICAgIHRoaXMuYWRkTWltZURhdGFUb0ZEKGtleSwgZGF0YVtrZXldLCBmb3JtRGF0YUFjYyk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb21tb25Qcm9wZXJ0eVRvRkQoa2V5LCBkYXRhW2tleV0sIGZvcm1EYXRhQWNjKTtcbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgfSwgbmV3IHRoaXMuRm9ybURhdGFDb25zdHJ1Y3RvcigpKTtcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxuICBwcml2YXRlIGFkZE1pbWVEYXRhVG9GRChcbiAgICBrZXk6IHN0cmluZyxcbiAgICBkYXRhOiBCdWZmZXIgfCBCbG9iLFxuICAgIGZvcm1EYXRhSW5zdGFuY2U6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhXG4gICk6IHZvaWQge1xuICAgIGlmIChpc05vZGVGb3JtRGF0YShmb3JtRGF0YUluc3RhbmNlKSkge1xuICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgICBmb3JtRGF0YUluc3RhbmNlLmFwcGVuZChrZXksIGRhdGEsIHsgZmlsZW5hbWU6ICdNaW1lTWVzc2FnZScgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1EYXRhSW5zdGFuY2UuYXBwZW5kKGtleSwgZGF0YSBhcyBCbG9iLCAnTWltZU1lc3NhZ2UnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEZpbGVzVG9GRChcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIGZvcm1EYXRhSW5zdGFuY2U6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGFwcGVuZEZpbGVUb0ZEID0gKFxuICAgICAga2V5OiBzdHJpbmcsXG4gICAgICBvYmo6IGFueSxcbiAgICAgIGZvcm1EYXRhOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YVxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaXNTdHJlYW1EYXRhID0gaXNTdHJlYW0ob2JqKTtcbiAgICAgIGNvbnN0IG9iakRhdGEgPSBpc1N0cmVhbURhdGEgPyBvYmogOiBvYmouZGF0YTtcbiAgICAgIC8vIGdldEF0dGFjaG1lbnRPcHRpb25zIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBvYmogcGFyYW1ldGVyIHRvIHByZXZlbnQgbG9vc2luZyBmaWxlbmFtZVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldEF0dGFjaG1lbnRPcHRpb25zKG9iaik7XG4gICAgICBpZiAoaXNOb2RlRm9ybURhdGEoZm9ybURhdGEpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9iakRhdGEsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpEYXRhLCBvcHRpb25zLmZpbGVuYW1lKTtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGFwcGVuZEZpbGVUb0ZEKHByb3BlcnR5TmFtZSwgaXRlbSwgZm9ybURhdGFJbnN0YW5jZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kRmlsZVRvRkQocHJvcGVydHlOYW1lLCB2YWx1ZSwgZm9ybURhdGFJbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb21tb25Qcm9wZXJ0eVRvRkQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmb3JtRGF0YUFjYzogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgZm9ybURhdGFBY2MuYXBwZW5kKGtleSwgaXRlbSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGZvcm1EYXRhQWNjLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwdXQodXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwdXQnLCB1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcGF0Y2godXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kKCdwYXRjaCcsIHVybCwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGUodXJsOiBzdHJpbmcsIGRhdGE/OiBhbnksIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCgnZGVsZXRlJywgdXJsLCBkYXRhLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiaW1wb3J0IHtcbiAgQ3JlYXRlVXBkYXRlUm91dGVEYXRhLCBEZXN0cm95Um91dGVSZXNwb25zZSwgUm91dGUsIFJvdXRlc0xpc3RRdWVyeSwgVXBkYXRlUm91dGVSZXNwb25zZVxufSBmcm9tICcuL2ludGVyZmFjZXMvcm91dGVzJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlc0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBsaXN0KHF1ZXJ5OiBSb3V0ZXNMaXN0UXVlcnkpOiBQcm9taXNlPFJvdXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL3JvdXRlcycsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lml0ZW1zKTtcbiAgfVxuXG4gIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxSb3V0ZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAvdjMvcm91dGVzLyR7aWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5yb3V0ZSk7XG4gIH1cblxuICBjcmVhdGUoZGF0YTogQ3JlYXRlVXBkYXRlUm91dGVEYXRhKTogUHJvbWlzZTxSb3V0ZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCgnL3YzL3JvdXRlcycsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkucm91dGUpO1xuICB9XG5cbiAgdXBkYXRlKGlkOiBzdHJpbmcsIGRhdGE6IENyZWF0ZVVwZGF0ZVJvdXRlRGF0YSk6IFByb21pc2U8VXBkYXRlUm91dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKGAvdjMvcm91dGVzLyR7aWR9YCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cblxuICBkZXN0cm95KGlkOiBzdHJpbmcpOiBQcm9taXNlPERlc3Ryb3lSb3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92My9yb3V0ZXMvJHtpZH1gKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7IFN0YXRzUXVlcnksIFN0YXRzT3B0aW9ucywgU3RhdCB9IGZyb20gJy4vaW50ZXJmYWNlcy9TdGF0c09wdGlvbnMnO1xuXG5jbGFzcyBTdGF0cyB7XG4gIHN0YXJ0OiBEYXRlO1xuICBlbmQ6IERhdGU7XG4gIHJlc29sdXRpb246IHN0cmluZztcbiAgc3RhdHM6IFN0YXRbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTdGF0c09wdGlvbnMpIHtcbiAgICB0aGlzLnN0YXJ0ID0gbmV3IERhdGUoZGF0YS5zdGFydCk7XG4gICAgdGhpcy5lbmQgPSBuZXcgRGF0ZShkYXRhLmVuZCk7XG4gICAgdGhpcy5yZXNvbHV0aW9uID0gZGF0YS5yZXNvbHV0aW9uO1xuICAgIHRoaXMuc3RhdHMgPSBkYXRhLnN0YXRzLm1hcChmdW5jdGlvbiAoc3RhdDogU3RhdCkge1xuICAgICAgY29uc3QgcmVzID0geyAuLi5zdGF0IH07XG4gICAgICByZXMudGltZSA9IG5ldyBEYXRlKHN0YXQudGltZSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRzQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVNlYXJjaFBhcmFtcyhxdWVyeTogU3RhdHNRdWVyeSB8IHVuZGVmaW5lZCk6IEFycmF5PEFycmF5PHN0cmluZz4+IHtcbiAgICBsZXQgc2VhcmNoUGFyYW1zID0gW10gYXMgQXJyYXk8QXJyYXk8c3RyaW5nPj47XG4gICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCkge1xuICAgICAgc2VhcmNoUGFyYW1zID0gT2JqZWN0LmVudHJpZXMocXVlcnkpLnJlZHVjZSgoYXJyYXlXaXRoUGFpcnMsIGN1cnJlbnRQYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGN1cnJlbnRQYWlyO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVwZWF0ZWRQcm9wZXJ0eSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gW2tleSwgaXRlbV0pO1xuICAgICAgICAgIHJldHVybiBbLi4uYXJyYXlXaXRoUGFpcnMsIC4uLnJlcGVhdGVkUHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIGFycmF5V2l0aFBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgcmV0dXJuIGFycmF5V2l0aFBhaXJzO1xuICAgICAgfSwgW10gYXMgQXJyYXk8QXJyYXk8c3RyaW5nPj4pO1xuICAgIH1cblxuICAgIHJldHVybiBzZWFyY2hQYXJhbXM7XG4gIH1cblxuICBfcGFyc2VTdGF0cyhyZXNwb25zZTogeyBib2R5OiBTdGF0c09wdGlvbnMgfSk6IFN0YXRzIHtcbiAgICByZXR1cm4gbmV3IFN0YXRzKHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgZ2V0RG9tYWluKGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IFN0YXRzUXVlcnkpOiBQcm9taXNlPFN0YXRzPiB7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdGhpcy5wcmVwYXJlU2VhcmNoUGFyYW1zKHF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMnLCBkb21haW4sICdzdGF0cy90b3RhbCcpLCBzZWFyY2hQYXJhbXMpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVN0YXRzKTtcbiAgfVxuXG4gIGdldEFjY291bnQocXVlcnk/OiBTdGF0c1F1ZXJ5KTogUHJvbWlzZTxTdGF0cz4ge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHRoaXMucHJlcGFyZVNlYXJjaFBhcmFtcyhxdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92My9zdGF0cy90b3RhbCcsIHNlYXJjaFBhcmFtcylcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlU3RhdHMpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIEJvdW5jZURhdGEsXG4gIENvbXBsYWludERhdGEsXG4gIFBhZ2VzTGlzdCxcbiAgUGFnZXNMaXN0QWNjdW11bGF0b3IsXG4gIFBhcnNlZFBhZ2UsXG4gIFBhcnNlZFBhZ2VzTGlzdCxcbiAgU3VwcHJlc3Npb25DcmVhdGlvbkRhdGEsXG4gIFN1cHByZXNzaW9uQ3JlYXRpb25SZXNwb25zZSxcbiAgU3VwcHJlc3Npb25DcmVhdGlvblJlc3VsdCxcbiAgU3VwcHJlc3Npb25EZXN0cm95UmVzcG9uc2UsXG4gIFN1cHByZXNzaW9uRGVzdHJveVJlc3VsdCxcbiAgU3VwcHJlc3Npb25MaXN0LFxuICBTdXBwcmVzc2lvbkxpc3RRdWVyeSxcbiAgU3VwcHJlc3Npb25MaXN0UmVzcG9uc2UsXG4gIFN1cHByZXNzaW9uTW9kZWxzLFxuICBTdXBwcmVzc2lvblJlc3BvbnNlLFxuICBVbnN1YnNjcmliZURhdGEsXG4gIFdoaXRlTGlzdERhdGEsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9TdXByZXNzaW9ucyc7XG5pbXBvcnQgQVBJRXJyb3IgZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgQVBJRXJyb3JPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9BUElFcnJvck9wdGlvbnMnO1xuXG5jb25zdCBjcmVhdGVPcHRpb25zID0ge1xuICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxufTtcbmV4cG9ydCBjbGFzcyBTdXBwcmVzc2lvbiB7XG4gIHR5cGU6IHN0cmluZztcbiAgY29uc3RydWN0b3IodHlwZTogU3VwcHJlc3Npb25Nb2RlbHMpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG59XG5leHBvcnQgY2xhc3MgQm91bmNlIGV4dGVuZHMgU3VwcHJlc3Npb24ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvZGU6IG51bWJlcjtcbiAgZXJyb3I6IHN0cmluZztcbiAgY3JlYXRlZF9hdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBCb3VuY2VEYXRhKSB7XG4gICAgc3VwZXIoU3VwcHJlc3Npb25Nb2RlbHMuQk9VTkNFUyk7XG4gICAgdGhpcy5hZGRyZXNzID0gZGF0YS5hZGRyZXNzO1xuICAgIHRoaXMuY29kZSA9ICtkYXRhLmNvZGU7XG4gICAgdGhpcy5lcnJvciA9IGRhdGEuZXJyb3I7XG4gICAgdGhpcy5jcmVhdGVkX2F0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkX2F0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcGxhaW50IGV4dGVuZHMgU3VwcHJlc3Npb24ge1xuICBhZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNyZWF0ZWRfYXQ6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogQ29tcGxhaW50RGF0YSkge1xuICAgIHN1cGVyKFN1cHByZXNzaW9uTW9kZWxzLkNPTVBMQUlOVFMpO1xuICAgIHRoaXMuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcztcbiAgICB0aGlzLmNyZWF0ZWRfYXQgPSBuZXcgRGF0ZShkYXRhLmNyZWF0ZWRfYXQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbnN1YnNjcmliZSBleHRlbmRzIFN1cHByZXNzaW9uIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZF9hdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBVbnN1YnNjcmliZURhdGEpIHtcbiAgICBzdXBlcihTdXBwcmVzc2lvbk1vZGVscy5VTlNVQlNDUklCRVMpO1xuICAgIHRoaXMuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcztcbiAgICB0aGlzLnRhZ3MgPSBkYXRhLnRhZ3M7XG4gICAgdGhpcy5jcmVhdGVkX2F0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkX2F0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hpdGVMaXN0IGV4dGVuZHMgU3VwcHJlc3Npb24ge1xuICB2YWx1ZTogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFdoaXRlTGlzdERhdGEpIHtcbiAgICBzdXBlcihTdXBwcmVzc2lvbk1vZGVscy5XSElURUxJU1RTKTtcbiAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZTtcbiAgICB0aGlzLnJlYXNvbiA9IGRhdGEucmVhc29uO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkQXQpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cHByZXNzaW9uQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcbiAgbW9kZWxzOiBNYXA8c3RyaW5nLCBhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubW9kZWxzLnNldCgnYm91bmNlcycsIEJvdW5jZSk7XG4gICAgdGhpcy5tb2RlbHMuc2V0KCdjb21wbGFpbnRzJywgQ29tcGxhaW50KTtcbiAgICB0aGlzLm1vZGVscy5zZXQoJ3Vuc3Vic2NyaWJlcycsIFVuc3Vic2NyaWJlKTtcbiAgICB0aGlzLm1vZGVscy5zZXQoJ3doaXRlbGlzdHMnLCBXaGl0ZUxpc3QpO1xuICB9XG5cbiAgX3BhcnNlUGFnZShpZDogc3RyaW5nLCBwYWdlVXJsOiBzdHJpbmcpIDogUGFyc2VkUGFnZSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChwYWdlVXJsKTtcbiAgICBjb25zdCB7IHNlYXJjaFBhcmFtcyB9ID0gcGFyc2VkVXJsO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIHBhZ2U6IHNlYXJjaFBhcmFtcy5oYXMoJ3BhZ2UnKSA/IHNlYXJjaFBhcmFtcy5nZXQoJ3BhZ2UnKSA6IHVuZGVmaW5lZCxcbiAgICAgIGFkZHJlc3M6IHNlYXJjaFBhcmFtcy5oYXMoJ2FkZHJlc3MnKSA/IHNlYXJjaFBhcmFtcy5nZXQoJ2FkZHJlc3MnKSA6IHVuZGVmaW5lZCxcbiAgICAgIHVybDogcGFnZVVybFxuICAgIH07XG4gIH1cblxuICBfcGFyc2VQYWdlTGlua3MocmVzcG9uc2U6IFN1cHByZXNzaW9uTGlzdFJlc3BvbnNlKTogUGFyc2VkUGFnZXNMaXN0IHtcbiAgICBjb25zdCBwYWdlcyA9IE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmJvZHkucGFnaW5nIGFzIFBhZ2VzTGlzdCk7XG4gICAgcmV0dXJuIHBhZ2VzLnJlZHVjZShcbiAgICAgIChhY2M6IFBhZ2VzTGlzdEFjY3VtdWxhdG9yLCBwYWlyOiBbcGFnZVVybDogc3RyaW5nLCBpZDogc3RyaW5nXSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHBhaXJbMF07XG4gICAgICAgIGNvbnN0IHBhZ2VVcmwgPSBwYWlyWzFdO1xuICAgICAgICBhY2NbaWRdID0gdGhpcy5fcGFyc2VQYWdlKGlkLCBwYWdlVXJsKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9XG4gICAgKSBhcyB1bmtub3duIGFzIFBhcnNlZFBhZ2VzTGlzdDtcbiAgfVxuXG4gIF9wYXJzZUxpc3QoXG4gICAgcmVzcG9uc2U6IFN1cHByZXNzaW9uTGlzdFJlc3BvbnNlLFxuICAgIE1vZGVsOiB7XG4gICAgICBuZXcoZGF0YTogQm91bmNlRGF0YSB8IENvbXBsYWludERhdGEgfCBVbnN1YnNjcmliZURhdGEgfCBXaGl0ZUxpc3REYXRhKTpcbiAgICAgIEJvdW5jZSB8IENvbXBsYWludCB8IFVuc3Vic2NyaWJlIHwgV2hpdGVMaXN0XG4gICAgfVxuICApOiBTdXBwcmVzc2lvbkxpc3Qge1xuICAgIGNvbnN0IGRhdGEgPSB7fSBhcyBTdXBwcmVzc2lvbkxpc3Q7XG4gICAgZGF0YS5pdGVtcyA9IHJlc3BvbnNlLmJvZHkuaXRlbXMubWFwKChpdGVtKSA9PiBuZXcgTW9kZWwoaXRlbSkpO1xuXG4gICAgZGF0YS5wYWdlcyA9IHRoaXMuX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgX3BhcnNlSXRlbTxUIGV4dGVuZHMgU3VwcHJlc3Npb24+KFxuICAgIGRhdGEgOiBCb3VuY2VEYXRhIHwgQ29tcGxhaW50RGF0YSB8IFVuc3Vic2NyaWJlRGF0YSB8IFdoaXRlTGlzdERhdGEsXG4gICAgTW9kZWw6IHtcbiAgICAgIG5ldyhkYXRhOiBCb3VuY2VEYXRhIHwgQ29tcGxhaW50RGF0YSB8IFVuc3Vic2NyaWJlRGF0YSB8IFdoaXRlTGlzdERhdGEpOlxuICAgICAgVFxuICAgIH1cbiAgKTogVCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbChkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV2hpdGVMaXN0KFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIGRhdGE6IFN1cHByZXNzaW9uQ3JlYXRpb25EYXRhIHwgU3VwcHJlc3Npb25DcmVhdGlvbkRhdGFbXVxuICApOiBQcm9taXNlPFN1cHByZXNzaW9uQ3JlYXRpb25SZXN1bHQ+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHtcbiAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgIHN0YXR1c1RleHQ6ICdEYXRhIHByb3BlcnR5IHNob3VsZCBiZSBhbiBvYmplY3QnLFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbWVzc2FnZTogJ1doaXRlbGlzdFxcJ3MgY3JlYXRpb24gcHJvY2VzcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGNyZWF0aW9ucy4gRGF0YSBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gb2JqZWN0J1xuICAgICAgICB9XG4gICAgICB9IGFzIEFQSUVycm9yT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5wb3N0V2l0aEZEKHVybGpvaW4oJ3YzJywgZG9tYWluLCAnd2hpdGVsaXN0cycpLCBkYXRhKVxuICAgICAgLnRoZW4odGhpcy5wcmVwYXJlUmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm1vZGVscy5oYXModHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcih7XG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICBzdGF0dXNUZXh0OiAnVW5rbm93biB0eXBlIHZhbHVlJyxcbiAgICAgICAgYm9keTogeyBtZXNzYWdlOiAnVHlwZSBtYXkgYmUgb25seSBvbmUgb2YgW2JvdW5jZXMsIGNvbXBsYWludHMsIHVuc3Vic2NyaWJlcywgd2hpdGVsaXN0c10nIH1cbiAgICAgIH0gYXMgQVBJRXJyb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVSZXNwb25zZShyZXNwb25zZTogU3VwcHJlc3Npb25DcmVhdGlvblJlc3BvbnNlKTogU3VwcHJlc3Npb25DcmVhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZSxcbiAgICAgIHR5cGU6IHJlc3BvbnNlLmJvZHkudHlwZSB8fCAnJyxcbiAgICAgIHZhbHVlOiByZXNwb25zZS5ib2R5LnZhbHVlIHx8ICcnLFxuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXNcbiAgICB9O1xuICB9XG5cbiAgbGlzdChcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBTdXBwcmVzc2lvbkxpc3RRdWVyeVxuICApOiBQcm9taXNlPFN1cHByZXNzaW9uTGlzdD4ge1xuICAgIHRoaXMuY2hlY2tUeXBlKHR5cGUpO1xuXG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscy5nZXQodHlwZSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFxuICAgICAgLmdldCh1cmxqb2luKCd2MycsIGRvbWFpbiwgdHlwZSksIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBTdXBwcmVzc2lvbkxpc3RSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VMaXN0KHJlc3BvbnNlLCBtb2RlbCkpO1xuICB9XG5cbiAgZ2V0KFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCb3VuY2UgfCBDb21wbGFpbnQgfCBVbnN1YnNjcmliZSB8IFdoaXRlTGlzdD4ge1xuICAgIHRoaXMuY2hlY2tUeXBlKHR5cGUpO1xuXG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscy5nZXQodHlwZSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFxuICAgICAgLmdldCh1cmxqb2luKCd2MycsIGRvbWFpbiwgdHlwZSwgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogU3VwcHJlc3Npb25SZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VJdGVtPHR5cGVvZiBtb2RlbD4ocmVzcG9uc2UuYm9keSwgbW9kZWwpKTtcbiAgfVxuXG4gIGNyZWF0ZShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgZGF0YTogU3VwcHJlc3Npb25DcmVhdGlvbkRhdGEgfCBTdXBwcmVzc2lvbkNyZWF0aW9uRGF0YVtdXG4gICk6IFByb21pc2U8U3VwcHJlc3Npb25DcmVhdGlvblJlc3VsdD4ge1xuICAgIHRoaXMuY2hlY2tUeXBlKHR5cGUpO1xuICAgIC8vIHN1cHBvcnRzIGFkZGluZyBtdWx0aXBsZSBzdXBwcmVzc2lvbnMgYnkgZGVmYXVsdFxuICAgIGxldCBwb3N0RGF0YTtcbiAgICBpZiAodHlwZSA9PT0gJ3doaXRlbGlzdHMnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXaGl0ZUxpc3QoZG9tYWluLCBkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHBvc3REYXRhID0gW2RhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0RGF0YSA9IFsuLi5kYXRhXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0XG4gICAgICAucG9zdCh1cmxqb2luKCd2MycsIGRvbWFpbiwgdHlwZSksIEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSwgY3JlYXRlT3B0aW9ucylcbiAgICAgIC50aGVuKHRoaXMucHJlcGFyZVJlc3BvbnNlKTtcbiAgfVxuXG4gIGRlc3Ryb3koXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGFkZHJlc3M6IHN0cmluZ1xuICApOiBQcm9taXNlPFN1cHByZXNzaW9uRGVzdHJveVJlc3VsdD4ge1xuICAgIHRoaXMuY2hlY2tUeXBlKHR5cGUpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5kZWxldGUodXJsam9pbigndjMnLCBkb21haW4sIHR5cGUsIGVuY29kZVVSSUNvbXBvbmVudChhZGRyZXNzKSkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IFN1cHByZXNzaW9uRGVzdHJveVJlc3BvbnNlKSA9PiAoe1xuICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIHZhbHVlOiByZXNwb25zZS5ib2R5LnZhbHVlIHx8ICcnLFxuICAgICAgICBhZGRyZXNzOiByZXNwb25zZS5ib2R5LmFkZHJlc3MgfHwgJycsXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICB9KSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdXBwcmVzc2lvbkNsaWVudDtcbiIsImltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IHsgSU11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9NdWx0aXBsZVZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlc3VsdCwgVmFsaWRhdGlvblJlc3BvbnNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL1ZhbGlkYXRlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRlQ2xpZW50IHtcbiAgcHVibGljIG11bHRpcGxlVmFsaWRhdGlvbjtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0LCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQ6IElNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMubXVsdGlwbGVWYWxpZGF0aW9uID0gbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50O1xuICB9XG5cbiAgZ2V0KGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjQvYWRkcmVzcy92YWxpZGF0ZScsIHsgYWRkcmVzcyB9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlIDogQVBJUmVzcG9uc2UpID0+IHJlc3BvbnNlKVxuICAgICAgLnRoZW4oKHJlcyA6IFZhbGlkYXRpb25SZXNwb25zZSkgPT4gcmVzLmJvZHkgYXMgVmFsaWRhdGlvblJlc3VsdCk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcblxuaW1wb3J0IHtcbiAgVmFsaWRhdGlvblJlc3BvbnNlLFxuICBXZWJob29rTGlzdCxcbiAgV2ViaG9va1Jlc3BvbnNlLFxuICBXZWJob29rc0lkcyxcbiAgV2ViaG9va3NRdWVyeVxufSBmcm9tICcuL2ludGVyZmFjZXMvV2ViaG9va3MnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuY2xhc3MgV2ViaG9vayB7XG4gIGlkOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIHVybDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgX3BhcnNlV2ViaG9va0xpc3QocmVzcG9uc2U6IHsgYm9keTogeyB3ZWJob29rczogV2ViaG9va0xpc3QgfSB9KTogV2ViaG9va0xpc3Qge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5LndlYmhvb2tzO1xuICB9XG5cbiAgX3BhcnNlV2ViaG9va1dpdGhJRChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXNwb25zZTogV2ViaG9va1Jlc3BvbnNlKTogV2ViaG9vayB7XG4gICAgICBjb25zdCB3ZWJob29rUmVzcG9uc2UgPSByZXNwb25zZT8uYm9keT8ud2ViaG9vaztcbiAgICAgIGxldCB1cmwgPSB3ZWJob29rUmVzcG9uc2U/LnVybDtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHVybCA9IHdlYmhvb2tSZXNwb25zZT8udXJscyAmJiB3ZWJob29rUmVzcG9uc2UudXJscy5sZW5ndGhcbiAgICAgICAgICA/IHdlYmhvb2tSZXNwb25zZS51cmxzWzBdXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFdlYmhvb2soaWQsIHVybCk7XG4gICAgfTtcbiAgfVxuXG4gIF9wYXJzZVdlYmhvb2tUZXN0KHJlc3BvbnNlOiB7IGJvZHk6IHsgY29kZTogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcgfSB9KVxuICA6IHtjb2RlOiBudW1iZXIsIG1lc3NhZ2U6c3RyaW5nfSB7XG4gICAgcmV0dXJuIHsgY29kZTogcmVzcG9uc2UuYm9keS5jb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UgfSBhcyBWYWxpZGF0aW9uUmVzcG9uc2U7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeTogV2ViaG9va3NRdWVyeSk6IFByb21pc2U8V2ViaG9va0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJyksIHF1ZXJ5KVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rTGlzdCk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcsIGlkOiBXZWJob29rc0lkcyk6IFByb21pc2U8V2ViaG9vaz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnLCBpZCkpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tXaXRoSUQoaWQpKTtcbiAgfVxuXG4gIGNyZWF0ZShkb21haW46IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHVybDogc3RyaW5nLFxuICAgIHRlc3QgPSBmYWxzZSk6IFByb21pc2U8V2ViaG9vayB8IFZhbGlkYXRpb25SZXNwb25zZT4ge1xuICAgIGlmICh0ZXN0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJywgaWQsICd0ZXN0JyksIHsgdXJsIH0pXG4gICAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1Rlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJyksIHsgaWQsIHVybCB9KVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rV2l0aElEKGlkKSk7XG4gIH1cblxuICB1cGRhdGUoZG9tYWluOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHVybDogc3RyaW5nKTogUHJvbWlzZTxXZWJob29rPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd3ZWJob29rcycsIGlkKSwgeyB1cmwgfSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1dpdGhJRChpZCkpO1xuICB9XG5cbiAgZGVzdHJveShkb21haW46IHN0cmluZywgaWQ6IHN0cmluZykgOiBQcm9taXNlPFdlYmhvb2s+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJywgaWQpKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rV2l0aElEKGlkKSk7XG4gIH1cbn1cbiIsIi8qISBodHRwczovL210aHMuYmUvYmFzZTY0IHYxLjAuMCBieSBAbWF0aGlhcyB8IE1JVCBsaWNlbnNlICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgYGV4cG9ydHNgLlxuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLlxuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0bW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMgJiYgbW9kdWxlO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgLCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUsIGFuZCB1c2Vcblx0Ly8gaXQgYXMgYHJvb3RgLlxuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHwgZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdHZhciBJbnZhbGlkQ2hhcmFjdGVyRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0fTtcblx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcjtcblx0SW52YWxpZENoYXJhY3RlckVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0ludmFsaWRDaGFyYWN0ZXJFcnJvcic7XG5cblx0dmFyIGVycm9yID0gZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdC8vIE5vdGU6IHRoZSBlcnJvciBtZXNzYWdlcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBmaWxlIG1hdGNoIHRob3NlIHVzZWQgYnlcblx0XHQvLyB0aGUgbmF0aXZlIGBhdG9iYC9gYnRvYWAgaW1wbGVtZW50YXRpb24gaW4gQ2hyb21pdW0uXG5cdFx0dGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFcnJvcihtZXNzYWdlKTtcblx0fTtcblxuXHR2YXIgVEFCTEUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cdC8vIGh0dHA6Ly93aGF0d2cub3JnL2h0bWwvY29tbW9uLW1pY3Jvc3ludGF4ZXMuaHRtbCNzcGFjZS1jaGFyYWN0ZXJcblx0dmFyIFJFR0VYX1NQQUNFX0NIQVJBQ1RFUlMgPSAvW1xcdFxcblxcZlxcciBdL2c7XG5cblx0Ly8gYGRlY29kZWAgaXMgZGVzaWduZWQgdG8gYmUgZnVsbHkgY29tcGF0aWJsZSB3aXRoIGBhdG9iYCBhcyBkZXNjcmliZWQgaW4gdGhlXG5cdC8vIEhUTUwgU3RhbmRhcmQuIGh0dHA6Ly93aGF0d2cub3JnL2h0bWwvd2ViYXBwYXBpcy5odG1sI2RvbS13aW5kb3diYXNlNjQtYXRvYlxuXHQvLyBUaGUgb3B0aW1pemVkIGJhc2U2NC1kZWNvZGluZyBhbGdvcml0aG0gdXNlZCBpcyBiYXNlZCBvbiBAYXRr4oCZcyBleGNlbGxlbnRcblx0Ly8gaW1wbGVtZW50YXRpb24uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2F0ay8xMDIwMzk2XG5cdHZhciBkZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRcdGlucHV0ID0gU3RyaW5nKGlucHV0KVxuXHRcdFx0LnJlcGxhY2UoUkVHRVhfU1BBQ0VfQ0hBUkFDVEVSUywgJycpO1xuXHRcdHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cdFx0aWYgKGxlbmd0aCAlIDQgPT0gMCkge1xuXHRcdFx0aW5wdXQgPSBpbnB1dC5yZXBsYWNlKC89PT8kLywgJycpO1xuXHRcdFx0bGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRsZW5ndGggJSA0ID09IDEgfHxcblx0XHRcdC8vIGh0dHA6Ly93aGF0d2cub3JnL0MjYWxwaGFudW1lcmljLWFzY2lpLWNoYXJhY3RlcnNcblx0XHRcdC9bXithLXpBLVowLTkvXS8udGVzdChpbnB1dClcblx0XHQpIHtcblx0XHRcdGVycm9yKFxuXHRcdFx0XHQnSW52YWxpZCBjaGFyYWN0ZXI6IHRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuJ1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0dmFyIGJpdENvdW50ZXIgPSAwO1xuXHRcdHZhciBiaXRTdG9yYWdlO1xuXHRcdHZhciBidWZmZXI7XG5cdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdHZhciBwb3NpdGlvbiA9IC0xO1xuXHRcdHdoaWxlICgrK3Bvc2l0aW9uIDwgbGVuZ3RoKSB7XG5cdFx0XHRidWZmZXIgPSBUQUJMRS5pbmRleE9mKGlucHV0LmNoYXJBdChwb3NpdGlvbikpO1xuXHRcdFx0Yml0U3RvcmFnZSA9IGJpdENvdW50ZXIgJSA0ID8gYml0U3RvcmFnZSAqIDY0ICsgYnVmZmVyIDogYnVmZmVyO1xuXHRcdFx0Ly8gVW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXAgb2YgNCBjaGFyYWN0ZXJz4oCmXG5cdFx0XHRpZiAoYml0Q291bnRlcisrICUgNCkge1xuXHRcdFx0XHQvLyDigKZjb252ZXJ0IHRoZSBmaXJzdCA4IGJpdHMgdG8gYSBzaW5nbGUgQVNDSUkgY2hhcmFjdGVyLlxuXHRcdFx0XHRvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0XHRcdFx0XHQweEZGICYgYml0U3RvcmFnZSA+PiAoLTIgKiBiaXRDb3VudGVyICYgNilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fTtcblxuXHQvLyBgZW5jb2RlYCBpcyBkZXNpZ25lZCB0byBiZSBmdWxseSBjb21wYXRpYmxlIHdpdGggYGJ0b2FgIGFzIGRlc2NyaWJlZCBpbiB0aGVcblx0Ly8gSFRNTCBTdGFuZGFyZDogaHR0cDovL3doYXR3Zy5vcmcvaHRtbC93ZWJhcHBhcGlzLmh0bWwjZG9tLXdpbmRvd2Jhc2U2NC1idG9hXG5cdHZhciBlbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRcdGlucHV0ID0gU3RyaW5nKGlucHV0KTtcblx0XHRpZiAoL1teXFwwLVxceEZGXS8udGVzdChpbnB1dCkpIHtcblx0XHRcdC8vIE5vdGU6IG5vIG5lZWQgdG8gc3BlY2lhbC1jYXNlIGFzdHJhbCBzeW1ib2xzIGhlcmUsIGFzIHN1cnJvZ2F0ZXMgYXJlXG5cdFx0XHQvLyBtYXRjaGVkLCBhbmQgdGhlIGlucHV0IGlzIHN1cHBvc2VkIHRvIG9ubHkgY29udGFpbiBBU0NJSSBhbnl3YXkuXG5cdFx0XHRlcnJvcihcblx0XHRcdFx0J1RoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZCBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUgb2YgdGhlICcgK1xuXHRcdFx0XHQnTGF0aW4xIHJhbmdlLidcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHZhciBwYWRkaW5nID0gaW5wdXQubGVuZ3RoICUgMztcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0dmFyIHBvc2l0aW9uID0gLTE7XG5cdFx0dmFyIGE7XG5cdFx0dmFyIGI7XG5cdFx0dmFyIGM7XG5cdFx0dmFyIGJ1ZmZlcjtcblx0XHQvLyBNYWtlIHN1cmUgYW55IHBhZGRpbmcgaXMgaGFuZGxlZCBvdXRzaWRlIG9mIHRoZSBsb29wLlxuXHRcdHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGggLSBwYWRkaW5nO1xuXG5cdFx0d2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHtcblx0XHRcdC8vIFJlYWQgdGhyZWUgYnl0ZXMsIGkuZS4gMjQgYml0cy5cblx0XHRcdGEgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKSA8PCAxNjtcblx0XHRcdGIgPSBpbnB1dC5jaGFyQ29kZUF0KCsrcG9zaXRpb24pIDw8IDg7XG5cdFx0XHRjID0gaW5wdXQuY2hhckNvZGVBdCgrK3Bvc2l0aW9uKTtcblx0XHRcdGJ1ZmZlciA9IGEgKyBiICsgYztcblx0XHRcdC8vIFR1cm4gdGhlIDI0IGJpdHMgaW50byBmb3VyIGNodW5rcyBvZiA2IGJpdHMgZWFjaCwgYW5kIGFwcGVuZCB0aGVcblx0XHRcdC8vIG1hdGNoaW5nIGNoYXJhY3RlciBmb3IgZWFjaCBvZiB0aGVtIHRvIHRoZSBvdXRwdXQuXG5cdFx0XHRvdXRwdXQgKz0gKFxuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDE4ICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDEyICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDYgJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgJiAweDNGKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocGFkZGluZyA9PSAyKSB7XG5cdFx0XHRhID0gaW5wdXQuY2hhckNvZGVBdChwb3NpdGlvbikgPDwgODtcblx0XHRcdGIgPSBpbnB1dC5jaGFyQ29kZUF0KCsrcG9zaXRpb24pO1xuXHRcdFx0YnVmZmVyID0gYSArIGI7XG5cdFx0XHRvdXRwdXQgKz0gKFxuXHRcdFx0XHRUQUJMRS5jaGFyQXQoYnVmZmVyID4+IDEwKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdCgoYnVmZmVyID4+IDQpICYgMHgzRikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoKGJ1ZmZlciA8PCAyKSAmIDB4M0YpICtcblx0XHRcdFx0Jz0nXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAocGFkZGluZyA9PSAxKSB7XG5cdFx0XHRidWZmZXIgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcblx0XHRcdG91dHB1dCArPSAoXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMikgK1xuXHRcdFx0XHRUQUJMRS5jaGFyQXQoKGJ1ZmZlciA8PCA0KSAmIDB4M0YpICtcblx0XHRcdFx0Jz09J1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9O1xuXG5cdHZhciBiYXNlNjQgPSB7XG5cdFx0J2VuY29kZSc6IGVuY29kZSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCd2ZXJzaW9uJzogJzEuMC4wJ1xuXHR9O1xuXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGJhc2U2NDtcblx0XHR9KTtcblx0fVx0ZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgIWZyZWVFeHBvcnRzLm5vZGVUeXBlKSB7XG5cdFx0aWYgKGZyZWVNb2R1bGUpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IGJhc2U2NDtcblx0XHR9IGVsc2UgeyAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yICh2YXIga2V5IGluIGJhc2U2NCkge1xuXHRcdFx0XHRiYXNlNjQuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IGJhc2U2NFtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7IC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LmJhc2U2NCA9IGJhc2U2NDtcblx0fVxuXG59KHRoaXMpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBSZXR1cm5zIGEgYEJ1ZmZlcmAgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBVUkkgYHVyaWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBEYXRhIFVSSSB0byB0dXJuIGludG8gYSBCdWZmZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0J1ZmZlcn0gQnVmZmVyIGluc3RhbmNlIGZyb20gRGF0YSBVUklcbiAqIEBhcGkgcHVibGljXG4gKi9cbmZ1bmN0aW9uIGRhdGFVcmlUb0J1ZmZlcih1cmkpIHtcbiAgICBpZiAoIS9eZGF0YTovaS50ZXN0KHVyaSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYHVyaWAgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgRGF0YSBVUkkgKG11c3QgYmVnaW4gd2l0aCBcImRhdGE6XCIpJyk7XG4gICAgfVxuICAgIC8vIHN0cmlwIG5ld2xpbmVzXG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL1xccj9cXG4vZywgJycpO1xuICAgIC8vIHNwbGl0IHRoZSBVUkkgdXAgaW50byB0aGUgXCJtZXRhZGF0YVwiIGFuZCB0aGUgXCJkYXRhXCIgcG9ydGlvbnNcbiAgICBjb25zdCBmaXJzdENvbW1hID0gdXJpLmluZGV4T2YoJywnKTtcbiAgICBpZiAoZmlyc3RDb21tYSA9PT0gLTEgfHwgZmlyc3RDb21tYSA8PSA0KSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGZvcm1lZCBkYXRhOiBVUkknKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHRoZSBcImRhdGE6XCIgc2NoZW1lIGFuZCBwYXJzZSB0aGUgbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhID0gdXJpLnN1YnN0cmluZyg1LCBmaXJzdENvbW1hKS5zcGxpdCgnOycpO1xuICAgIGxldCBjaGFyc2V0ID0gJyc7XG4gICAgbGV0IGJhc2U2NCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGUgPSBtZXRhWzBdIHx8ICd0ZXh0L3BsYWluJztcbiAgICBsZXQgdHlwZUZ1bGwgPSB0eXBlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWV0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWV0YVtpXSA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgICAgICAgIGJhc2U2NCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0eXBlRnVsbCArPSBgOyR7bWV0YVtpXX1gO1xuICAgICAgICAgICAgaWYgKG1ldGFbaV0uaW5kZXhPZignY2hhcnNldD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBtZXRhW2ldLnN1YnN0cmluZyg4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkZWZhdWx0cyB0byBVUy1BU0NJSSBvbmx5IGlmIHR5cGUgaXMgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFtZXRhWzBdICYmICFjaGFyc2V0Lmxlbmd0aCkge1xuICAgICAgICB0eXBlRnVsbCArPSAnO2NoYXJzZXQ9VVMtQVNDSUknO1xuICAgICAgICBjaGFyc2V0ID0gJ1VTLUFTQ0lJJztcbiAgICB9XG4gICAgLy8gZ2V0IHRoZSBlbmNvZGVkIGRhdGEgcG9ydGlvbiBhbmQgZGVjb2RlIFVSSS1lbmNvZGVkIGNoYXJzXG4gICAgY29uc3QgZW5jb2RpbmcgPSBiYXNlNjQgPyAnYmFzZTY0JyA6ICdhc2NpaSc7XG4gICAgY29uc3QgZGF0YSA9IHVuZXNjYXBlKHVyaS5zdWJzdHJpbmcoZmlyc3RDb21tYSArIDEpKTtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhLCBlbmNvZGluZyk7XG4gICAgLy8gc2V0IGAudHlwZWAgYW5kIGAudHlwZUZ1bGxgIHByb3BlcnRpZXMgdG8gTUlNRSB0eXBlXG4gICAgYnVmZmVyLnR5cGUgPSB0eXBlO1xuICAgIGJ1ZmZlci50eXBlRnVsbCA9IHR5cGVGdWxsO1xuICAgIC8vIHNldCB0aGUgYC5jaGFyc2V0YCBwcm9wZXJ0eVxuICAgIGJ1ZmZlci5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBkYXRhVXJpVG9CdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIEBhdXRob3IgVG9ydSBOYWdhc2hpbWEgPGh0dHBzOi8vZ2l0aHViLmNvbS9teXN0aWNhdGVhPlxuICogQGNvcHlyaWdodCAyMDE1IFRvcnUgTmFnYXNoaW1hLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpdmF0ZURhdGFcbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge3t0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnRQaGFzZSBUaGUgY3VycmVudCBldmVudCBwaGFzZS5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBUaGUgY3VycmVudCBldmVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNhbmNlbGVkIFRoZSBmbGFnIHRvIHByZXZlbnQgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbW1lZGlhdGVTdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBUaGUgbGlzdGVuZXIgaWYgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaXMgcGFzc2l2ZS4gT3RoZXJ3aXNlIHRoaXMgaXMgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lU3RhbXAgVGhlIHVuaXggdGltZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBQcml2YXRlIGRhdGEgZm9yIGV2ZW50IHdyYXBwZXJzLlxuICogQHR5cGUge1dlYWtNYXA8RXZlbnQsIFByaXZhdGVEYXRhPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHByaXZhdGVEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDYWNoZSBmb3Igd3JhcHBlciBjbGFzc2VzLlxuICogQHR5cGUge1dlYWtNYXA8T2JqZWN0LCBGdW5jdGlvbj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB3cmFwcGVycyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogR2V0IHByaXZhdGUgZGF0YS5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCBvYmplY3QgdG8gZ2V0IHByaXZhdGUgZGF0YS5cbiAqIEByZXR1cm5zIHtQcml2YXRlRGF0YX0gVGhlIHByaXZhdGUgZGF0YSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwZChldmVudCkge1xuICAgIGNvbnN0IHJldHYgPSBwcml2YXRlRGF0YS5nZXQoZXZlbnQpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICByZXR2ICE9IG51bGwsXG4gICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50IG9iamVjdCwgYnV0IGdvdFwiLFxuICAgICAgICBldmVudFxuICAgICk7XG4gICAgcmV0dXJuIHJldHZcbn1cblxuLyoqXG4gKiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI3NldC10aGUtY2FuY2VsZWQtZmxhZ1xuICogQHBhcmFtIGRhdGEge1ByaXZhdGVEYXRhfSBwcml2YXRlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHNldENhbmNlbEZsYWcoZGF0YSkge1xuICAgIGlmIChkYXRhLnBhc3NpdmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuYWJsZSB0byBwcmV2ZW50RGVmYXVsdCBpbnNpZGUgcGFzc2l2ZSBldmVudCBsaXN0ZW5lciBpbnZvY2F0aW9uLlwiLFxuICAgICAgICAgICAgICAgIGRhdGEucGFzc2l2ZUxpc3RlbmVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIWRhdGEuZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkYXRhLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtZXZlbnRcbiAqIEBwcml2YXRlXG4gKi9cbi8qKlxuICogVGhlIGV2ZW50IHdyYXBwZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIHByaXZhdGVEYXRhLnNldCh0aGlzLCB7XG4gICAgICAgIGV2ZW50VGFyZ2V0LFxuICAgICAgICBldmVudCxcbiAgICAgICAgZXZlbnRQaGFzZTogMixcbiAgICAgICAgY3VycmVudFRhcmdldDogZXZlbnRUYXJnZXQsXG4gICAgICAgIGNhbmNlbGVkOiBmYWxzZSxcbiAgICAgICAgc3RvcHBlZDogZmFsc2UsXG4gICAgICAgIGltbWVkaWF0ZVN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBwYXNzaXZlTGlzdGVuZXI6IG51bGwsXG4gICAgICAgIHRpbWVTdGFtcDogZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCksXG4gICAgfSk7XG5cbiAgICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNVbmZvcmdlYWJsZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVHJ1c3RlZFwiLCB7IHZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudC50eXBlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtFdmVudFRhcmdldFtdfSBUaGUgY29tcG9zZWQgcGF0aCBvZiB0aGlzIGV2ZW50LlxuICAgICAqL1xuICAgIGNvbXBvc2VkUGF0aCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBkKHRoaXMpLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY3VycmVudFRhcmdldF1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgTk9ORS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBOT05FKCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBDQVBUVVJJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQ0FQVFVSSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBBVF9UQVJHRVQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQVRfVEFSR0VUKCkge1xuICAgICAgICByZXR1cm4gMlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBCVUJCTElOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBCVUJCTElOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDNcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGV2ZW50UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFBoYXNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgZGF0YS5pbW1lZGlhdGVTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBidWJibGVzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5idWJibGVzKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjYW5jZWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjYW5jZWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jYW5jZWxhYmxlKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhpcyBldmVudC5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNvbXBvc2VkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBjb21wb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY29tcG9zZWQpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bml4IHRpbWUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB0aW1lU3RhbXAoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS50aW1lU3RhbXBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBzcmNFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gc3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCBjYW5jZWxCdWJibGUoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5zdG9wcGVkXG4gICAgfSxcbiAgICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGdldCByZXR1cm5WYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICFwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG4gICAgc2V0IHJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhpcyBldmVudCBvYmplY3QuIEJ1dCBkbyBub3RoaW5nIHVuZGVyIGV2ZW50IGRpc3BhdGNoaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGJ1YmJsZSB1cC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5jZWxhYmxlPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBjYW5jZWwuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbml0RXZlbnQoKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRgIGlzIGB0cnVlYC5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnQucHJvdG90eXBlKTtcblxuICAgIC8vIE1ha2UgYXNzb2NpYXRpb24gZm9yIHdyYXBwZXJzLlxuICAgIHdyYXBwZXJzLnNldCh3aW5kb3cuRXZlbnQucHJvdG90eXBlLCBFdmVudCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IGEgZ2l2ZW4gcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCB0aGUgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50W2tleV1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBwZCh0aGlzKS5ldmVudFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgYSBnaXZlbiBtZXRob2QgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFByb3BlcnR5IG5hbWUgdG8gZGVmaW5lIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIHRoZSBtZXRob2QgcHJvcGVydHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcGQodGhpcykuZXZlbnQ7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRba2V5XS5hcHBseShldmVudCwgYXJndW1lbnRzKVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBuZXcgd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IEJhc2VFdmVudCBUaGUgYmFzZSB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgZGVmaW5lZCB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lV3JhcHBlcihCYXNlRXZlbnQsIHByb3RvKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3RvKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJhc2VFdmVudFxuICAgIH1cblxuICAgIC8qKiBDdXN0b21FdmVudCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgICAgICBCYXNlRXZlbnQuY2FsbCh0aGlzLCBldmVudFRhcmdldCwgZXZlbnQpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogQ3VzdG9tRXZlbnQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSBhY2Nlc3NvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiBCYXNlRXZlbnQucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBpc0Z1bmMgPSB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgaXNGdW5jXG4gICAgICAgICAgICAgICAgICAgID8gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgICAgICAgICA6IGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50XG59XG5cbi8qKlxuICogR2V0IHRoZSB3cmFwcGVyIGNsYXNzIG9mIGEgZ2l2ZW4gcHJvdG90eXBlLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBwcm90b3R5cGUgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGdldCBpdHMgd3JhcHBlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyKHByb3RvKSB7XG4gICAgaWYgKHByb3RvID09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXIgPSB3cmFwcGVycy5nZXQocHJvdG8pO1xuICAgIGlmICh3cmFwcGVyID09IG51bGwpIHtcbiAgICAgICAgd3JhcHBlciA9IGRlZmluZVdyYXBwZXIoZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKSwgcHJvdG8pO1xuICAgICAgICB3cmFwcGVycy5zZXQocHJvdG8sIHdyYXBwZXIpO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlclxufVxuXG4vKipcbiAqIFdyYXAgYSBnaXZlbiBldmVudCB0byBtYW5hZ2VtZW50IGEgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RXZlbnR9IFRoZSB3cmFwcGVyIGluc3RhbmNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gd3JhcEV2ZW50KGV2ZW50VGFyZ2V0LCBldmVudCkge1xuICAgIGNvbnN0IFdyYXBwZXIgPSBnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihldmVudCkpO1xuICAgIHJldHVybiBuZXcgV3JhcHBlcihldmVudFRhcmdldCwgZXZlbnQpXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbW1lZGlhdGVTdG9wcGVkIGZsYWcgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3RvcHBlZChldmVudCkge1xuICAgIHJldHVybiBwZChldmVudCkuaW1tZWRpYXRlU3RvcHBlZFxufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBldmVudCBwaGFzZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBldmVudFBoYXNlIE5ldyBldmVudCBwaGFzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnRQaGFzZShldmVudCwgZXZlbnRQaGFzZSkge1xuICAgIHBkKGV2ZW50KS5ldmVudFBoYXNlID0gZXZlbnRQaGFzZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IE5ldyBjdXJyZW50IHRhcmdldC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0Q3VycmVudFRhcmdldChldmVudCwgY3VycmVudFRhcmdldCkge1xuICAgIHBkKGV2ZW50KS5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbn1cblxuLyoqXG4gKiBTZXQgYSBwYXNzaXZlIGxpc3RlbmVyIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgTmV3IHBhc3NpdmUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldFBhc3NpdmVMaXN0ZW5lcihldmVudCwgcGFzc2l2ZUxpc3RlbmVyKSB7XG4gICAgcGQoZXZlbnQpLnBhc3NpdmVMaXN0ZW5lciA9IHBhc3NpdmVMaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcHJvcGVydHkgezF8MnwzfSBsaXN0ZW5lclR5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFzc2l2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmNlXG4gKiBAcHJvcGVydHkge0xpc3RlbmVyTm9kZXxudWxsfSBuZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+Pn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGxpc3RlbmVyc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8vIExpc3RlbmVyIHR5cGVzXG5jb25zdCBDQVBUVVJFID0gMTtcbmNvbnN0IEJVQkJMRSA9IDI7XG5jb25zdCBBVFRSSUJVVEUgPSAzO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogQHBhcmFtIHthbnl9IHggVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG59XG5cbi8qKlxuICogR2V0IGxpc3RlbmVycy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgdG8gZ2V0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT59IFRoZSBsaXN0ZW5lcnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZXZlbnRUYXJnZXQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50VGFyZ2V0KTtcbiAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIFwiJ3RoaXMnIGlzIGV4cGVjdGVkIGFuIEV2ZW50VGFyZ2V0IG9iamVjdCwgYnV0IGdvdCBhbm90aGVyIHZhbHVlLlwiXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RlbmVyc1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIGV2ZW50IGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBnZXQgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuXG4gICAgICAgIHNldChsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcblxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgcmVtb3Zpbmcgb2xkIHZhbHVlLlxuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclR5cGU6IEFUVFJJQlVURSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIERlZmluZSBhbiBldmVudCBhdHRyaWJ1dGUgKGUuZy4gYGV2ZW50VGFyZ2V0Lm9uY2xpY2tgKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFRhcmdldFByb3RvdHlwZSBUaGUgZXZlbnQgdGFyZ2V0IHByb3RvdHlwZSB0byBkZWZpbmUgYW4gZXZlbnQgYXR0cmJpdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGRlZmluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZShldmVudFRhcmdldFByb3RvdHlwZSwgZXZlbnROYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBldmVudFRhcmdldFByb3RvdHlwZSxcbiAgICAgICAgYG9uJHtldmVudE5hbWV9YCxcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yKGV2ZW50TmFtZSlcbiAgICApO1xufVxuXG4vKipcbiAqIERlZmluZSBhIGN1c3RvbSBFdmVudFRhcmdldCB3aXRoIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudE5hbWVzIEV2ZW50IG5hbWVzIGZvciBldmVudCBhdHRyaWJ1dGVzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgY3VzdG9tIEV2ZW50VGFyZ2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoZXZlbnROYW1lcykge1xuICAgIC8qKiBDdXN0b21FdmVudFRhcmdldCAqL1xuICAgIGZ1bmN0aW9uIEN1c3RvbUV2ZW50VGFyZ2V0KCkge1xuICAgICAgICBFdmVudFRhcmdldC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogQ3VzdG9tRXZlbnRUYXJnZXQsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZShDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUsIGV2ZW50TmFtZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFRhcmdldFxufVxuXG4vKipcbiAqIEV2ZW50VGFyZ2V0LlxuICpcbiAqIC0gVGhpcyBpcyBjb25zdHJ1Y3RvciBpZiBubyBhcmd1bWVudHMuXG4gKiAtIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgQ3VzdG9tRXZlbnRUYXJnZXQgY29uc3RydWN0b3IgaWYgdGhlcmUgYXJlIGFyZ3VtZW50cy5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgY2xhc3MgQSBleHRlbmRzIEV2ZW50VGFyZ2V0IHt9XG4gKiAgICAgY2xhc3MgQiBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiKSB7fVxuICogICAgIGNsYXNzIEMgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIiwgXCJlcnJvclwiKSB7fVxuICogICAgIGNsYXNzIEQgZXh0ZW5kcyBFdmVudFRhcmdldChbXCJtZXNzYWdlXCIsIFwiZXJyb3JcIl0pIHt9XG4gKi9cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIGxpc3RlbmVyc01hcC5zZXQodGhpcywgbmV3IE1hcCgpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoYXJndW1lbnRzWzBdKVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQodHlwZXMpXG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIilcbiAgICAvKmVzbGludC1lbmFibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbn1cblxuLy8gU2hvdWxkIGJlIGVudW1lcmFibGUsIGJ1dCBjbGFzcyBtZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZS5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBnaXZlbiBsaXN0ZW5lciB0byB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidsaXN0ZW5lcicgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zSXNPYmogPSBpc09iamVjdChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IG9wdGlvbnNJc09ialxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgIGxpc3RlbmVyVHlwZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSksXG4gICAgICAgICAgICBvbmNlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgaXQgYXMgdGhlIGZpcnN0IG5vZGUgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbnVsbC5cbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdG8gdGhlIHRhaWwgd2hpbGUgY2hlY2tpbmcgZHVwbGljYXRpb24uLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBpZ25vcmUgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaXQuXG4gICAgICAgIHByZXYubmV4dCA9IG5ld05vZGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKVxuICAgICAgICAgICAgPyBCb29sZWFuKG9wdGlvbnMuY2FwdHVyZSlcbiAgICAgICAgICAgIDogQm9vbGVhbihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJUeXBlID0gY2FwdHVyZSA/IENBUFRVUkUgOiBCVUJCTEU7XG5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGdpdmVuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR8e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgZmFsc2VgIGlmIGNhbmNlbGVkLlxuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09IG51bGwgfHwgdHlwZW9mIGV2ZW50LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXZlbnQudHlwZVwiIHNob3VsZCBiZSBhIHN0cmluZy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnQudHlwZTtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSB3ZSBjYW5ub3QgcmV3cml0ZSBzZXZlcmFsIHByb3BlcnRpZXMsIHNvIHdyYXAgb2JqZWN0LlxuICAgICAgICBjb25zdCB3cmFwcGVkRXZlbnQgPSB3cmFwRXZlbnQodGhpcywgZXZlbnQpO1xuXG4gICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgIC8vIFRoaXMgaXNuJ3QgcGFydGljaXBhdGluZyBpbiBhIHRyZWUuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGlzdGVuZXIgaWYgaXQncyBvbmNlXG4gICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBub2RlLm5leHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzaXZlID8gbm9kZS5saXN0ZW5lciA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUubGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuY2FsbCh0aGlzLCB3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgIT09IEFUVFJJQlVURSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQod3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgaWYgYGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgd2FzIGNhbGxlZC5cbiAgICAgICAgICAgIGlmIChpc1N0b3BwZWQod3JhcHBlZEV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKHdyYXBwZWRFdmVudCwgbnVsbCk7XG4gICAgICAgIHNldEV2ZW50UGhhc2Uod3JhcHBlZEV2ZW50LCAwKTtcbiAgICAgICAgc2V0Q3VycmVudFRhcmdldCh3cmFwcGVkRXZlbnQsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiAhd3JhcHBlZEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudFRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudFRhcmdldGAgaXMgYHRydWVgLlxuaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2Ygd2luZG93LkV2ZW50VGFyZ2V0ICE9PSBcInVuZGVmaW5lZFwiXG4pIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRXZlbnRUYXJnZXQucHJvdG90eXBlLCB3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlKTtcbn1cblxuZXhwb3J0cy5kZWZpbmVFdmVudEF0dHJpYnV0ZSA9IGRlZmluZUV2ZW50QXR0cmlidXRlO1xuZXhwb3J0cy5FdmVudFRhcmdldCA9IEV2ZW50VGFyZ2V0O1xuZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnRUYXJnZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRUYXJnZXRcbm1vZHVsZS5leHBvcnRzLkV2ZW50VGFyZ2V0ID0gbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gRXZlbnRUYXJnZXRcbm1vZHVsZS5leHBvcnRzLmRlZmluZUV2ZW50QXR0cmlidXRlID0gZGVmaW5lRXZlbnRBdHRyaWJ1dGVcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LXRhcmdldC1zaGltLmpzLm1hcFxuIiwiY29uc3Qge1JlYWRhYmxlfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPEJsb2IsIHt0eXBlOiBzdHJpbmcsIHNpemU6IG51bWJlciwgcGFydHM6IChCbG9iIHwgQnVmZmVyKVtdIH0+fVxuICovXG5jb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG5cbmFzeW5jIGZ1bmN0aW9uICogcmVhZChwYXJ0cykge1xuXHRmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcblx0XHRpZiAoJ3N0cmVhbScgaW4gcGFydCkge1xuXHRcdFx0eWllbGQgKiBwYXJ0LnN0cmVhbSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR5aWVsZCBwYXJ0O1xuXHRcdH1cblx0fVxufVxuXG5jbGFzcyBCbG9iIHtcblx0LyoqXG5cdCAqIFRoZSBCbG9iKCkgY29uc3RydWN0b3IgcmV0dXJucyBhIG5ldyBCbG9iIG9iamVjdC4gVGhlIGNvbnRlbnRcblx0ICogb2YgdGhlIGJsb2IgY29uc2lzdHMgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHZhbHVlcyBnaXZlblxuXHQgKiBpbiB0aGUgcGFyYW1ldGVyIGFycmF5LlxuXHQgKlxuXHQgKiBAcGFyYW0geyhBcnJheUJ1ZmZlckxpa2UgfCBBcnJheUJ1ZmZlclZpZXcgfCBCbG9iIHwgQnVmZmVyIHwgc3RyaW5nKVtdfSBibG9iUGFydHNcblx0ICogQHBhcmFtIHt7IHR5cGU/OiBzdHJpbmcgfX0gW29wdGlvbnNdXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihibG9iUGFydHMgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0bGV0IHNpemUgPSAwO1xuXG5cdFx0Y29uc3QgcGFydHMgPSBibG9iUGFydHMubWFwKGVsZW1lbnQgPT4ge1xuXHRcdFx0bGV0IGJ1ZmZlcjtcblx0XHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnVmZmVyKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnQ7XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhlbGVtZW50KSkge1xuXHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShlbGVtZW50LmJ1ZmZlciwgZWxlbWVudC5ieXRlT2Zmc2V0LCBlbGVtZW50LmJ5dGVMZW5ndGgpO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcblx0XHRcdFx0YnVmZmVyID0gQnVmZmVyLmZyb20oZWxlbWVudCk7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCbG9iKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbSh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBlbGVtZW50IDogU3RyaW5nKGVsZW1lbnQpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vZXhwbGljaXQtbGVuZ3RoLWNoZWNrXG5cdFx0XHRzaXplICs9IGJ1ZmZlci5sZW5ndGggfHwgYnVmZmVyLnNpemUgfHwgMDtcblx0XHRcdHJldHVybiBidWZmZXI7XG5cdFx0fSk7XG5cblx0XHRjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhvcHRpb25zLnR5cGUpLnRvTG93ZXJDYXNlKCk7XG5cblx0XHR3bS5zZXQodGhpcywge1xuXHRcdFx0dHlwZTogL1teXFx1MDAyMC1cXHUwMDdFXS8udGVzdCh0eXBlKSA/ICcnIDogdHlwZSxcblx0XHRcdHNpemUsXG5cdFx0XHRwYXJ0c1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCbG9iIGludGVyZmFjZSdzIHNpemUgcHJvcGVydHkgcmV0dXJucyB0aGVcblx0ICogc2l6ZSBvZiB0aGUgQmxvYiBpbiBieXRlcy5cblx0ICovXG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB3bS5nZXQodGhpcykuc2l6ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBwcm9wZXJ0eSBvZiBhIEJsb2Igb2JqZWN0IHJldHVybnMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdGdldCB0eXBlKCkge1xuXHRcdHJldHVybiB3bS5nZXQodGhpcykudHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdGV4dCgpIG1ldGhvZCBpbiB0aGUgQmxvYiBpbnRlcmZhY2UgcmV0dXJucyBhIFByb21pc2Vcblx0ICogdGhhdCByZXNvbHZlcyB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mXG5cdCAqIHRoZSBibG9iLCBpbnRlcnByZXRlZCBhcyBVVEYtOC5cblx0ICpcblx0ICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fVxuXHQgKi9cblx0YXN5bmMgdGV4dCgpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmZyb20oYXdhaXQgdGhpcy5hcnJheUJ1ZmZlcigpKS50b1N0cmluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCBpbiB0aGUgQmxvYiBpbnRlcmZhY2UgcmV0dXJucyBhXG5cdCAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvYiBhc1xuXHQgKiBiaW5hcnkgZGF0YSBjb250YWluZWQgaW4gYW4gQXJyYXlCdWZmZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fVxuXHQgKi9cblx0YXN5bmMgYXJyYXlCdWZmZXIoKSB7XG5cdFx0Y29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuc2l6ZSk7XG5cdFx0bGV0IG9mZnNldCA9IDA7XG5cdFx0Zm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiB0aGlzLnN0cmVhbSgpKSB7XG5cdFx0XHRkYXRhLnNldChjaHVuaywgb2Zmc2V0KTtcblx0XHRcdG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEuYnVmZmVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCbG9iIGludGVyZmFjZSdzIHN0cmVhbSgpIG1ldGhvZCBpcyBkaWZmZXJlbmNlIGZyb20gbmF0aXZlXG5cdCAqIGFuZCB1c2VzIG5vZGUgc3RyZWFtcyBpbnN0ZWFkIG9mIHdoYXR3ZyBzdHJlYW1zLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7UmVhZGFibGV9IE5vZGUgcmVhZGFibGUgc3RyZWFtXG5cdCAqL1xuXHRzdHJlYW0oKSB7XG5cdFx0cmV0dXJuIFJlYWRhYmxlLmZyb20ocmVhZCh3bS5nZXQodGhpcykucGFydHMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQmxvYiBpbnRlcmZhY2UncyBzbGljZSgpIG1ldGhvZCBjcmVhdGVzIGFuZCByZXR1cm5zIGFcblx0ICogbmV3IEJsb2Igb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGRhdGEgZnJvbSBhIHN1YnNldCBvZiB0aGVcblx0ICogYmxvYiBvbiB3aGljaCBpdCdzIGNhbGxlZC5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydF1cblx0ICogQHBhcmFtIHtudW1iZXJ9IFtlbmRdXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZV1cblx0ICovXG5cdHNsaWNlKHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5zaXplLCB0eXBlID0gJycpIHtcblx0XHRjb25zdCB7c2l6ZX0gPSB0aGlzO1xuXG5cdFx0bGV0IHJlbGF0aXZlU3RhcnQgPSBzdGFydCA8IDAgPyBNYXRoLm1heChzaXplICsgc3RhcnQsIDApIDogTWF0aC5taW4oc3RhcnQsIHNpemUpO1xuXHRcdGxldCByZWxhdGl2ZUVuZCA9IGVuZCA8IDAgPyBNYXRoLm1heChzaXplICsgZW5kLCAwKSA6IE1hdGgubWluKGVuZCwgc2l6ZSk7XG5cblx0XHRjb25zdCBzcGFuID0gTWF0aC5tYXgocmVsYXRpdmVFbmQgLSByZWxhdGl2ZVN0YXJ0LCAwKTtcblx0XHRjb25zdCBwYXJ0cyA9IHdtLmdldCh0aGlzKS5wYXJ0cy52YWx1ZXMoKTtcblx0XHRjb25zdCBibG9iUGFydHMgPSBbXTtcblx0XHRsZXQgYWRkZWQgPSAwO1xuXG5cdFx0Zm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG5cdFx0XHRjb25zdCBzaXplID0gQXJyYXlCdWZmZXIuaXNWaWV3KHBhcnQpID8gcGFydC5ieXRlTGVuZ3RoIDogcGFydC5zaXplO1xuXHRcdFx0aWYgKHJlbGF0aXZlU3RhcnQgJiYgc2l6ZSA8PSByZWxhdGl2ZVN0YXJ0KSB7XG5cdFx0XHRcdC8vIFNraXAgdGhlIGJlZ2lubmluZyBhbmQgY2hhbmdlIHRoZSByZWxhdGl2ZVxuXHRcdFx0XHQvLyBzdGFydCAmIGVuZCBwb3NpdGlvbiBhcyB3ZSBza2lwIHRoZSB1bndhbnRlZCBwYXJ0c1xuXHRcdFx0XHRyZWxhdGl2ZVN0YXJ0IC09IHNpemU7XG5cdFx0XHRcdHJlbGF0aXZlRW5kIC09IHNpemU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjaHVuayA9IHBhcnQuc2xpY2UocmVsYXRpdmVTdGFydCwgTWF0aC5taW4oc2l6ZSwgcmVsYXRpdmVFbmQpKTtcblx0XHRcdFx0YmxvYlBhcnRzLnB1c2goY2h1bmspO1xuXHRcdFx0XHRhZGRlZCArPSBBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspID8gY2h1bmsuYnl0ZUxlbmd0aCA6IGNodW5rLnNpemU7XG5cdFx0XHRcdHJlbGF0aXZlU3RhcnQgPSAwOyAvLyBBbGwgbmV4dCBzZXF1ZW50YWwgcGFydHMgc2hvdWxkIHN0YXJ0IGF0IDBcblxuXHRcdFx0XHQvLyBkb24ndCBhZGQgdGhlIG92ZXJmbG93IHRvIG5ldyBibG9iUGFydHNcblx0XHRcdFx0aWYgKGFkZGVkID49IHNwYW4pIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbXSwge3R5cGU6IFN0cmluZyh0eXBlKS50b0xvd2VyQ2FzZSgpfSk7XG5cdFx0T2JqZWN0LmFzc2lnbih3bS5nZXQoYmxvYiksIHtzaXplOiBzcGFuLCBwYXJ0czogYmxvYlBhcnRzfSk7XG5cblx0XHRyZXR1cm4gYmxvYjtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gJ0Jsb2InO1xuXHR9XG5cblx0c3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKG9iamVjdCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRvYmplY3QgJiZcblx0XHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0XHR0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0b2JqZWN0LnN0cmVhbS5sZW5ndGggPT09IDAgJiZcblx0XHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHRcdC9eKEJsb2J8RmlsZSkkLy50ZXN0KG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddKVxuXHRcdCk7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmxvYi5wcm90b3R5cGUsIHtcblx0c2l6ZToge2VudW1lcmFibGU6IHRydWV9LFxuXHR0eXBlOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHNsaWNlOiB7ZW51bWVyYWJsZTogdHJ1ZX1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJsb2I7XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBmZXRjaCA9IHJlcXVpcmUoJ25vZGUtZmV0Y2gnKTtcbmNvbnN0IEFib3J0Q29udHJvbGxlciA9IHJlcXVpcmUoJ2Fib3J0LWNvbnRyb2xsZXInKTtcblxuY29uc3QgVEVOX01FR0FCWVRFUyA9IDEwMDAgKiAxMDAwICogMTA7XG5cbmlmICghZ2xvYmFsLmZldGNoKSB7XG5cdGdsb2JhbC5mZXRjaCA9ICh1cmwsIG9wdGlvbnMpID0+IGZldGNoKHVybCwge2hpZ2hXYXRlck1hcms6IFRFTl9NRUdBQllURVMsIC4uLm9wdGlvbnN9KTtcbn1cblxuaWYgKCFnbG9iYWwuSGVhZGVycykge1xuXHRnbG9iYWwuSGVhZGVycyA9IGZldGNoLkhlYWRlcnM7XG59XG5cbmlmICghZ2xvYmFsLlJlcXVlc3QpIHtcblx0Z2xvYmFsLlJlcXVlc3QgPSBmZXRjaC5SZXF1ZXN0O1xufVxuXG5pZiAoIWdsb2JhbC5SZXNwb25zZSkge1xuXHRnbG9iYWwuUmVzcG9uc2UgPSBmZXRjaC5SZXNwb25zZTtcbn1cblxuaWYgKCFnbG9iYWwuQWJvcnRDb250cm9sbGVyKSB7XG5cdGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgPSBBYm9ydENvbnRyb2xsZXI7XG59XG5cbmlmICghZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSB7XG5cdHRyeSB7XG5cdFx0Z2xvYmFsLlJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnd2ViLXN0cmVhbXMtcG9seWZpbGwvcG9ueWZpbGwvZXMyMDE4Jyk7XG5cdH0gY2F0Y2ggKF8pIHt9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgna3kvdW1kJyk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuXHR0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG5cdChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5reSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuXHQvKiEgTUlUIExpY2Vuc2UgwqkgU2luZHJlIFNvcmh1cyAqL1xuXG5cdGNvbnN0IGdsb2JhbHMgPSB7fTtcblxuXHRjb25zdCBnZXRHbG9iYWwgPSBwcm9wZXJ0eSA9PiB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgJiYgcHJvcGVydHkgaW4gc2VsZikge1xuXHRcdFx0cmV0dXJuIHNlbGY7XG5cdFx0fVxuXG5cdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0XHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93ICYmIHByb3BlcnR5IGluIHdpbmRvdykge1xuXHRcdFx0cmV0dXJuIHdpbmRvdztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsICYmIHByb3BlcnR5IGluIGdsb2JhbCkge1xuXHRcdFx0cmV0dXJuIGdsb2JhbDtcblx0XHR9XG5cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykge1xuXHRcdFx0cmV0dXJuIGdsb2JhbFRoaXM7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IGdsb2JhbFByb3BlcnRpZXMgPSBbXG5cdFx0J0hlYWRlcnMnLFxuXHRcdCdSZXF1ZXN0Jyxcblx0XHQnUmVzcG9uc2UnLFxuXHRcdCdSZWFkYWJsZVN0cmVhbScsXG5cdFx0J2ZldGNoJyxcblx0XHQnQWJvcnRDb250cm9sbGVyJyxcblx0XHQnRm9ybURhdGEnXG5cdF07XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnbG9iYWxQcm9wZXJ0aWVzKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbHMsIHByb3BlcnR5LCB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE9iamVjdCA9IGdldEdsb2JhbChwcm9wZXJ0eSk7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gZ2xvYmFsT2JqZWN0ICYmIGdsb2JhbE9iamVjdFtwcm9wZXJ0eV07XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5iaW5kKGdsb2JhbE9iamVjdCkgOiB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IGlzT2JqZWN0ID0gdmFsdWUgPT4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcblx0Y29uc3Qgc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIgPSB0eXBlb2YgZ2xvYmFscy5BYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbic7XG5cdGNvbnN0IHN1cHBvcnRzU3RyZWFtcyA9IHR5cGVvZiBnbG9iYWxzLlJlYWRhYmxlU3RyZWFtID09PSAnZnVuY3Rpb24nO1xuXHRjb25zdCBzdXBwb3J0c0Zvcm1EYXRhID0gdHlwZW9mIGdsb2JhbHMuRm9ybURhdGEgPT09ICdmdW5jdGlvbic7XG5cblx0Y29uc3QgbWVyZ2VIZWFkZXJzID0gKHNvdXJjZTEsIHNvdXJjZTIpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgZ2xvYmFscy5IZWFkZXJzKHNvdXJjZTEgfHwge30pO1xuXHRcdGNvbnN0IGlzSGVhZGVyc0luc3RhbmNlID0gc291cmNlMiBpbnN0YW5jZW9mIGdsb2JhbHMuSGVhZGVycztcblx0XHRjb25zdCBzb3VyY2UgPSBuZXcgZ2xvYmFscy5IZWFkZXJzKHNvdXJjZTIgfHwge30pO1xuXG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc291cmNlKSB7XG5cdFx0XHRpZiAoKGlzSGVhZGVyc0luc3RhbmNlICYmIHZhbHVlID09PSAndW5kZWZpbmVkJykgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXN1bHQuZGVsZXRlKGtleSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQuc2V0KGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Y29uc3QgZGVlcE1lcmdlID0gKC4uLnNvdXJjZXMpID0+IHtcblx0XHRsZXQgcmV0dXJuVmFsdWUgPSB7fTtcblx0XHRsZXQgaGVhZGVycyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuXHRcdFx0XHRpZiAoIShBcnJheS5pc0FycmF5KHJldHVyblZhbHVlKSkpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuVmFsdWUgPSBbLi4ucmV0dXJuVmFsdWUsIC4uLnNvdXJjZV07XG5cdFx0XHR9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcblx0XHRcdFx0Zm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcblx0XHRcdFx0XHRpZiAoaXNPYmplY3QodmFsdWUpICYmIChrZXkgaW4gcmV0dXJuVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGRlZXBNZXJnZShyZXR1cm5WYWx1ZVtrZXldLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSB7Li4ucmV0dXJuVmFsdWUsIFtrZXldOiB2YWx1ZX07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNPYmplY3Qoc291cmNlLmhlYWRlcnMpKSB7XG5cdFx0XHRcdFx0aGVhZGVycyA9IG1lcmdlSGVhZGVycyhoZWFkZXJzLCBzb3VyY2UuaGVhZGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuVmFsdWUuaGVhZGVycyA9IGhlYWRlcnM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHR9O1xuXG5cdGNvbnN0IHJlcXVlc3RNZXRob2RzID0gW1xuXHRcdCdnZXQnLFxuXHRcdCdwb3N0Jyxcblx0XHQncHV0Jyxcblx0XHQncGF0Y2gnLFxuXHRcdCdoZWFkJyxcblx0XHQnZGVsZXRlJ1xuXHRdO1xuXG5cdGNvbnN0IHJlc3BvbnNlVHlwZXMgPSB7XG5cdFx0anNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuXHRcdHRleHQ6ICd0ZXh0LyonLFxuXHRcdGZvcm1EYXRhOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG5cdFx0YXJyYXlCdWZmZXI6ICcqLyonLFxuXHRcdGJsb2I6ICcqLyonXG5cdH07XG5cblx0Y29uc3QgcmV0cnlNZXRob2RzID0gW1xuXHRcdCdnZXQnLFxuXHRcdCdwdXQnLFxuXHRcdCdoZWFkJyxcblx0XHQnZGVsZXRlJyxcblx0XHQnb3B0aW9ucycsXG5cdFx0J3RyYWNlJ1xuXHRdO1xuXG5cdGNvbnN0IHJldHJ5U3RhdHVzQ29kZXMgPSBbXG5cdFx0NDA4LFxuXHRcdDQxMyxcblx0XHQ0MjksXG5cdFx0NTAwLFxuXHRcdDUwMixcblx0XHQ1MDMsXG5cdFx0NTA0XG5cdF07XG5cblx0Y29uc3QgcmV0cnlBZnRlclN0YXR1c0NvZGVzID0gW1xuXHRcdDQxMyxcblx0XHQ0MjksXG5cdFx0NTAzXG5cdF07XG5cblx0Y29uc3Qgc3RvcCA9IFN5bWJvbCgnc3RvcCcpO1xuXG5cdGNsYXNzIEhUVFBFcnJvciBleHRlbmRzIEVycm9yIHtcblx0XHRjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuXHRcdFx0Ly8gU2V0IHRoZSBtZXNzYWdlIHRvIHRoZSBzdGF0dXMgdGV4dCwgc3VjaCBhcyBVbmF1dGhvcml6ZWQsXG5cdFx0XHQvLyB3aXRoIHNvbWUgZmFsbGJhY2tzLiBUaGlzIG1lc3NhZ2Ugc2hvdWxkIG5ldmVyIGJlIHVuZGVmaW5lZC5cblx0XHRcdHN1cGVyKFxuXHRcdFx0XHRyZXNwb25zZS5zdGF0dXNUZXh0IHx8XG5cdFx0XHRcdFN0cmluZyhcblx0XHRcdFx0XHQocmVzcG9uc2Uuc3RhdHVzID09PSAwIHx8IHJlc3BvbnNlLnN0YXR1cykgP1xuXHRcdFx0XHRcdFx0cmVzcG9uc2Uuc3RhdHVzIDogJ1Vua25vd24gcmVzcG9uc2UgZXJyb3InXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLm5hbWUgPSAnSFRUUEVycm9yJztcblx0XHRcdHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcblx0XHR9XG5cdH1cblxuXHRjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdFx0Y29uc3RydWN0b3IocmVxdWVzdCkge1xuXHRcdFx0c3VwZXIoJ1JlcXVlc3QgdGltZWQgb3V0Jyk7XG5cdFx0XHR0aGlzLm5hbWUgPSAnVGltZW91dEVycm9yJztcblx0XHRcdHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgZGVsYXkgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcblxuXHQvLyBgUHJvbWlzZS5yYWNlKClgIHdvcmthcm91bmQgKCM5MSlcblx0Y29uc3QgdGltZW91dCA9IChyZXF1ZXN0LCBhYm9ydENvbnRyb2xsZXIsIG9wdGlvbnMpID0+XG5cdFx0bmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmIChhYm9ydENvbnRyb2xsZXIpIHtcblx0XHRcdFx0XHRhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlamVjdChuZXcgVGltZW91dEVycm9yKHJlcXVlc3QpKTtcblx0XHRcdH0sIG9wdGlvbnMudGltZW91dCk7XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW4gKi9cblx0XHRcdG9wdGlvbnMuZmV0Y2gocmVxdWVzdClcblx0XHRcdFx0LnRoZW4ocmVzb2x2ZSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdClcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0SUQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8qIGVzbGludC1lbmFibGUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlbiAqL1xuXHRcdH0pO1xuXG5cdGNvbnN0IG5vcm1hbGl6ZVJlcXVlc3RNZXRob2QgPSBpbnB1dCA9PiByZXF1ZXN0TWV0aG9kcy5pbmNsdWRlcyhpbnB1dCkgPyBpbnB1dC50b1VwcGVyQ2FzZSgpIDogaW5wdXQ7XG5cblx0Y29uc3QgZGVmYXVsdFJldHJ5T3B0aW9ucyA9IHtcblx0XHRsaW1pdDogMixcblx0XHRtZXRob2RzOiByZXRyeU1ldGhvZHMsXG5cdFx0c3RhdHVzQ29kZXM6IHJldHJ5U3RhdHVzQ29kZXMsXG5cdFx0YWZ0ZXJTdGF0dXNDb2RlczogcmV0cnlBZnRlclN0YXR1c0NvZGVzXG5cdH07XG5cblx0Y29uc3Qgbm9ybWFsaXplUmV0cnlPcHRpb25zID0gKHJldHJ5ID0ge30pID0+IHtcblx0XHRpZiAodHlwZW9mIHJldHJ5ID09PSAnbnVtYmVyJykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4uZGVmYXVsdFJldHJ5T3B0aW9ucyxcblx0XHRcdFx0bGltaXQ6IHJldHJ5XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChyZXRyeS5tZXRob2RzICYmICFBcnJheS5pc0FycmF5KHJldHJ5Lm1ldGhvZHMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3JldHJ5Lm1ldGhvZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblxuXHRcdGlmIChyZXRyeS5zdGF0dXNDb2RlcyAmJiAhQXJyYXkuaXNBcnJheShyZXRyeS5zdGF0dXNDb2RlcykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigncmV0cnkuc3RhdHVzQ29kZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5kZWZhdWx0UmV0cnlPcHRpb25zLFxuXHRcdFx0Li4ucmV0cnksXG5cdFx0XHRhZnRlclN0YXR1c0NvZGVzOiByZXRyeUFmdGVyU3RhdHVzQ29kZXNcblx0XHR9O1xuXHR9O1xuXG5cdC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgMzJiaXQgaW50IChzZWUgaXNzdWUgIzExNylcblx0Y29uc3QgbWF4U2FmZVRpbWVvdXQgPSAyMTQ3NDgzNjQ3O1xuXG5cdGNsYXNzIEt5IHtcblx0XHRjb25zdHJ1Y3RvcihpbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0XHR0aGlzLl9yZXRyeUNvdW50ID0gMDtcblx0XHRcdHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0ge1xuXHRcdFx0XHQvLyBUT0RPOiBjcmVkZW50aWFscyBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSBzcGVjIGNoYW5nZSBpcyBpbXBsZW1lbnRlZCBpbiBhbGwgYnJvd3NlcnMuIENvbnRleHQ6IGh0dHBzOi8vd3d3LmNocm9tZXN0YXR1cy5jb20vZmVhdHVyZS80NTM5NDczMzEyMzUwMjA4XG5cdFx0XHRcdGNyZWRlbnRpYWxzOiB0aGlzLl9pbnB1dC5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nLFxuXHRcdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0XHRoZWFkZXJzOiBtZXJnZUhlYWRlcnModGhpcy5faW5wdXQuaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKSxcblx0XHRcdFx0aG9va3M6IGRlZXBNZXJnZSh7XG5cdFx0XHRcdFx0YmVmb3JlUmVxdWVzdDogW10sXG5cdFx0XHRcdFx0YmVmb3JlUmV0cnk6IFtdLFxuXHRcdFx0XHRcdGFmdGVyUmVzcG9uc2U6IFtdXG5cdFx0XHRcdH0sIG9wdGlvbnMuaG9va3MpLFxuXHRcdFx0XHRtZXRob2Q6IG5vcm1hbGl6ZVJlcXVlc3RNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5faW5wdXQubWV0aG9kKSxcblx0XHRcdFx0cHJlZml4VXJsOiBTdHJpbmcob3B0aW9ucy5wcmVmaXhVcmwgfHwgJycpLFxuXHRcdFx0XHRyZXRyeTogbm9ybWFsaXplUmV0cnlPcHRpb25zKG9wdGlvbnMucmV0cnkpLFxuXHRcdFx0XHR0aHJvd0h0dHBFcnJvcnM6IG9wdGlvbnMudGhyb3dIdHRwRXJyb3JzICE9PSBmYWxzZSxcblx0XHRcdFx0dGltZW91dDogdHlwZW9mIG9wdGlvbnMudGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyAxMDAwMCA6IG9wdGlvbnMudGltZW91dCxcblx0XHRcdFx0ZmV0Y2g6IG9wdGlvbnMuZmV0Y2ggfHwgZ2xvYmFscy5mZXRjaFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLl9pbnB1dCAhPT0gJ3N0cmluZycgJiYgISh0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIFVSTCB8fCB0aGlzLl9pbnB1dCBpbnN0YW5jZW9mIGdsb2JhbHMuUmVxdWVzdCkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYGlucHV0YCBtdXN0IGJlIGEgc3RyaW5nLCBVUkwsIG9yIFJlcXVlc3QnKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucHJlZml4VXJsICYmIHR5cGVvZiB0aGlzLl9pbnB1dCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2lucHV0LnN0YXJ0c1dpdGgoJy8nKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignYGlucHV0YCBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgc2xhc2ggd2hlbiB1c2luZyBgcHJlZml4VXJsYCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0aGlzLl9vcHRpb25zLnByZWZpeFVybC5lbmRzV2l0aCgnLycpKSB7XG5cdFx0XHRcdFx0dGhpcy5fb3B0aW9ucy5wcmVmaXhVcmwgKz0gJy8nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5faW5wdXQgPSB0aGlzLl9vcHRpb25zLnByZWZpeFVybCArIHRoaXMuX2lucHV0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIpIHtcblx0XHRcdFx0dGhpcy5hYm9ydENvbnRyb2xsZXIgPSBuZXcgZ2xvYmFscy5BYm9ydENvbnRyb2xsZXIoKTtcblx0XHRcdFx0aWYgKHRoaXMuX29wdGlvbnMuc2lnbmFsKSB7XG5cdFx0XHRcdFx0dGhpcy5fb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5zaWduYWwgPSB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmVxdWVzdCA9IG5ldyBnbG9iYWxzLlJlcXVlc3QodGhpcy5faW5wdXQsIHRoaXMuX29wdGlvbnMpO1xuXG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5zZWFyY2hQYXJhbXMpIHtcblx0XHRcdFx0Y29uc3Qgc2VhcmNoUGFyYW1zID0gJz8nICsgbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9vcHRpb25zLnNlYXJjaFBhcmFtcykudG9TdHJpbmcoKTtcblx0XHRcdFx0Y29uc3QgdXJsID0gdGhpcy5yZXF1ZXN0LnVybC5yZXBsYWNlKC8oPzpcXD8uKj8pPyg/PSN8JCkvLCBzZWFyY2hQYXJhbXMpO1xuXG5cdFx0XHRcdC8vIFRvIHByb3ZpZGUgY29ycmVjdCBmb3JtIGJvdW5kYXJ5LCBDb250ZW50LVR5cGUgaGVhZGVyIHNob3VsZCBiZSBkZWxldGVkIGVhY2ggdGltZSB3aGVuIG5ldyBSZXF1ZXN0IGluc3RhbnRpYXRlZCBmcm9tIGFub3RoZXIgb25lXG5cdFx0XHRcdGlmICgoKHN1cHBvcnRzRm9ybURhdGEgJiYgdGhpcy5fb3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgZ2xvYmFscy5Gb3JtRGF0YSkgfHwgdGhpcy5fb3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSAmJiAhKHRoaXMuX29wdGlvbnMuaGVhZGVycyAmJiB0aGlzLl9vcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLmRlbGV0ZSgnY29udGVudC10eXBlJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnJlcXVlc3QgPSBuZXcgZ2xvYmFscy5SZXF1ZXN0KG5ldyBnbG9iYWxzLlJlcXVlc3QodXJsLCB0aGlzLnJlcXVlc3QpLCB0aGlzLl9vcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMuanNvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX29wdGlvbnMuanNvbik7XG5cdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0ID0gbmV3IGdsb2JhbHMuUmVxdWVzdCh0aGlzLnJlcXVlc3QsIHtib2R5OiB0aGlzLl9vcHRpb25zLmJvZHl9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm4gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRpbWVvdXQgPiBtYXhTYWZlVGltZW91dCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgXFxgdGltZW91dFxcYCBvcHRpb24gY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heFNhZmVUaW1lb3V0fWApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgZGVsYXkoMSk7XG5cdFx0XHRcdGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2ZldGNoKCk7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBob29rIG9mIHRoaXMuX29wdGlvbnMuaG9va3MuYWZ0ZXJSZXNwb25zZSkge1xuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cdFx0XHRcdFx0Y29uc3QgbW9kaWZpZWRSZXNwb25zZSA9IGF3YWl0IGhvb2soXG5cdFx0XHRcdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRcdFx0XHR0aGlzLl9vcHRpb25zLFxuXHRcdFx0XHRcdFx0dGhpcy5fZGVjb3JhdGVSZXNwb25zZShyZXNwb25zZS5jbG9uZSgpKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAobW9kaWZpZWRSZXNwb25zZSBpbnN0YW5jZW9mIGdsb2JhbHMuUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbW9kaWZpZWRSZXNwb25zZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9kZWNvcmF0ZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuXHRcdFx0XHRpZiAoIXJlc3BvbnNlLm9rICYmIHRoaXMuX29wdGlvbnMudGhyb3dIdHRwRXJyb3JzKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEhUVFBFcnJvcihyZXNwb25zZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBgb25Eb3dubG9hZFByb2dyZXNzYCBpcyBwYXNzZWQsIGl0IHVzZXMgdGhlIHN0cmVhbSBBUEkgaW50ZXJuYWxseVxuXHRcdFx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYG9uRG93bmxvYWRQcm9ncmVzc2Agb3B0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghc3VwcG9ydHNTdHJlYW1zKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1N0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4geW91ciBlbnZpcm9ubWVudC4gYFJlYWRhYmxlU3RyZWFtYCBpcyBtaXNzaW5nLicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9zdHJlYW0ocmVzcG9uc2UuY2xvbmUoKSwgdGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgaXNSZXRyaWFibGVNZXRob2QgPSB0aGlzLl9vcHRpb25zLnJldHJ5Lm1ldGhvZHMuaW5jbHVkZXModGhpcy5yZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpKTtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGlzUmV0cmlhYmxlTWV0aG9kID8gdGhpcy5fcmV0cnkoZm4pIDogZm4oKTtcblxuXHRcdFx0Zm9yIChjb25zdCBbdHlwZSwgbWltZVR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlVHlwZXMpKSB7XG5cdFx0XHRcdHJlc3VsdFt0eXBlXSA9IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QuaGVhZGVycy5zZXQoJ2FjY2VwdCcsIHRoaXMucmVxdWVzdC5oZWFkZXJzLmdldCgnYWNjZXB0JykgfHwgbWltZVR5cGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgcmVzdWx0KS5jbG9uZSgpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGUgPT09ICdqc29uJykge1xuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAnJztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMucGFyc2VKc29uKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvcHRpb25zLnBhcnNlSnNvbihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXNwb25zZVt0eXBlXSgpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdF9jYWxjdWxhdGVSZXRyeURlbGF5KGVycm9yKSB7XG5cdFx0XHR0aGlzLl9yZXRyeUNvdW50Kys7XG5cblx0XHRcdGlmICh0aGlzLl9yZXRyeUNvdW50IDwgdGhpcy5fb3B0aW9ucy5yZXRyeS5saW1pdCAmJiAhKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSkge1xuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBIVFRQRXJyb3IpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX29wdGlvbnMucmV0cnkuc3RhdHVzQ29kZXMuaW5jbHVkZXMoZXJyb3IucmVzcG9uc2Uuc3RhdHVzKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcmV0cnlBZnRlciA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpO1xuXHRcdFx0XHRcdGlmIChyZXRyeUFmdGVyICYmIHRoaXMuX29wdGlvbnMucmV0cnkuYWZ0ZXJTdGF0dXNDb2Rlcy5pbmNsdWRlcyhlcnJvci5yZXNwb25zZS5zdGF0dXMpKSB7XG5cdFx0XHRcdFx0XHRsZXQgYWZ0ZXIgPSBOdW1iZXIocmV0cnlBZnRlcik7XG5cdFx0XHRcdFx0XHRpZiAoTnVtYmVyLmlzTmFOKGFmdGVyKSkge1xuXHRcdFx0XHRcdFx0XHRhZnRlciA9IERhdGUucGFyc2UocmV0cnlBZnRlcikgLSBEYXRlLm5vdygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YWZ0ZXIgKj0gMTAwMDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB0aGlzLl9vcHRpb25zLnJldHJ5Lm1heFJldHJ5QWZ0ZXIgIT09ICd1bmRlZmluZWQnICYmIGFmdGVyID4gdGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhSZXRyeUFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWZ0ZXI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDEzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBCQUNLT0ZGX0ZBQ1RPUiA9IDAuMztcblx0XHRcdFx0cmV0dXJuIEJBQ0tPRkZfRkFDVE9SICogKDIgKiogKHRoaXMuX3JldHJ5Q291bnQgLSAxKSkgKiAxMDAwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRfZGVjb3JhdGVSZXNwb25zZShyZXNwb25zZSkge1xuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucGFyc2VKc29uKSB7XG5cdFx0XHRcdHJlc3BvbnNlLmpzb24gPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX29wdGlvbnMucGFyc2VKc29uKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXNwb25zZTtcblx0XHR9XG5cblx0XHRhc3luYyBfcmV0cnkoZm4pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHVybiBhd2FpdCBmbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgbXMgPSBNYXRoLm1pbih0aGlzLl9jYWxjdWxhdGVSZXRyeURlbGF5KGVycm9yKSwgbWF4U2FmZVRpbWVvdXQpO1xuXHRcdFx0XHRpZiAobXMgIT09IDAgJiYgdGhpcy5fcmV0cnlDb3VudCA+IDApIHtcblx0XHRcdFx0XHRhd2FpdCBkZWxheShtcyk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5fb3B0aW9ucy5ob29rcy5iZWZvcmVSZXRyeSkge1xuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3Bcblx0XHRcdFx0XHRcdGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB0aGlzLl9vcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRlcnJvcixcblx0XHRcdFx0XHRcdFx0cmV0cnlDb3VudDogdGhpcy5fcmV0cnlDb3VudFxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdC8vIElmIGBzdG9wYCBpcyByZXR1cm5lZCBmcm9tIHRoZSBob29rLCB0aGUgcmV0cnkgcHJvY2VzcyBpcyBzdG9wcGVkXG5cdFx0XHRcdFx0XHRpZiAoaG9va1Jlc3VsdCA9PT0gc3RvcCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JldHJ5KGZuKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRocm93SHR0cEVycm9ycykge1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YXN5bmMgX2ZldGNoKCkge1xuXHRcdFx0Zm9yIChjb25zdCBob29rIG9mIHRoaXMuX29wdGlvbnMuaG9va3MuYmVmb3JlUmVxdWVzdCkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBob29rKHRoaXMucmVxdWVzdCwgdGhpcy5fb3B0aW9ucyk7XG5cblx0XHRcdFx0aWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QgPSByZXN1bHQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnRpbWVvdXQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9vcHRpb25zLmZldGNoKHRoaXMucmVxdWVzdC5jbG9uZSgpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRpbWVvdXQodGhpcy5yZXF1ZXN0LmNsb25lKCksIHRoaXMuYWJvcnRDb250cm9sbGVyLCB0aGlzLl9vcHRpb25zKTtcblx0XHR9XG5cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdF9zdHJlYW0ocmVzcG9uc2UsIG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0Y29uc3QgdG90YWxCeXRlcyA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSkgfHwgMDtcblx0XHRcdGxldCB0cmFuc2ZlcnJlZEJ5dGVzID0gMDtcblxuXHRcdFx0cmV0dXJuIG5ldyBnbG9iYWxzLlJlc3BvbnNlKFxuXHRcdFx0XHRuZXcgZ2xvYmFscy5SZWFkYWJsZVN0cmVhbSh7XG5cdFx0XHRcdFx0c3RhcnQoY29udHJvbGxlcikge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0XHRcdFx0XHRvbkRvd25sb2FkUHJvZ3Jlc3Moe3BlcmNlbnQ6IDAsIHRyYW5zZmVycmVkQnl0ZXM6IDAsIHRvdGFsQnl0ZXN9LCBuZXcgVWludDhBcnJheSgpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YXN5bmMgZnVuY3Rpb24gcmVhZCgpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cdFx0XHRcdFx0XHRcdGlmIChkb25lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2ZlcnJlZEJ5dGVzICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcGVyY2VudCA9IHRvdGFsQnl0ZXMgPT09IDAgPyAwIDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXM7XG5cdFx0XHRcdFx0XHRcdFx0b25Eb3dubG9hZFByb2dyZXNzKHtwZXJjZW50LCB0cmFuc2ZlcnJlZEJ5dGVzLCB0b3RhbEJ5dGVzfSwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0cmVhZCgpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZWFkKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCB2YWxpZGF0ZUFuZE1lcmdlID0gKC4uLnNvdXJjZXMpID0+IHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG5cdFx0XHRpZiAoKCFpc09iamVjdChzb3VyY2UpIHx8IEFycmF5LmlzQXJyYXkoc291cmNlKSkgJiYgdHlwZW9mIHNvdXJjZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGBvcHRpb25zYCBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBkZWVwTWVyZ2Uoe30sIC4uLnNvdXJjZXMpO1xuXHR9O1xuXG5cdGNvbnN0IGNyZWF0ZUluc3RhbmNlID0gZGVmYXVsdHMgPT4ge1xuXHRcdGNvbnN0IGt5ID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgS3koaW5wdXQsIHZhbGlkYXRlQW5kTWVyZ2UoZGVmYXVsdHMsIG9wdGlvbnMpKTtcblxuXHRcdGZvciAoY29uc3QgbWV0aG9kIG9mIHJlcXVlc3RNZXRob2RzKSB7XG5cdFx0XHRreVttZXRob2RdID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgS3koaW5wdXQsIHZhbGlkYXRlQW5kTWVyZ2UoZGVmYXVsdHMsIG9wdGlvbnMsIHttZXRob2R9KSk7XG5cdFx0fVxuXG5cdFx0a3kuSFRUUEVycm9yID0gSFRUUEVycm9yO1xuXHRcdGt5LlRpbWVvdXRFcnJvciA9IFRpbWVvdXRFcnJvcjtcblx0XHRreS5jcmVhdGUgPSBuZXdEZWZhdWx0cyA9PiBjcmVhdGVJbnN0YW5jZSh2YWxpZGF0ZUFuZE1lcmdlKG5ld0RlZmF1bHRzKSk7XG5cdFx0a3kuZXh0ZW5kID0gbmV3RGVmYXVsdHMgPT4gY3JlYXRlSW5zdGFuY2UodmFsaWRhdGVBbmRNZXJnZShkZWZhdWx0cywgbmV3RGVmYXVsdHMpKTtcblx0XHRreS5zdG9wID0gc3RvcDtcblxuXHRcdHJldHVybiBreTtcblx0fTtcblxuXHR2YXIgaW5kZXggPSBjcmVhdGVJbnN0YW5jZSgpO1xuXG5cdHJldHVybiBpbmRleDtcblxufSkpKTtcbiIsIihmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShkZWZpbml0aW9uKTtcbiAgZWxzZSBjb250ZXh0W25hbWVdID0gZGVmaW5pdGlvbigpO1xufSkoJ3VybGpvaW4nLCB0aGlzLCBmdW5jdGlvbiAoKSB7XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplIChzdHJBcnJheSkge1xuICAgIHZhciByZXN1bHRBcnJheSA9IFtdO1xuICAgIGlmIChzdHJBcnJheS5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG5cbiAgICBpZiAodHlwZW9mIHN0ckFycmF5WzBdICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVXJsIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICcgKyBzdHJBcnJheVswXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGZpcnN0IHBhcnQgaXMgYSBwbGFpbiBwcm90b2NvbCwgd2UgY29tYmluZSBpdCB3aXRoIHRoZSBuZXh0IHBhcnQuXG4gICAgaWYgKHN0ckFycmF5WzBdLm1hdGNoKC9eW14vOl0rOlxcLyokLykgJiYgc3RyQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGZpcnN0ID0gc3RyQXJyYXkuc2hpZnQoKTtcbiAgICAgIHN0ckFycmF5WzBdID0gZmlyc3QgKyBzdHJBcnJheVswXTtcbiAgICB9XG5cbiAgICAvLyBUaGVyZSBtdXN0IGJlIHR3byBvciB0aHJlZSBzbGFzaGVzIGluIHRoZSBmaWxlIHByb3RvY29sLCB0d28gc2xhc2hlcyBpbiBhbnl0aGluZyBlbHNlLlxuICAgIGlmIChzdHJBcnJheVswXS5tYXRjaCgvXmZpbGU6XFwvXFwvXFwvLykpIHtcbiAgICAgIHN0ckFycmF5WzBdID0gc3RyQXJyYXlbMF0ucmVwbGFjZSgvXihbXi86XSspOlxcLyovLCAnJDE6Ly8vJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ckFycmF5WzBdID0gc3RyQXJyYXlbMF0ucmVwbGFjZSgvXihbXi86XSspOlxcLyovLCAnJDE6Ly8nKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gc3RyQXJyYXlbaV07XG5cbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVcmwgbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgJyArIGNvbXBvbmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb25lbnQgPT09ICcnKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAvLyBSZW1vdmluZyB0aGUgc3RhcnRpbmcgc2xhc2hlcyBmb3IgZWFjaCBjb21wb25lbnQgYnV0IHRoZSBmaXJzdC5cbiAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LnJlcGxhY2UoL15bXFwvXSsvLCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoaSA8IHN0ckFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgLy8gUmVtb3ZpbmcgdGhlIGVuZGluZyBzbGFzaGVzIGZvciBlYWNoIGNvbXBvbmVudCBidXQgdGhlIGxhc3QuXG4gICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC5yZXBsYWNlKC9bXFwvXSskLywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIHRoZSBsYXN0IGNvbXBvbmVudCB3ZSB3aWxsIGNvbWJpbmUgbXVsdGlwbGUgc2xhc2hlcyB0byBhIHNpbmdsZSBvbmUuXG4gICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC5yZXBsYWNlKC9bXFwvXSskLywgJy8nKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0QXJyYXkucHVzaChjb21wb25lbnQpO1xuXG4gICAgfVxuXG4gICAgdmFyIHN0ciA9IHJlc3VsdEFycmF5LmpvaW4oJy8nKTtcbiAgICAvLyBFYWNoIGlucHV0IGNvbXBvbmVudCBpcyBub3cgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNsYXNoIGV4Y2VwdCB0aGUgcG9zc2libGUgZmlyc3QgcGxhaW4gcHJvdG9jb2wgcGFydC5cblxuICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCBiZWZvcmUgcGFyYW1ldGVycyBvciBoYXNoXG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcLyhcXD98JnwjW14hXSkvZywgJyQxJyk7XG5cbiAgICAvLyByZXBsYWNlID8gaW4gcGFyYW1ldGVycyB3aXRoICZcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJz8nKTtcbiAgICBzdHIgPSBwYXJ0cy5zaGlmdCgpICsgKHBhcnRzLmxlbmd0aCA+IDAgPyAnPyc6ICcnKSArIHBhcnRzLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dDtcblxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgaW5wdXQgPSBhcmd1bWVudHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0ID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemUoaW5wdXQpO1xuICB9O1xuXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImh0dHBzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN0cmVhbVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZmV0Y2g7XG5cbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBkYXRhVXJpVG9CdWZmZXIgPSByZXF1aXJlKCdkYXRhLXVyaS10by1idWZmZXInKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBCbG9iID0gcmVxdWlyZSgnZmV0Y2gtYmxvYicpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB1cmwgPSByZXF1aXJlKCd1cmwnKTtcblxuY2xhc3MgRmV0Y2hCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHR5cGUpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHQvLyBIaWRlIGN1c3RvbSBlcnJvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZyb20gZW5kLXVzZXJzXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG5cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0IG5hbWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXHR9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge3sgYWRkcmVzcz86IHN0cmluZywgY29kZTogc3RyaW5nLCBkZXN0Pzogc3RyaW5nLCBlcnJubzogbnVtYmVyLCBpbmZvPzogb2JqZWN0LCBtZXNzYWdlOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHN5c2NhbGw6IHN0cmluZ319IFN5c3RlbUVycm9yXG4qL1xuXG4vKipcbiAqIEZldGNoRXJyb3IgaW50ZXJmYWNlIGZvciBvcGVyYXRpb25hbCBlcnJvcnNcbiAqL1xuY2xhc3MgRmV0Y2hFcnJvciBleHRlbmRzIEZldGNoQmFzZUVycm9yIHtcblx0LyoqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gbWVzc2FnZSAtICAgICAgRXJyb3IgbWVzc2FnZSBmb3IgaHVtYW5cblx0ICogQHBhcmFtICB7c3RyaW5nfSBbdHlwZV0gLSAgICAgICAgRXJyb3IgdHlwZSBmb3IgbWFjaGluZVxuXHQgKiBAcGFyYW0gIHtTeXN0ZW1FcnJvcn0gW3N5c3RlbUVycm9yXSAtIEZvciBOb2RlLmpzIHN5c3RlbSBlcnJvclxuXHQgKi9cblx0Y29uc3RydWN0b3IobWVzc2FnZSwgdHlwZSwgc3lzdGVtRXJyb3IpIHtcblx0XHRzdXBlcihtZXNzYWdlLCB0eXBlKTtcblx0XHQvLyBXaGVuIGVyci50eXBlIGlzIGBzeXN0ZW1gLCBlcnIuZXJyb3JlZFN5c0NhbGwgY29udGFpbnMgc3lzdGVtIGVycm9yIGFuZCBlcnIuY29kZSBjb250YWlucyBzeXN0ZW0gZXJyb3IgY29kZVxuXHRcdGlmIChzeXN0ZW1FcnJvcikge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuXHRcdFx0dGhpcy5jb2RlID0gdGhpcy5lcnJubyA9IHN5c3RlbUVycm9yLmNvZGU7XG5cdFx0XHR0aGlzLmVycm9yZWRTeXNDYWxsID0gc3lzdGVtRXJyb3Iuc3lzY2FsbDtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBJcy5qc1xuICpcbiAqIE9iamVjdCB0eXBlIGNoZWNrcy5cbiAqL1xuXG5jb25zdCBOQU1FID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICogcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy8yOTYjaXNzdWVjb21tZW50LTMwNzU5ODE0M1xuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNVUkxTZWFyY2hQYXJhbWV0ZXJzID0gb2JqZWN0ID0+IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3Quc29ydCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdG9iamVjdFtOQU1FXSA9PT0gJ1VSTFNlYXJjaFBhcmFtcydcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamVjdGAgaXMgYSBXM0MgYEJsb2JgIG9iamVjdCAod2hpY2ggYEZpbGVgIGluaGVyaXRzIGZyb20pXG4gKlxuICogQHBhcmFtICB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBpc0Jsb2IgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QudHlwZSA9PT0gJ3N0cmluZycgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHQvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbTkFNRV0pXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgc3BlYy1jb21wbGlhbnQgYEZvcm1EYXRhYCBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YShvYmplY3QpIHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5zZXQgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcblx0XHRvYmplY3RbTkFNRV0gPT09ICdGb3JtRGF0YSdcblx0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBpbnN0YW5jZSBvZiBBYm9ydFNpZ25hbC5cbiAqXG4gKiBAcGFyYW0gIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQWJvcnRTaWduYWwgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0b2JqZWN0W05BTUVdID09PSAnQWJvcnRTaWduYWwnXG5cdCk7XG59O1xuXG5jb25zdCBjYXJyaWFnZSA9ICdcXHJcXG4nO1xuY29uc3QgZGFzaGVzID0gJy0nLnJlcGVhdCgyKTtcbmNvbnN0IGNhcnJpYWdlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoY2FycmlhZ2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICovXG5jb25zdCBnZXRGb290ZXIgPSBib3VuZGFyeSA9PiBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2Rhc2hlc30ke2NhcnJpYWdlLnJlcGVhdCgyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gZmllbGRcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgZmllbGQpIHtcblx0bGV0IGhlYWRlciA9ICcnO1xuXG5cdGhlYWRlciArPSBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2NhcnJpYWdlfWA7XG5cdGhlYWRlciArPSBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiJHtuYW1lfVwiYDtcblxuXHRpZiAoaXNCbG9iKGZpZWxkKSkge1xuXHRcdGhlYWRlciArPSBgOyBmaWxlbmFtZT1cIiR7ZmllbGQubmFtZX1cIiR7Y2FycmlhZ2V9YDtcblx0XHRoZWFkZXIgKz0gYENvbnRlbnQtVHlwZTogJHtmaWVsZC50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfWA7XG5cdH1cblxuXHRyZXR1cm4gYCR7aGVhZGVyfSR7Y2FycmlhZ2UucmVwZWF0KDIpfWA7XG59XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRCb3VuZGFyeSA9ICgpID0+IGNyeXB0by5yYW5kb21CeXRlcyg4KS50b1N0cmluZygnaGV4Jyk7XG5cbi8qKlxuICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IGJvdW5kYXJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uICogZm9ybURhdGFJdGVyYXRvcihmb3JtLCBib3VuZGFyeSkge1xuXHRmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZm9ybSkge1xuXHRcdHlpZWxkIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgdmFsdWUpO1xuXG5cdFx0aWYgKGlzQmxvYih2YWx1ZSkpIHtcblx0XHRcdHlpZWxkICogdmFsdWUuc3RyZWFtKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHlpZWxkIHZhbHVlO1xuXHRcdH1cblxuXHRcdHlpZWxkIGNhcnJpYWdlO1xuXHR9XG5cblx0eWllbGQgZ2V0Rm9vdGVyKGJvdW5kYXJ5KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9ybURhdGFMZW5ndGgoZm9ybSwgYm91bmRhcnkpIHtcblx0bGV0IGxlbmd0aCA9IDA7XG5cblx0Zm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGZvcm0pIHtcblx0XHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoZ2V0SGVhZGVyKGJvdW5kYXJ5LCBuYW1lLCB2YWx1ZSkpO1xuXG5cdFx0aWYgKGlzQmxvYih2YWx1ZSkpIHtcblx0XHRcdGxlbmd0aCArPSB2YWx1ZS5zaXplO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoU3RyaW5nKHZhbHVlKSk7XG5cdFx0fVxuXG5cdFx0bGVuZ3RoICs9IGNhcnJpYWdlTGVuZ3RoO1xuXHR9XG5cblx0bGVuZ3RoICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKGdldEZvb3Rlcihib3VuZGFyeSkpO1xuXG5cdHJldHVybiBsZW5ndGg7XG59XG5cbmNvbnN0IElOVEVSTkFMUyA9IFN5bWJvbCgnQm9keSBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBCb2R5IG1peGluXG4gKlxuICogUmVmOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keVxuICpcbiAqIEBwYXJhbSAgIFN0cmVhbSAgYm9keSAgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gICBPYmplY3QgIG9wdHMgIFJlc3BvbnNlIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgQm9keSB7XG5cdGNvbnN0cnVjdG9yKGJvZHksIHtcblx0XHRzaXplID0gMFxuXHR9ID0ge30pIHtcblx0XHRsZXQgYm91bmRhcnkgPSBudWxsO1xuXG5cdFx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRcdC8vIEJvZHkgaXMgdW5kZWZpbmVkIG9yIG51bGxcblx0XHRcdGJvZHkgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNVUkxTZWFyY2hQYXJhbWV0ZXJzKGJvZHkpKSB7XG5cdFx0Ly8gQm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkudG9TdHJpbmcoKSk7XG5cdFx0fSBlbHNlIGlmIChpc0Jsb2IoYm9keSkpIDsgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSA7IGVsc2UgaWYgKHV0aWwudHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihib2R5KSkge1xuXHRcdFx0Ly8gQm9keSBpcyBBcnJheUJ1ZmZlclxuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkpO1xuXHRcdH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpKSB7XG5cdFx0XHQvLyBCb2R5IGlzIEFycmF5QnVmZmVyVmlld1xuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCk7XG5cdFx0fSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSA7IGVsc2UgaWYgKGlzRm9ybURhdGEoYm9keSkpIHtcblx0XHRcdC8vIEJvZHkgaXMgYW4gaW5zdGFuY2Ugb2YgZm9ybWRhdGEtbm9kZVxuXHRcdFx0Ym91bmRhcnkgPSBgTm9kZUZldGNoRm9ybURhdGFCb3VuZGFyeSR7Z2V0Qm91bmRhcnkoKX1gO1xuXHRcdFx0Ym9keSA9IFN0cmVhbS5SZWFkYWJsZS5mcm9tKGZvcm1EYXRhSXRlcmF0b3IoYm9keSwgYm91bmRhcnkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm9uZSBvZiB0aGUgYWJvdmVcblx0XHRcdC8vIGNvZXJjZSB0byBzdHJpbmcgdGhlbiBidWZmZXJcblx0XHRcdGJvZHkgPSBCdWZmZXIuZnJvbShTdHJpbmcoYm9keSkpO1xuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTXSA9IHtcblx0XHRcdGJvZHksXG5cdFx0XHRib3VuZGFyeSxcblx0XHRcdGRpc3R1cmJlZDogZmFsc2UsXG5cdFx0XHRlcnJvcjogbnVsbFxuXHRcdH07XG5cdFx0dGhpcy5zaXplID0gc2l6ZTtcblxuXHRcdGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSB7XG5cdFx0XHRib2R5Lm9uKCdlcnJvcicsIGVyciA9PiB7XG5cdFx0XHRcdGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRmV0Y2hCYXNlRXJyb3IgP1xuXHRcdFx0XHRcdGVyciA6XG5cdFx0XHRcdFx0bmV3IEZldGNoRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgYm9keSB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggJHt0aGlzLnVybH06ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycik7XG5cdFx0XHRcdHRoaXNbSU5URVJOQUxTXS5lcnJvciA9IGVycm9yO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGJvZHkoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTXS5ib2R5O1xuXHR9XG5cblx0Z2V0IGJvZHlVc2VkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMU10uZGlzdHVyYmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY29kZSByZXNwb25zZSBhcyBBcnJheUJ1ZmZlclxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBhcnJheUJ1ZmZlcigpIHtcblx0XHRjb25zdCB7YnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RofSA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBidWZmZXIuc2xpY2UoYnl0ZU9mZnNldCwgYnl0ZU9mZnNldCArIGJ5dGVMZW5ndGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiByYXcgcmVzcG9uc2UgYXMgQmxvYlxuXHQgKlxuXHQgKiBAcmV0dXJuIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGJsb2IoKSB7XG5cdFx0Y29uc3QgY3QgPSAodGhpcy5oZWFkZXJzICYmIHRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB8fCAodGhpc1tJTlRFUk5BTFNdLmJvZHkgJiYgdGhpc1tJTlRFUk5BTFNdLmJvZHkudHlwZSkgfHwgJyc7XG5cdFx0Y29uc3QgYnVmID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcblxuXHRcdHJldHVybiBuZXcgQmxvYihbYnVmXSwge1xuXHRcdFx0dHlwZTogY3Rcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMganNvblxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBqc29uKCkge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBKU09OLnBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMgdGV4dFxuXHQgKlxuXHQgKiBAcmV0dXJuICBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyB0ZXh0KCkge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGNvbnN1bWVCb2R5KHRoaXMpO1xuXHRcdHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNvZGUgcmVzcG9uc2UgYXMgYnVmZmVyIChub24tc3BlYyBhcGkpXG5cdCAqXG5cdCAqIEByZXR1cm4gIFByb21pc2Vcblx0ICovXG5cdGJ1ZmZlcigpIHtcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkodGhpcyk7XG5cdH1cbn1cblxuLy8gSW4gYnJvd3NlcnMsIGFsbCBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQm9keS5wcm90b3R5cGUsIHtcblx0Ym9keToge2VudW1lcmFibGU6IHRydWV9LFxuXHRib2R5VXNlZDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRhcnJheUJ1ZmZlcjoge2VudW1lcmFibGU6IHRydWV9LFxuXHRibG9iOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGpzb246IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0dGV4dDoge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuLyoqXG4gKiBDb25zdW1lIGFuZCBjb252ZXJ0IGFuIGVudGlyZSBCb2R5IHRvIGEgQnVmZmVyLlxuICpcbiAqIFJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1jb25zdW1lLWJvZHlcbiAqXG4gKiBAcmV0dXJuIFByb21pc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uc3VtZUJvZHkoZGF0YSkge1xuXHRpZiAoZGF0YVtJTlRFUk5BTFNdLmRpc3R1cmJlZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYGJvZHkgdXNlZCBhbHJlYWR5IGZvcjogJHtkYXRhLnVybH1gKTtcblx0fVxuXG5cdGRhdGFbSU5URVJOQUxTXS5kaXN0dXJiZWQgPSB0cnVlO1xuXG5cdGlmIChkYXRhW0lOVEVSTkFMU10uZXJyb3IpIHtcblx0XHR0aHJvdyBkYXRhW0lOVEVSTkFMU10uZXJyb3I7XG5cdH1cblxuXHRsZXQge2JvZHl9ID0gZGF0YTtcblxuXHQvLyBCb2R5IGlzIG51bGxcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBibG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRib2R5ID0gYm9keS5zdHJlYW0oKTtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYnVmZmVyXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHRyZXR1cm4gYm9keTtcblx0fVxuXG5cdC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cblx0aWYgKCEoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBzdHJlYW1cblx0Ly8gZ2V0IHJlYWR5IHRvIGFjdHVhbGx5IGNvbnN1bWUgdGhlIGJvZHlcblx0Y29uc3QgYWNjdW0gPSBbXTtcblx0bGV0IGFjY3VtQnl0ZXMgPSAwO1xuXG5cdHRyeSB7XG5cdFx0Zm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG5cdFx0XHRpZiAoZGF0YS5zaXplID4gMCAmJiBhY2N1bUJ5dGVzICsgY2h1bmsubGVuZ3RoID4gZGF0YS5zaXplKSB7XG5cdFx0XHRcdGNvbnN0IGVyciA9IG5ldyBGZXRjaEVycm9yKGBjb250ZW50IHNpemUgYXQgJHtkYXRhLnVybH0gb3ZlciBsaW1pdDogJHtkYXRhLnNpemV9YCwgJ21heC1zaXplJyk7XG5cdFx0XHRcdGJvZHkuZGVzdHJveShlcnIpO1xuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9XG5cblx0XHRcdGFjY3VtQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXHRcdFx0YWNjdW0ucHVzaChjaHVuayk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEZldGNoQmFzZUVycm9yKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXIgZXJyb3JzLCBzdWNoIGFzIGluY29ycmVjdCBjb250ZW50LWVuY29kaW5nXG5cdFx0XHR0aHJvdyBuZXcgRmV0Y2hFcnJvcihgSW52YWxpZCByZXNwb25zZSBib2R5IHdoaWxlIHRyeWluZyB0byBmZXRjaCAke2RhdGEudXJsfTogJHtlcnJvci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGJvZHkucmVhZGFibGVFbmRlZCA9PT0gdHJ1ZSB8fCBib2R5Ll9yZWFkYWJsZVN0YXRlLmVuZGVkID09PSB0cnVlKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhY2N1bS5ldmVyeShjID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJykpIHtcblx0XHRcdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKGFjY3VtLmpvaW4oJycpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIEJ1ZmZlci5jb25jYXQoYWNjdW0sIGFjY3VtQnl0ZXMpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRmV0Y2hFcnJvcihgQ291bGQgbm90IGNyZWF0ZSBCdWZmZXIgZnJvbSByZXNwb25zZSBib2R5IGZvciAke2RhdGEudXJsfTogJHtlcnJvci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnJvcik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBGZXRjaEVycm9yKGBQcmVtYXR1cmUgY2xvc2Ugb2Ygc2VydmVyIHJlc3BvbnNlIHdoaWxlIHRyeWluZyB0byBmZXRjaCAke2RhdGEudXJsfWApO1xuXHR9XG59XG5cbi8qKlxuICogQ2xvbmUgYm9keSBnaXZlbiBSZXMvUmVxIGluc3RhbmNlXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnN0YW5jZSAgICAgICBSZXNwb25zZSBvciBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcGFyYW0gICBTdHJpbmcgIGhpZ2hXYXRlck1hcmsgIGhpZ2hXYXRlck1hcmsgZm9yIGJvdGggUGFzc1Rocm91Z2ggYm9keSBzdHJlYW1zXG4gKiBAcmV0dXJuICBNaXhlZFxuICovXG5jb25zdCBjbG9uZSA9IChpbnN0YW5jZSwgaGlnaFdhdGVyTWFyaykgPT4ge1xuXHRsZXQgcDE7XG5cdGxldCBwMjtcblx0bGV0IHtib2R5fSA9IGluc3RhbmNlO1xuXG5cdC8vIERvbid0IGFsbG93IGNsb25pbmcgYSB1c2VkIGJvZHlcblx0aWYgKGluc3RhbmNlLmJvZHlVc2VkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY2xvbmUgYm9keSBhZnRlciBpdCBpcyB1c2VkJyk7XG5cdH1cblxuXHQvLyBDaGVjayB0aGF0IGJvZHkgaXMgYSBzdHJlYW0gYW5kIG5vdCBmb3JtLWRhdGEgb2JqZWN0XG5cdC8vIG5vdGU6IHdlIGNhbid0IGNsb25lIHRoZSBmb3JtLWRhdGEgb2JqZWN0IHdpdGhvdXQgaGF2aW5nIGl0IGFzIGEgZGVwZW5kZW5jeVxuXHRpZiAoKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pICYmICh0eXBlb2YgYm9keS5nZXRCb3VuZGFyeSAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHQvLyBUZWUgaW5zdGFuY2UgYm9keVxuXHRcdHAxID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7aGlnaFdhdGVyTWFya30pO1xuXHRcdHAyID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7aGlnaFdhdGVyTWFya30pO1xuXHRcdGJvZHkucGlwZShwMSk7XG5cdFx0Ym9keS5waXBlKHAyKTtcblx0XHQvLyBTZXQgaW5zdGFuY2UgYm9keSB0byB0ZWVkIGJvZHkgYW5kIHJldHVybiB0aGUgb3RoZXIgdGVlZCBib2R5XG5cdFx0aW5zdGFuY2VbSU5URVJOQUxTXS5ib2R5ID0gcDE7XG5cdFx0Ym9keSA9IHAyO1xuXHR9XG5cblx0cmV0dXJuIGJvZHk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gXCJleHRyYWN0IGEgYENvbnRlbnQtVHlwZWAgdmFsdWUgZnJvbSB8b2JqZWN0fFwiIGFzXG4gKiBzcGVjaWZpZWQgaW4gdGhlIHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5aW5pdC1leHRyYWN0XG4gKlxuICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaW5zdGFuY2UuYm9keSBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSB7YW55fSBib2R5IEFueSBvcHRpb25zLmJvZHkgaW5wdXRcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICovXG5jb25zdCBleHRyYWN0Q29udGVudFR5cGUgPSAoYm9keSwgcmVxdWVzdCkgPT4ge1xuXHQvLyBCb2R5IGlzIG51bGwgb3IgdW5kZWZpbmVkXG5cdGlmIChib2R5ID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmluZ1xuXHRpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRpZiAoaXNVUkxTZWFyY2hQYXJhbWV0ZXJzKGJvZHkpKSB7XG5cdFx0cmV0dXJuICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGJsb2Jcblx0aWYgKGlzQmxvYihib2R5KSkge1xuXHRcdHJldHVybiBib2R5LnR5cGUgfHwgbnVsbDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYSBCdWZmZXIgKEJ1ZmZlciwgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KVxuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpIHx8IHV0aWwudHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihib2R5KSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYm9keSkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIERldGVjdCBmb3JtIGRhdGEgaW5wdXQgZnJvbSBmb3JtLWRhdGEgbW9kdWxlXG5cdGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldEJvdW5kYXJ5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGBtdWx0aXBhcnQvZm9ybS1kYXRhO2JvdW5kYXJ5PSR7Ym9keS5nZXRCb3VuZGFyeSgpfWA7XG5cdH1cblxuXHRpZiAoaXNGb3JtRGF0YShib2R5KSkge1xuXHRcdHJldHVybiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtyZXF1ZXN0W0lOVEVSTkFMU10uYm91bmRhcnl9YDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgc3RyZWFtIC0gY2FuJ3QgcmVhbGx5IGRvIG11Y2ggYWJvdXQgdGhpc1xuXHRpZiAoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gQm9keSBjb25zdHJ1Y3RvciBkZWZhdWx0cyBvdGhlciB0aGluZ3MgdG8gc3RyaW5nXG5cdHJldHVybiAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Jztcbn07XG5cbi8qKlxuICogVGhlIEZldGNoIFN0YW5kYXJkIHRyZWF0cyB0aGlzIGFzIGlmIFwidG90YWwgYnl0ZXNcIiBpcyBhIHByb3BlcnR5IG9uIHRoZSBib2R5LlxuICogRm9yIHVzLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZ2V0IGl0IHdpdGggYSBmdW5jdGlvbi5cbiAqXG4gKiByZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktdG90YWwtYnl0ZXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gb2JqLmJvZHkgQm9keSBvYmplY3QgZnJvbSB0aGUgQm9keSBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfVxuICovXG5jb25zdCBnZXRUb3RhbEJ5dGVzID0gcmVxdWVzdCA9PiB7XG5cdGNvbnN0IHtib2R5fSA9IHJlcXVlc3Q7XG5cblx0Ly8gQm9keSBpcyBudWxsIG9yIHVuZGVmaW5lZFxuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBCbG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRyZXR1cm4gYm9keS5zaXplO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBCdWZmZXJcblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuXHRcdHJldHVybiBib2R5Lmxlbmd0aDtcblx0fVxuXG5cdC8vIERldGVjdCBmb3JtIGRhdGEgaW5wdXQgZnJvbSBmb3JtLWRhdGEgbW9kdWxlXG5cdGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldExlbmd0aFN5bmMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gYm9keS5oYXNLbm93bkxlbmd0aCAmJiBib2R5Lmhhc0tub3duTGVuZ3RoKCkgPyBib2R5LmdldExlbmd0aFN5bmMoKSA6IG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGEgc3BlYy1jb21wbGlhbnQgZm9ybS1kYXRhXG5cdGlmIChpc0Zvcm1EYXRhKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGdldEZvcm1EYXRhTGVuZ3RoKHJlcXVlc3RbSU5URVJOQUxTXS5ib3VuZGFyeSk7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmVhbVxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogV3JpdGUgYSBCb2R5IHRvIGEgTm9kZS5qcyBXcml0YWJsZVN0cmVhbSAoZS5nLiBodHRwLlJlcXVlc3QpIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmVhbS5Xcml0YWJsZX0gZGVzdCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIG9iai5ib2R5IEJvZHkgb2JqZWN0IGZyb20gdGhlIEJvZHkgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgd3JpdGVUb1N0cmVhbSA9IChkZXN0LCB7Ym9keX0pID0+IHtcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHQvLyBCb2R5IGlzIG51bGxcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2UgaWYgKGlzQmxvYihib2R5KSkge1xuXHRcdC8vIEJvZHkgaXMgQmxvYlxuXHRcdGJvZHkuc3RyZWFtKCkucGlwZShkZXN0KTtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBCb2R5IGlzIGJ1ZmZlclxuXHRcdGRlc3Qud3JpdGUoYm9keSk7XG5cdFx0ZGVzdC5lbmQoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBCb2R5IGlzIHN0cmVhbVxuXHRcdGJvZHkucGlwZShkZXN0KTtcblx0fVxufTtcblxuLyoqXG4gKiBIZWFkZXJzLmpzXG4gKlxuICogSGVhZGVycyBjbGFzcyBvZmZlcnMgY29udmVuaWVudCBoZWxwZXJzXG4gKi9cblxuY29uc3QgdmFsaWRhdGVIZWFkZXJOYW1lID0gdHlwZW9mIGh0dHAudmFsaWRhdGVIZWFkZXJOYW1lID09PSAnZnVuY3Rpb24nID9cblx0aHR0cC52YWxpZGF0ZUhlYWRlck5hbWUgOlxuXHRuYW1lID0+IHtcblx0XHRpZiAoIS9eW1xcXmBcXC1cXHchIyQlJicqKy58fl0rJC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc3QgZXJyID0gbmV3IFR5cGVFcnJvcihgSGVhZGVyIG5hbWUgbXVzdCBiZSBhIHZhbGlkIEhUVFAgdG9rZW4gWyR7bmFtZX1dYCk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnY29kZScsIHt2YWx1ZTogJ0VSUl9JTlZBTElEX0hUVFBfVE9LRU4nfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9O1xuXG5jb25zdCB2YWxpZGF0ZUhlYWRlclZhbHVlID0gdHlwZW9mIGh0dHAudmFsaWRhdGVIZWFkZXJWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/XG5cdGh0dHAudmFsaWRhdGVIZWFkZXJWYWx1ZSA6XG5cdChuYW1lLCB2YWx1ZSkgPT4ge1xuXHRcdGlmICgvW15cXHRcXHUwMDIwLVxcdTAwN0VcXHUwMDgwLVxcdTAwRkZdLy50ZXN0KHZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZXJyID0gbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGNvbnRlbnQgW1wiJHtuYW1lfVwiXWApO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ2NvZGUnLCB7dmFsdWU6ICdFUlJfSU5WQUxJRF9DSEFSJ30pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7SGVhZGVycyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBJdGVyYWJsZTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiB8IEl0ZXJhYmxlPEl0ZXJhYmxlPHN0cmluZz4+fSBIZWFkZXJzSW5pdFxuICovXG5cbi8qKlxuICogVGhpcyBGZXRjaCBBUEkgaW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gcGVyZm9ybSB2YXJpb3VzIGFjdGlvbnMgb24gSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzLlxuICogVGhlc2UgYWN0aW9ucyBpbmNsdWRlIHJldHJpZXZpbmcsIHNldHRpbmcsIGFkZGluZyB0bywgYW5kIHJlbW92aW5nLlxuICogQSBIZWFkZXJzIG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCBoZWFkZXIgbGlzdCwgd2hpY2ggaXMgaW5pdGlhbGx5IGVtcHR5IGFuZCBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgbmFtZSBhbmQgdmFsdWUgcGFpcnMuXG4gKiBZb3UgY2FuIGFkZCB0byB0aGlzIHVzaW5nIG1ldGhvZHMgbGlrZSBhcHBlbmQoKSAoc2VlIEV4YW1wbGVzLilcbiAqIEluIGFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlLCBoZWFkZXIgbmFtZXMgYXJlIG1hdGNoZWQgYnkgY2FzZS1pbnNlbnNpdGl2ZSBieXRlIHNlcXVlbmNlLlxuICpcbiAqL1xuY2xhc3MgSGVhZGVycyBleHRlbmRzIFVSTFNlYXJjaFBhcmFtcyB7XG5cdC8qKlxuXHQgKiBIZWFkZXJzIGNsYXNzXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge0hlYWRlcnNJbml0fSBbaW5pdF0gLSBSZXNwb25zZSBoZWFkZXJzXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihpbml0KSB7XG5cdFx0Ly8gVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbml0IG9iamVjdCBpbiBbbmFtZSwgdmFsdWUocyldW11cblx0XHQvKiogQHR5cGUge3N0cmluZ1tdW119ICovXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xuXHRcdGlmIChpbml0IGluc3RhbmNlb2YgSGVhZGVycykge1xuXHRcdFx0Y29uc3QgcmF3ID0gaW5pdC5yYXcoKTtcblx0XHRcdGZvciAoY29uc3QgW25hbWUsIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocmF3KSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IFtuYW1lLCB2YWx1ZV0pKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGluaXQgPT0gbnVsbCkgOyBlbHNlIGlmICh0eXBlb2YgaW5pdCA9PT0gJ29iamVjdCcgJiYgIXV0aWwudHlwZXMuaXNCb3hlZFByaW1pdGl2ZShpbml0KSkge1xuXHRcdFx0Y29uc3QgbWV0aG9kID0gaW5pdFtTeW1ib2wuaXRlcmF0b3JdO1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsIGVxZXFlcVxuXHRcdFx0aWYgKG1ldGhvZCA9PSBudWxsKSB7XG5cdFx0XHRcdC8vIFJlY29yZDxCeXRlU3RyaW5nLCBCeXRlU3RyaW5nPlxuXHRcdFx0XHRyZXN1bHQucHVzaCguLi5PYmplY3QuZW50cmllcyhpbml0KSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlciBwYWlycyBtdXN0IGJlIGl0ZXJhYmxlJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj5cblx0XHRcdFx0Ly8gTm90ZTogcGVyIHNwZWMgd2UgaGF2ZSB0byBmaXJzdCBleGhhdXN0IHRoZSBsaXN0cyB0aGVuIHByb2Nlc3MgdGhlbVxuXHRcdFx0XHRyZXN1bHQgPSBbLi4uaW5pdF1cblx0XHRcdFx0XHQubWFwKHBhaXIgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgcGFpciAhPT0gJ29iamVjdCcgfHwgdXRpbC50eXBlcy5pc0JveGVkUHJpbWl0aXZlKHBhaXIpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRWFjaCBoZWFkZXIgcGFpciBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9iamVjdCcpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gWy4uLnBhaXJdO1xuXHRcdFx0XHRcdH0pLm1hcChwYWlyID0+IHtcblx0XHRcdFx0XHRcdGlmIChwYWlyLmxlbmd0aCAhPT0gMikge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFYWNoIGhlYWRlciBwYWlyIG11c3QgYmUgYSBuYW1lL3ZhbHVlIHR1cGxlJyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBbLi4ucGFpcl07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBjb25zdHJ1Y3QgXFwnSGVhZGVyc1xcJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlIFxcJyhzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4gb3IgcmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+KScpO1xuXHRcdH1cblxuXHRcdC8vIFZhbGlkYXRlIGFuZCBsb3dlcmNhc2Vcblx0XHRyZXN1bHQgPVxuXHRcdFx0cmVzdWx0Lmxlbmd0aCA+IDAgP1xuXHRcdFx0XHRyZXN1bHQubWFwKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyVmFsdWUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIFtTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKHZhbHVlKV07XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0dW5kZWZpbmVkO1xuXG5cdFx0c3VwZXIocmVzdWx0KTtcblxuXHRcdC8vIFJldHVybmluZyBhIFByb3h5IHRoYXQgd2lsbCBsb3dlcmNhc2Uga2V5IG5hbWVzLCB2YWxpZGF0ZSBwYXJhbWV0ZXJzIGFuZCBzb3J0IGtleXNcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RydWN0b3ItcmV0dXJuXG5cdFx0cmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG5cdFx0XHRnZXQodGFyZ2V0LCBwLCByZWNlaXZlcikge1xuXHRcdFx0XHRzd2l0Y2ggKHApIHtcblx0XHRcdFx0XHRjYXNlICdhcHBlbmQnOlxuXHRcdFx0XHRcdGNhc2UgJ3NldCc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG5hbWUsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyTmFtZShuYW1lKTtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJWYWx1ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbcF0uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXZlcixcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcodmFsdWUpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHRjYXNlICdoYXMnOlxuXHRcdFx0XHRcdGNhc2UgJ2dldEFsbCc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gbmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyTmFtZShuYW1lKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbcF0uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXZlcixcblx0XHRcdFx0XHRcdFx0XHRTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGNhc2UgJ2tleXMnOlxuXHRcdFx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0LnNvcnQoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBTZXQoVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5rZXlzLmNhbGwodGFyZ2V0KSkua2V5cygpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8qIGM4IGlnbm9yZSBuZXh0ICovXG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0fVxuXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdH1cblxuXHRnZXQobmFtZSkge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuXHRcdGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRsZXQgdmFsdWUgPSB2YWx1ZXMuam9pbignLCAnKTtcblx0XHRpZiAoL15jb250ZW50LWVuY29kaW5nJC9pLnRlc3QobmFtZSkpIHtcblx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRmb3JFYWNoKGNhbGxiYWNrKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHRjYWxsYmFjayh0aGlzLmdldChuYW1lKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0KiB2YWx1ZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHR5aWVsZCB0aGlzLmdldChuYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHR5cGUgeygpID0+IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT59XG5cdCAqL1xuXHQqIGVudHJpZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIHRoaXMua2V5cygpKSB7XG5cdFx0XHR5aWVsZCBbbmFtZSwgdGhpcy5nZXQobmFtZSldO1xuXHRcdH1cblx0fVxuXG5cdFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOb2RlLWZldGNoIG5vbi1zcGVjIG1ldGhvZFxuXHQgKiByZXR1cm5pbmcgYWxsIGhlYWRlcnMgYW5kIHRoZWlyIHZhbHVlcyBhcyBhcnJheVxuXHQgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fVxuXHQgKi9cblx0cmF3KCkge1xuXHRcdHJldHVybiBbLi4udGhpcy5rZXlzKCldLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcblx0XHRcdHJlc3VsdFtrZXldID0gdGhpcy5nZXRBbGwoa2V5KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSwge30pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZvciBiZXR0ZXIgY29uc29sZS5sb2coaGVhZGVycykgYW5kIGFsc28gdG8gY29udmVydCBIZWFkZXJzIGludG8gTm9kZS5qcyBSZXF1ZXN0IGNvbXBhdGlibGUgZm9ybWF0XG5cdCAqL1xuXHRbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0oKSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLmtleXMoKV0ucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRBbGwoa2V5KTtcblx0XHRcdC8vIEh0dHAucmVxdWVzdCgpIG9ubHkgc3VwcG9ydHMgc3RyaW5nIGFzIEhvc3QgaGVhZGVyLlxuXHRcdFx0Ly8gVGhpcyBoYWNrIG1ha2VzIHNwZWNpZnlpbmcgY3VzdG9tIEhvc3QgaGVhZGVyIHBvc3NpYmxlLlxuXHRcdFx0aWYgKGtleSA9PT0gJ2hvc3QnKSB7XG5cdFx0XHRcdHJlc3VsdFtrZXldID0gdmFsdWVzWzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSB2YWx1ZXMubGVuZ3RoID4gMSA/IHZhbHVlcyA6IHZhbHVlc1swXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LCB7fSk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZS1zaGFwaW5nIG9iamVjdCBmb3IgV2ViIElETCB0ZXN0c1xuICogT25seSBuZWVkIHRvIGRvIGl0IGZvciBvdmVycmlkZGVuIG1ldGhvZHNcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG5cdEhlYWRlcnMucHJvdG90eXBlLFxuXHRbJ2dldCcsICdlbnRyaWVzJywgJ2ZvckVhY2gnLCAndmFsdWVzJ10ucmVkdWNlKChyZXN1bHQsIHByb3BlcnR5KSA9PiB7XG5cdFx0cmVzdWx0W3Byb3BlcnR5XSA9IHtlbnVtZXJhYmxlOiB0cnVlfTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCB7fSlcbik7XG5cbi8qKlxuICogQ3JlYXRlIGEgSGVhZGVycyBvYmplY3QgZnJvbSBhbiBodHRwLkluY29taW5nTWVzc2FnZS5yYXdIZWFkZXJzLCBpZ25vcmluZyB0aG9zZSB0aGF0IGRvXG4gKiBub3QgY29uZm9ybSB0byBIVFRQIGdyYW1tYXIgcHJvZHVjdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydCgnaHR0cCcpLkluY29taW5nTWVzc2FnZVsncmF3SGVhZGVycyddfSBoZWFkZXJzXG4gKi9cbmZ1bmN0aW9uIGZyb21SYXdIZWFkZXJzKGhlYWRlcnMgPSBbXSkge1xuXHRyZXR1cm4gbmV3IEhlYWRlcnMoXG5cdFx0aGVhZGVyc1xuXHRcdFx0Ly8gU3BsaXQgaW50byBwYWlyc1xuXHRcdFx0LnJlZHVjZSgocmVzdWx0LCB2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG5cdFx0XHRcdGlmIChpbmRleCAlIDIgPT09IDApIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChhcnJheS5zbGljZShpbmRleCwgaW5kZXggKyAyKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSwgW10pXG5cdFx0XHQuZmlsdGVyKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdHZhbGlkYXRlSGVhZGVyVmFsdWUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHQpO1xufVxuXG5jb25zdCByZWRpcmVjdFN0YXR1cyA9IG5ldyBTZXQoWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XSk7XG5cbi8qKlxuICogUmVkaXJlY3QgY29kZSBtYXRjaGluZ1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gU3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUmVkaXJlY3QgPSBjb2RlID0+IHtcblx0cmV0dXJuIHJlZGlyZWN0U3RhdHVzLmhhcyhjb2RlKTtcbn07XG5cbi8qKlxuICogUmVzcG9uc2UuanNcbiAqXG4gKiBSZXNwb25zZSBjbGFzcyBwcm92aWRlcyBjb250ZW50IGRlY29kaW5nXG4gKi9cblxuY29uc3QgSU5URVJOQUxTJDEgPSBTeW1ib2woJ1Jlc3BvbnNlIGludGVybmFscycpO1xuXG4vKipcbiAqIFJlc3BvbnNlIGNsYXNzXG4gKlxuICogQHBhcmFtICAgU3RyZWFtICBib2R5ICBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSAgIE9iamVjdCAgb3B0cyAgUmVzcG9uc2Ugb3B0aW9uc1xuICogQHJldHVybiAgVm9pZFxuICovXG5jbGFzcyBSZXNwb25zZSBleHRlbmRzIEJvZHkge1xuXHRjb25zdHJ1Y3Rvcihib2R5ID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0c3VwZXIoYm9keSwgb3B0aW9ucyk7XG5cblx0XHRjb25zdCBzdGF0dXMgPSBvcHRpb25zLnN0YXR1cyB8fCAyMDA7XG5cdFx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG5cblx0XHRpZiAoYm9keSAhPT0gbnVsbCAmJiAhaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpKSB7XG5cdFx0XHRjb25zdCBjb250ZW50VHlwZSA9IGV4dHJhY3RDb250ZW50VHlwZShib2R5KTtcblx0XHRcdGlmIChjb250ZW50VHlwZSkge1xuXHRcdFx0XHRoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDFdID0ge1xuXHRcdFx0dXJsOiBvcHRpb25zLnVybCxcblx0XHRcdHN0YXR1cyxcblx0XHRcdHN0YXR1c1RleHQ6IG9wdGlvbnMuc3RhdHVzVGV4dCB8fCAnJyxcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRjb3VudGVyOiBvcHRpb25zLmNvdW50ZXIsXG5cdFx0XHRoaWdoV2F0ZXJNYXJrOiBvcHRpb25zLmhpZ2hXYXRlck1hcmtcblx0XHR9O1xuXHR9XG5cblx0Z2V0IHVybCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0udXJsIHx8ICcnO1xuXHR9XG5cblx0Z2V0IHN0YXR1cygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uc3RhdHVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHByb3BlcnR5IHJlcHJlc2VudGluZyBpZiB0aGUgcmVxdWVzdCBlbmRlZCBub3JtYWxseVxuXHQgKi9cblx0Z2V0IG9rKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cyA8IDMwMDtcblx0fVxuXG5cdGdldCByZWRpcmVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5jb3VudGVyID4gMDtcblx0fVxuXG5cdGdldCBzdGF0dXNUZXh0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXNUZXh0O1xuXHR9XG5cblx0Z2V0IGhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLmhlYWRlcnM7XG5cdH1cblxuXHRnZXQgaGlnaFdhdGVyTWFyaygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uaGlnaFdhdGVyTWFyaztcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZSB0aGlzIHJlc3BvbnNlXG5cdCAqXG5cdCAqIEByZXR1cm4gIFJlc3BvbnNlXG5cdCAqL1xuXHRjbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKGNsb25lKHRoaXMsIHRoaXMuaGlnaFdhdGVyTWFyayksIHtcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRzdGF0dXM6IHRoaXMuc3RhdHVzLFxuXHRcdFx0c3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0b2s6IHRoaXMub2ssXG5cdFx0XHRyZWRpcmVjdGVkOiB0aGlzLnJlZGlyZWN0ZWQsXG5cdFx0XHRzaXplOiB0aGlzLnNpemVcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsICAgIFRoZSBVUkwgdGhhdCB0aGUgbmV3IHJlc3BvbnNlIGlzIHRvIG9yaWdpbmF0ZSBmcm9tLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzIEFuIG9wdGlvbmFsIHN0YXR1cyBjb2RlIGZvciB0aGUgcmVzcG9uc2UgKGUuZy4sIDMwMi4pXG5cdCAqIEByZXR1cm5zIHtSZXNwb25zZX0gICAgQSBSZXNwb25zZSBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgcmVkaXJlY3QodXJsLCBzdGF0dXMgPSAzMDIpIHtcblx0XHRpZiAoIWlzUmVkaXJlY3Qoc3RhdHVzKSkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwicmVkaXJlY3RcIiBvbiBcInJlc3BvbnNlXCI6IEludmFsaWQgc3RhdHVzIGNvZGUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0bG9jYXRpb246IG5ldyBVUkwodXJsKS50b1N0cmluZygpXG5cdFx0XHR9LFxuXHRcdFx0c3RhdHVzXG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuICdSZXNwb25zZSc7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG5cdHVybDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRzdGF0dXM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0b2s6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0cmVkaXJlY3RlZDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRzdGF0dXNUZXh0OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGhlYWRlcnM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0Y2xvbmU6IHtlbnVtZXJhYmxlOiB0cnVlfVxufSk7XG5cbmNvbnN0IGdldFNlYXJjaCA9IHBhcnNlZFVSTCA9PiB7XG5cdGlmIChwYXJzZWRVUkwuc2VhcmNoKSB7XG5cdFx0cmV0dXJuIHBhcnNlZFVSTC5zZWFyY2g7XG5cdH1cblxuXHRjb25zdCBsYXN0T2Zmc2V0ID0gcGFyc2VkVVJMLmhyZWYubGVuZ3RoIC0gMTtcblx0Y29uc3QgaGFzaCA9IHBhcnNlZFVSTC5oYXNoIHx8IChwYXJzZWRVUkwuaHJlZltsYXN0T2Zmc2V0XSA9PT0gJyMnID8gJyMnIDogJycpO1xuXHRyZXR1cm4gcGFyc2VkVVJMLmhyZWZbbGFzdE9mZnNldCAtIGhhc2gubGVuZ3RoXSA9PT0gJz8nID8gJz8nIDogJyc7XG59O1xuXG5jb25zdCBJTlRFUk5BTFMkMiA9IFN5bWJvbCgnUmVxdWVzdCBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBpbnN0YW5jZSBvZiBSZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNSZXF1ZXN0ID0gb2JqZWN0ID0+IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiBvYmplY3RbSU5URVJOQUxTJDJdID09PSAnb2JqZWN0J1xuXHQpO1xufTtcblxuLyoqXG4gKiBSZXF1ZXN0IGNsYXNzXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnB1dCAgVXJsIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEBwYXJhbSAgIE9iamVjdCAgaW5pdCAgIEN1c3RvbSBvcHRpb25zXG4gKiBAcmV0dXJuICBWb2lkXG4gKi9cbmNsYXNzIFJlcXVlc3QgZXh0ZW5kcyBCb2R5IHtcblx0Y29uc3RydWN0b3IoaW5wdXQsIGluaXQgPSB7fSkge1xuXHRcdGxldCBwYXJzZWRVUkw7XG5cblx0XHQvLyBOb3JtYWxpemUgaW5wdXQgYW5kIGZvcmNlIFVSTCB0byBiZSBlbmNvZGVkIGFzIFVURi04IChodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy8yNDUpXG5cdFx0aWYgKGlzUmVxdWVzdChpbnB1dCkpIHtcblx0XHRcdHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQudXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyc2VkVVJMID0gbmV3IFVSTChpbnB1dCk7XG5cdFx0XHRpbnB1dCA9IHt9O1xuXHRcdH1cblxuXHRcdGxldCBtZXRob2QgPSBpbml0Lm1ldGhvZCB8fCBpbnB1dC5tZXRob2QgfHwgJ0dFVCc7XG5cdFx0bWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCwgZXFlcWVxXG5cdFx0aWYgKCgoaW5pdC5ib2R5ICE9IG51bGwgfHwgaXNSZXF1ZXN0KGlucHV0KSkgJiYgaW5wdXQuYm9keSAhPT0gbnVsbCkgJiZcblx0XHRcdChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5Jyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5wdXRCb2R5ID0gaW5pdC5ib2R5ID9cblx0XHRcdGluaXQuYm9keSA6XG5cdFx0XHQoaXNSZXF1ZXN0KGlucHV0KSAmJiBpbnB1dC5ib2R5ICE9PSBudWxsID9cblx0XHRcdFx0Y2xvbmUoaW5wdXQpIDpcblx0XHRcdFx0bnVsbCk7XG5cblx0XHRzdXBlcihpbnB1dEJvZHksIHtcblx0XHRcdHNpemU6IGluaXQuc2l6ZSB8fCBpbnB1dC5zaXplIHx8IDBcblx0XHR9KTtcblxuXHRcdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMgfHwgaW5wdXQuaGVhZGVycyB8fCB7fSk7XG5cblx0XHRpZiAoaW5wdXRCb2R5ICE9PSBudWxsICYmICFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gZXh0cmFjdENvbnRlbnRUeXBlKGlucHV0Qm9keSwgdGhpcyk7XG5cdFx0XHRpZiAoY29udGVudFR5cGUpIHtcblx0XHRcdFx0aGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2lnbmFsID0gaXNSZXF1ZXN0KGlucHV0KSA/XG5cdFx0XHRpbnB1dC5zaWduYWwgOlxuXHRcdFx0bnVsbDtcblx0XHRpZiAoJ3NpZ25hbCcgaW4gaW5pdCkge1xuXHRcdFx0c2lnbmFsID0gaW5pdC5zaWduYWw7XG5cdFx0fVxuXG5cdFx0aWYgKHNpZ25hbCAhPT0gbnVsbCAmJiAhaXNBYm9ydFNpZ25hbChzaWduYWwpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBzaWduYWwgdG8gYmUgYW4gaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCcpO1xuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDJdID0ge1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0cmVkaXJlY3Q6IGluaXQucmVkaXJlY3QgfHwgaW5wdXQucmVkaXJlY3QgfHwgJ2ZvbGxvdycsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0cGFyc2VkVVJMLFxuXHRcdFx0c2lnbmFsXG5cdFx0fTtcblxuXHRcdC8vIE5vZGUtZmV0Y2gtb25seSBvcHRpb25zXG5cdFx0dGhpcy5mb2xsb3cgPSBpbml0LmZvbGxvdyA9PT0gdW5kZWZpbmVkID8gKGlucHV0LmZvbGxvdyA9PT0gdW5kZWZpbmVkID8gMjAgOiBpbnB1dC5mb2xsb3cpIDogaW5pdC5mb2xsb3c7XG5cdFx0dGhpcy5jb21wcmVzcyA9IGluaXQuY29tcHJlc3MgPT09IHVuZGVmaW5lZCA/IChpbnB1dC5jb21wcmVzcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGlucHV0LmNvbXByZXNzKSA6IGluaXQuY29tcHJlc3M7XG5cdFx0dGhpcy5jb3VudGVyID0gaW5pdC5jb3VudGVyIHx8IGlucHV0LmNvdW50ZXIgfHwgMDtcblx0XHR0aGlzLmFnZW50ID0gaW5pdC5hZ2VudCB8fCBpbnB1dC5hZ2VudDtcblx0XHR0aGlzLmhpZ2hXYXRlck1hcmsgPSBpbml0LmhpZ2hXYXRlck1hcmsgfHwgaW5wdXQuaGlnaFdhdGVyTWFyayB8fCAxNjM4NDtcblx0XHR0aGlzLmluc2VjdXJlSFRUUFBhcnNlciA9IGluaXQuaW5zZWN1cmVIVFRQUGFyc2VyIHx8IGlucHV0Lmluc2VjdXJlSFRUUFBhcnNlciB8fCBmYWxzZTtcblx0fVxuXG5cdGdldCBtZXRob2QoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLm1ldGhvZDtcblx0fVxuXG5cdGdldCB1cmwoKSB7XG5cdFx0cmV0dXJuIHVybC5mb3JtYXQodGhpc1tJTlRFUk5BTFMkMl0ucGFyc2VkVVJMKTtcblx0fVxuXG5cdGdldCBoZWFkZXJzKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5oZWFkZXJzO1xuXHR9XG5cblx0Z2V0IHJlZGlyZWN0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5yZWRpcmVjdDtcblx0fVxuXG5cdGdldCBzaWduYWwoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLnNpZ25hbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZSB0aGlzIHJlcXVlc3Rcblx0ICpcblx0ICogQHJldHVybiAgUmVxdWVzdFxuXHQgKi9cblx0Y2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuXHR9XG5cblx0Z2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuXHRcdHJldHVybiAnUmVxdWVzdCc7XG5cdH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcblx0bWV0aG9kOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHVybDoge2VudW1lcmFibGU6IHRydWV9LFxuXHRoZWFkZXJzOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHJlZGlyZWN0OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGNsb25lOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHNpZ25hbDoge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgUmVxdWVzdCB0byBOb2RlLmpzIGh0dHAgcmVxdWVzdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAgIFJlcXVlc3QgIEEgUmVxdWVzdCBpbnN0YW5jZVxuICogQHJldHVybiAgT2JqZWN0ICAgVGhlIG9wdGlvbnMgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBodHRwLnJlcXVlc3RcbiAqL1xuY29uc3QgZ2V0Tm9kZVJlcXVlc3RPcHRpb25zID0gcmVxdWVzdCA9PiB7XG5cdGNvbnN0IHtwYXJzZWRVUkx9ID0gcmVxdWVzdFtJTlRFUk5BTFMkMl07XG5cdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0W0lOVEVSTkFMUyQyXS5oZWFkZXJzKTtcblxuXHQvLyBGZXRjaCBzdGVwIDEuM1xuXHRpZiAoIWhlYWRlcnMuaGFzKCdBY2NlcHQnKSkge1xuXHRcdGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnKi8qJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggc3RlcHMgMi40LTIuN1xuXHRsZXQgY29udGVudExlbmd0aFZhbHVlID0gbnVsbDtcblx0aWYgKHJlcXVlc3QuYm9keSA9PT0gbnVsbCAmJiAvXihwb3N0fHB1dCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZCkpIHtcblx0XHRjb250ZW50TGVuZ3RoVmFsdWUgPSAnMCc7XG5cdH1cblxuXHRpZiAocmVxdWVzdC5ib2R5ICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgdG90YWxCeXRlcyA9IGdldFRvdGFsQnl0ZXMocmVxdWVzdCk7XG5cdFx0Ly8gU2V0IENvbnRlbnQtTGVuZ3RoIGlmIHRvdGFsQnl0ZXMgaXMgYSBudW1iZXIgKHRoYXQgaXMgbm90IE5hTilcblx0XHRpZiAodHlwZW9mIHRvdGFsQnl0ZXMgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odG90YWxCeXRlcykpIHtcblx0XHRcdGNvbnRlbnRMZW5ndGhWYWx1ZSA9IFN0cmluZyh0b3RhbEJ5dGVzKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoY29udGVudExlbmd0aFZhbHVlKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgY29udGVudExlbmd0aFZhbHVlKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBzdGVwIDIuMTFcblx0aWYgKCFoZWFkZXJzLmhhcygnVXNlci1BZ2VudCcpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnbm9kZS1mZXRjaCcpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIHN0ZXAgMi4xNVxuXHRpZiAocmVxdWVzdC5jb21wcmVzcyAmJiAhaGVhZGVycy5oYXMoJ0FjY2VwdC1FbmNvZGluZycpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0FjY2VwdC1FbmNvZGluZycsICdnemlwLGRlZmxhdGUsYnInKTtcblx0fVxuXG5cdGxldCB7YWdlbnR9ID0gcmVxdWVzdDtcblx0aWYgKHR5cGVvZiBhZ2VudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGFnZW50ID0gYWdlbnQocGFyc2VkVVJMKTtcblx0fVxuXG5cdGlmICghaGVhZGVycy5oYXMoJ0Nvbm5lY3Rpb24nKSAmJiAhYWdlbnQpIHtcblx0XHRoZWFkZXJzLnNldCgnQ29ubmVjdGlvbicsICdjbG9zZScpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgNC4yXG5cdC8vIGNodW5rZWQgZW5jb2RpbmcgaXMgaGFuZGxlZCBieSBOb2RlLmpzXG5cblx0Y29uc3Qgc2VhcmNoID0gZ2V0U2VhcmNoKHBhcnNlZFVSTCk7XG5cblx0Ly8gTWFudWFsbHkgc3ByZWFkIHRoZSBVUkwgb2JqZWN0IGluc3RlYWQgb2Ygc3ByZWFkIHN5bnRheFxuXHRjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcblx0XHRwYXRoOiBwYXJzZWRVUkwucGF0aG5hbWUgKyBzZWFyY2gsXG5cdFx0cGF0aG5hbWU6IHBhcnNlZFVSTC5wYXRobmFtZSxcblx0XHRob3N0bmFtZTogcGFyc2VkVVJMLmhvc3RuYW1lLFxuXHRcdHByb3RvY29sOiBwYXJzZWRVUkwucHJvdG9jb2wsXG5cdFx0cG9ydDogcGFyc2VkVVJMLnBvcnQsXG5cdFx0aGFzaDogcGFyc2VkVVJMLmhhc2gsXG5cdFx0c2VhcmNoOiBwYXJzZWRVUkwuc2VhcmNoLFxuXHRcdHF1ZXJ5OiBwYXJzZWRVUkwucXVlcnksXG5cdFx0aHJlZjogcGFyc2VkVVJMLmhyZWYsXG5cdFx0bWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcblx0XHRoZWFkZXJzOiBoZWFkZXJzW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldKCksXG5cdFx0aW5zZWN1cmVIVFRQUGFyc2VyOiByZXF1ZXN0Lmluc2VjdXJlSFRUUFBhcnNlcixcblx0XHRhZ2VudFxuXHR9O1xuXG5cdHJldHVybiByZXF1ZXN0T3B0aW9ucztcbn07XG5cbi8qKlxuICogQWJvcnRFcnJvciBpbnRlcmZhY2UgZm9yIGNhbmNlbGxlZCByZXF1ZXN0c1xuICovXG5jbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRmV0Y2hCYXNlRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCB0eXBlID0gJ2Fib3J0ZWQnKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgdHlwZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBJbmRleC5qc1xuICpcbiAqIGEgcmVxdWVzdCBBUEkgY29tcGF0aWJsZSB3aXRoIHdpbmRvdy5mZXRjaFxuICpcbiAqIEFsbCBzcGVjIGFsZ29yaXRobSBzdGVwIG51bWJlcnMgYXJlIGJhc2VkIG9uIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnL2NvbW1pdC1zbmFwc2hvdHMvYWU3MTY4MjJjYjNhNjE4NDMyMjZjZDA5MGVlZmM2NTg5NDQ2YzFkMi8uXG4gKi9cblxuY29uc3Qgc3VwcG9ydGVkU2NoZW1hcyA9IG5ldyBTZXQoWydkYXRhOicsICdodHRwOicsICdodHRwczonXSk7XG5cbi8qKlxuICogRmV0Y2ggZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gICB7c3RyaW5nIHwgVVJMIHwgaW1wb3J0KCcuL3JlcXVlc3QnKS5kZWZhdWx0fSB1cmwgLSBBYnNvbHV0ZSB1cmwgb3IgUmVxdWVzdCBpbnN0YW5jZVxuICogQHBhcmFtICAgeyp9IFtvcHRpb25zX10gLSBGZXRjaCBvcHRpb25zXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxpbXBvcnQoJy4vcmVzcG9uc2UnKS5kZWZhdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2godXJsLCBvcHRpb25zXykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdC8vIEJ1aWxkIHJlcXVlc3Qgb2JqZWN0XG5cdFx0Y29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwgb3B0aW9uc18pO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXROb2RlUmVxdWVzdE9wdGlvbnMocmVxdWVzdCk7XG5cdFx0aWYgKCFzdXBwb3J0ZWRTY2hlbWFzLmhhcyhvcHRpb25zLnByb3RvY29sKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgbm9kZS1mZXRjaCBjYW5ub3QgbG9hZCAke3VybH0uIFVSTCBzY2hlbWUgXCIke29wdGlvbnMucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyl9XCIgaXMgbm90IHN1cHBvcnRlZC5gKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5wcm90b2NvbCA9PT0gJ2RhdGE6Jykge1xuXHRcdFx0Y29uc3QgZGF0YSA9IGRhdGFVcmlUb0J1ZmZlcihyZXF1ZXN0LnVybCk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZShkYXRhLCB7aGVhZGVyczogeydDb250ZW50LVR5cGUnOiBkYXRhLnR5cGVGdWxsfX0pO1xuXHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV3JhcCBodHRwLnJlcXVlc3QgaW50byBmZXRjaFxuXHRcdGNvbnN0IHNlbmQgPSAob3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwcyA6IGh0dHApLnJlcXVlc3Q7XG5cdFx0Y29uc3Qge3NpZ25hbH0gPSByZXF1ZXN0O1xuXHRcdGxldCByZXNwb25zZSA9IG51bGw7XG5cblx0XHRjb25zdCBhYm9ydCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IEFib3J0RXJyb3IoJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJyk7XG5cdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0aWYgKHJlcXVlc3QuYm9keSAmJiByZXF1ZXN0LmJvZHkgaW5zdGFuY2VvZiBTdHJlYW0uUmVhZGFibGUpIHtcblx0XHRcdFx0cmVxdWVzdC5ib2R5LmRlc3Ryb3koZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5ib2R5KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2UuYm9keS5lbWl0KCdlcnJvcicsIGVycm9yKTtcblx0XHR9O1xuXG5cdFx0aWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhYm9ydEFuZEZpbmFsaXplID0gKCkgPT4ge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdGZpbmFsaXplKCk7XG5cdFx0fTtcblxuXHRcdC8vIFNlbmQgcmVxdWVzdFxuXHRcdGNvbnN0IHJlcXVlc3RfID0gc2VuZChvcHRpb25zKTtcblxuXHRcdGlmIChzaWduYWwpIHtcblx0XHRcdHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QW5kRmluYWxpemUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpbmFsaXplID0gKCkgPT4ge1xuXHRcdFx0cmVxdWVzdF8uYWJvcnQoKTtcblx0XHRcdGlmIChzaWduYWwpIHtcblx0XHRcdFx0c2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJlcXVlc3RfLm9uKCdlcnJvcicsIGVyciA9PiB7XG5cdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYHJlcXVlc3QgdG8gJHtyZXF1ZXN0LnVybH0gZmFpbGVkLCByZWFzb246ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdFx0ZmluYWxpemUoKTtcblx0XHR9KTtcblxuXHRcdHJlcXVlc3RfLm9uKCdyZXNwb25zZScsIHJlc3BvbnNlXyA9PiB7XG5cdFx0XHRyZXF1ZXN0Xy5zZXRUaW1lb3V0KDApO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGZyb21SYXdIZWFkZXJzKHJlc3BvbnNlXy5yYXdIZWFkZXJzKTtcblxuXHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDVcblx0XHRcdGlmIChpc1JlZGlyZWN0KHJlc3BvbnNlXy5zdGF0dXNDb2RlKSkge1xuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS4yXG5cdFx0XHRcdGNvbnN0IGxvY2F0aW9uID0gaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk7XG5cblx0XHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDUuM1xuXHRcdFx0XHRjb25zdCBsb2NhdGlvblVSTCA9IGxvY2F0aW9uID09PSBudWxsID8gbnVsbCA6IG5ldyBVUkwobG9jYXRpb24sIHJlcXVlc3QudXJsKTtcblxuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS41XG5cdFx0XHRcdHN3aXRjaCAocmVxdWVzdC5yZWRpcmVjdCkge1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yJzpcblx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgdXJpIHJlcXVlc3RlZCByZXNwb25kcyB3aXRoIGEgcmVkaXJlY3QsIHJlZGlyZWN0IG1vZGUgaXMgc2V0IHRvIGVycm9yOiAke3JlcXVlc3QudXJsfWAsICduby1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0Y2FzZSAnbWFudWFsJzpcblx0XHRcdFx0XHRcdC8vIE5vZGUtZmV0Y2gtc3BlY2lmaWMgc3RlcDogbWFrZSBtYW51YWwgcmVkaXJlY3QgYSBiaXQgZWFzaWVyIHRvIHVzZSBieSBzZXR0aW5nIHRoZSBMb2NhdGlvbiBoZWFkZXIgdmFsdWUgdG8gdGhlIHJlc29sdmVkIFVSTC5cblx0XHRcdFx0XHRcdGlmIChsb2NhdGlvblVSTCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgY29ycnVwdGVkIGhlYWRlclxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIGxvY2F0aW9uVVJMKTtcblx0XHRcdFx0XHRcdFx0XHQvKiBjOCBpZ25vcmUgbmV4dCAzICovXG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmb2xsb3cnOiB7XG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMlxuXHRcdFx0XHRcdFx0aWYgKGxvY2F0aW9uVVJMID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgNVxuXHRcdFx0XHRcdFx0aWYgKHJlcXVlc3QuY291bnRlciA+PSByZXF1ZXN0LmZvbGxvdykge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYG1heGltdW0gcmVkaXJlY3QgcmVhY2hlZCBhdDogJHtyZXF1ZXN0LnVybH1gLCAnbWF4LXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA2IChjb3VudGVyIGluY3JlbWVudClcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBSZXF1ZXN0IG9iamVjdC5cblx0XHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOiBuZXcgSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpLFxuXHRcdFx0XHRcdFx0XHRmb2xsb3c6IHJlcXVlc3QuZm9sbG93LFxuXHRcdFx0XHRcdFx0XHRjb3VudGVyOiByZXF1ZXN0LmNvdW50ZXIgKyAxLFxuXHRcdFx0XHRcdFx0XHRhZ2VudDogcmVxdWVzdC5hZ2VudCxcblx0XHRcdFx0XHRcdFx0Y29tcHJlc3M6IHJlcXVlc3QuY29tcHJlc3MsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHJlcXVlc3QuYm9keSxcblx0XHRcdFx0XHRcdFx0c2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcblx0XHRcdFx0XHRcdFx0c2l6ZTogcmVxdWVzdC5zaXplXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgOVxuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlXy5zdGF0dXNDb2RlICE9PSAzMDMgJiYgcmVxdWVzdC5ib2R5ICYmIG9wdGlvbnNfLmJvZHkgaW5zdGFuY2VvZiBTdHJlYW0uUmVhZGFibGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKCdDYW5ub3QgZm9sbG93IHJlZGlyZWN0IHdpdGggYm9keSBiZWluZyBhIHJlYWRhYmxlIHN0cmVhbScsICd1bnN1cHBvcnRlZC1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMTFcblx0XHRcdFx0XHRcdGlmIChyZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAzIHx8ICgocmVzcG9uc2VfLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAyKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSkge1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0aW9ucy5tZXRob2QgPSAnR0VUJztcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdGlvbnMuYm9keSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ2NvbnRlbnQtbGVuZ3RoJyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCAxNVxuXHRcdFx0XHRcdFx0cmVzb2x2ZShmZXRjaChuZXcgUmVxdWVzdChsb2NhdGlvblVSTCwgcmVxdWVzdE9wdGlvbnMpKSk7XG5cdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBEbyBub3RoaW5nXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUHJlcGFyZSByZXNwb25zZVxuXHRcdFx0cmVzcG9uc2VfLm9uY2UoJ2VuZCcsICgpID0+IHtcblx0XHRcdFx0aWYgKHNpZ25hbCkge1xuXHRcdFx0XHRcdHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QW5kRmluYWxpemUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUocmVzcG9uc2VfLCBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKCksIGVycm9yID0+IHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzI5Mzc2XG5cdFx0XHRpZiAocHJvY2Vzcy52ZXJzaW9uIDwgJ3YxMi4xMCcpIHtcblx0XHRcdFx0cmVzcG9uc2VfLm9uKCdhYm9ydGVkJywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlc3BvbnNlT3B0aW9ucyA9IHtcblx0XHRcdFx0dXJsOiByZXF1ZXN0LnVybCxcblx0XHRcdFx0c3RhdHVzOiByZXNwb25zZV8uc3RhdHVzQ29kZSxcblx0XHRcdFx0c3RhdHVzVGV4dDogcmVzcG9uc2VfLnN0YXR1c01lc3NhZ2UsXG5cdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdHNpemU6IHJlcXVlc3Quc2l6ZSxcblx0XHRcdFx0Y291bnRlcjogcmVxdWVzdC5jb3VudGVyLFxuXHRcdFx0XHRoaWdoV2F0ZXJNYXJrOiByZXF1ZXN0LmhpZ2hXYXRlck1hcmtcblx0XHRcdH07XG5cblx0XHRcdC8vIEhUVFAtbmV0d29yayBmZXRjaCBzdGVwIDEyLjEuMS4zXG5cdFx0XHRjb25zdCBjb2RpbmdzID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtRW5jb2RpbmcnKTtcblxuXHRcdFx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgMTIuMS4xLjQ6IGhhbmRsZSBjb250ZW50IGNvZGluZ3NcblxuXHRcdFx0Ly8gaW4gZm9sbG93aW5nIHNjZW5hcmlvcyB3ZSBpZ25vcmUgY29tcHJlc3Npb24gc3VwcG9ydFxuXHRcdFx0Ly8gMS4gY29tcHJlc3Npb24gc3VwcG9ydCBpcyBkaXNhYmxlZFxuXHRcdFx0Ly8gMi4gSEVBRCByZXF1ZXN0XG5cdFx0XHQvLyAzLiBubyBDb250ZW50LUVuY29kaW5nIGhlYWRlclxuXHRcdFx0Ly8gNC4gbm8gY29udGVudCByZXNwb25zZSAoMjA0KVxuXHRcdFx0Ly8gNS4gY29udGVudCBub3QgbW9kaWZpZWQgcmVzcG9uc2UgKDMwNClcblx0XHRcdGlmICghcmVxdWVzdC5jb21wcmVzcyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnIHx8IGNvZGluZ3MgPT09IG51bGwgfHwgcmVzcG9uc2VfLnN0YXR1c0NvZGUgPT09IDIwNCB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBOb2RlIHY2K1xuXHRcdFx0Ly8gQmUgbGVzcyBzdHJpY3Qgd2hlbiBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2Ugc29tZXRpbWVzXG5cdFx0XHQvLyBzZXJ2ZXJzIHNlbmQgc2xpZ2h0bHkgaW52YWxpZCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcblx0XHRcdC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cblx0XHRcdC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG5cdFx0XHRjb25zdCB6bGliT3B0aW9ucyA9IHtcblx0XHRcdFx0Zmx1c2g6IHpsaWIuWl9TWU5DX0ZMVVNILFxuXHRcdFx0XHRmaW5pc2hGbHVzaDogemxpYi5aX1NZTkNfRkxVU0hcblx0XHRcdH07XG5cblx0XHRcdC8vIEZvciBnemlwXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2d6aXAnIHx8IGNvZGluZ3MgPT09ICd4LWd6aXAnKSB7XG5cdFx0XHRcdGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUoYm9keSwgemxpYi5jcmVhdGVHdW56aXAoemxpYk9wdGlvbnMpLCBlcnJvciA9PiB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBkZWZsYXRlXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2RlZmxhdGUnIHx8IGNvZGluZ3MgPT09ICd4LWRlZmxhdGUnKSB7XG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgaW5mYW1vdXMgcmF3IGRlZmxhdGUgcmVzcG9uc2UgZnJvbSBvbGQgc2VydmVyc1xuXHRcdFx0XHQvLyBhIGhhY2sgZm9yIG9sZCBJSVMgYW5kIEFwYWNoZSBzZXJ2ZXJzXG5cdFx0XHRcdGNvbnN0IHJhdyA9IFN0cmVhbS5waXBlbGluZShyZXNwb25zZV8sIG5ldyBTdHJlYW0uUGFzc1Rocm91Z2goKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyYXcub25jZSgnZGF0YScsIGNodW5rID0+IHtcblx0XHRcdFx0XHQvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzUxOTgyOFxuXHRcdFx0XHRcdGlmICgoY2h1bmtbMF0gJiAweDBGKSA9PT0gMHgwOCkge1xuXHRcdFx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUluZmxhdGUoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBTdHJlYW0ucGlwZWxpbmUoYm9keSwgemxpYi5jcmVhdGVJbmZsYXRlUmF3KCksIGVycm9yID0+IHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBiclxuXHRcdFx0aWYgKGNvZGluZ3MgPT09ICdicicpIHtcblx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZU9wdGlvbnMpO1xuXHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIHVzZSByZXNwb25zZSBhcy1pc1xuXHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VPcHRpb25zKTtcblx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdH0pO1xuXG5cdFx0d3JpdGVUb1N0cmVhbShyZXF1ZXN0XywgcmVxdWVzdCk7XG5cdH0pO1xufVxuXG5leHBvcnRzLkFib3J0RXJyb3IgPSBBYm9ydEVycm9yO1xuZXhwb3J0cy5GZXRjaEVycm9yID0gRmV0Y2hFcnJvcjtcbmV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnM7XG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuZXhwb3J0cy5kZWZhdWx0ID0gZmV0Y2g7XG5leHBvcnRzLmlzUmVkaXJlY3QgPSBpc1JlZGlyZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguY2pzLm1hcFxuIiwiLyoqXG4gKiB3ZWItc3RyZWFtcy1wb2x5ZmlsbCB2My4yLjBcbiAqL1xuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LnN5bWJvbFwiIC8+XG5jb25zdCBTeW1ib2xQb2x5ZmlsbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgP1xuICAgIFN5bWJvbCA6XG4gICAgZGVzY3JpcHRpb24gPT4gYFN5bWJvbCgke2Rlc2NyaXB0aW9ufSlgO1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxuZnVuY3Rpb24gbm9vcCgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFscygpIHtcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuY29uc3QgZ2xvYmFscyA9IGdldEdsb2JhbHMoKTtcblxuZnVuY3Rpb24gdHlwZUlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmNvbnN0IHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbiA9IG5vb3A7XG5cbmNvbnN0IG9yaWdpbmFsUHJvbWlzZSA9IFByb21pc2U7XG5jb25zdCBvcmlnaW5hbFByb21pc2VUaGVuID0gUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcbmNvbnN0IG9yaWdpbmFsUHJvbWlzZVJlc29sdmUgPSBQcm9taXNlLnJlc29sdmUuYmluZChvcmlnaW5hbFByb21pc2UpO1xuY29uc3Qgb3JpZ2luYWxQcm9taXNlUmVqZWN0ID0gUHJvbWlzZS5yZWplY3QuYmluZChvcmlnaW5hbFByb21pc2UpO1xuZnVuY3Rpb24gbmV3UHJvbWlzZShleGVjdXRvcikge1xuICAgIHJldHVybiBuZXcgb3JpZ2luYWxQcm9taXNlKGV4ZWN1dG9yKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VSZXNvbHZlZFdpdGgodmFsdWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYXNvbikge1xuICAgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZWplY3QocmVhc29uKTtcbn1cbmZ1bmN0aW9uIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIC8vIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIGJlaGF2aW91ciBmcm9tIEphdmFTY3JpcHQsIHNvIHRoaXMgaXMganVzdCBhblxuICAgIC8vIGFwcHJveGltYXRpb24uXG4gICAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59XG5mdW5jdGlvbiB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIFBlcmZvcm1Qcm9taXNlVGhlbihQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpLCB1bmRlZmluZWQsIHJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbik7XG59XG5mdW5jdGlvbiB1cG9uRnVsZmlsbG1lbnQocHJvbWlzZSwgb25GdWxmaWxsZWQpIHtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCBvbkZ1bGZpbGxlZCk7XG59XG5mdW5jdGlvbiB1cG9uUmVqZWN0aW9uKHByb21pc2UsIG9uUmVqZWN0ZWQpIHtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCB1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtUHJvbWlzZVdpdGgocHJvbWlzZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xufVxuZnVuY3Rpb24gc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwcm9taXNlKSB7XG4gICAgUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTtcbn1cbmNvbnN0IHF1ZXVlTWljcm90YXNrID0gKCgpID0+IHtcbiAgICBjb25zdCBnbG9iYWxRdWV1ZU1pY3JvdGFzayA9IGdsb2JhbHMgJiYgZ2xvYmFscy5xdWV1ZU1pY3JvdGFzaztcbiAgICBpZiAodHlwZW9mIGdsb2JhbFF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxRdWV1ZU1pY3JvdGFzaztcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIHJldHVybiAoZm4pID0+IFBlcmZvcm1Qcm9taXNlVGhlbihyZXNvbHZlZFByb21pc2UsIGZuKTtcbn0pKCk7XG5mdW5jdGlvbiByZWZsZWN0Q2FsbChGLCBWLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChGLCBWLCBhcmdzKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VDYWxsKEYsIFYsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aChyZWZsZWN0Q2FsbChGLCBWLCBhcmdzKSk7XG4gICAgfVxuICAgIGNhdGNoICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aCh2YWx1ZSk7XG4gICAgfVxufVxuXG4vLyBPcmlnaW5hbCBmcm9tIENocm9taXVtXG4vLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvMGFlZTQ0MzRhNGRiYTQyYTQyYWJhZWE5YmZiYzBjZDE5NmE2M2JjMS90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9jb3JlL3N0cmVhbXMvU2ltcGxlUXVldWUuanNcbmNvbnN0IFFVRVVFX01BWF9BUlJBWV9TSVpFID0gMTYzODQ7XG4vKipcbiAqIFNpbXBsZSBxdWV1ZSBzdHJ1Y3R1cmUuXG4gKlxuICogQXZvaWRzIHNjYWxhYmlsaXR5IGlzc3VlcyB3aXRoIHVzaW5nIGEgcGFja2VkIGFycmF5IGRpcmVjdGx5IGJ5IHVzaW5nXG4gKiBtdWx0aXBsZSBhcnJheXMgaW4gYSBsaW5rZWQgbGlzdCBhbmQga2VlcGluZyB0aGUgYXJyYXkgc2l6ZSBib3VuZGVkLlxuICovXG5jbGFzcyBTaW1wbGVRdWV1ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgICAvLyBfZnJvbnQgYW5kIF9iYWNrIGFyZSBhbHdheXMgZGVmaW5lZC5cbiAgICAgICAgdGhpcy5fZnJvbnQgPSB7XG4gICAgICAgICAgICBfZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgX25leHQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iYWNrID0gdGhpcy5fZnJvbnQ7XG4gICAgICAgIC8vIFRoZSBjdXJzb3IgaXMgdXNlZCB0byBhdm9pZCBjYWxsaW5nIEFycmF5LnNoaWZ0KCkuXG4gICAgICAgIC8vIEl0IGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgZnJvbnQgZWxlbWVudCBvZiB0aGUgYXJyYXkgaW5zaWRlIHRoZVxuICAgICAgICAvLyBmcm9udC1tb3N0IG5vZGUuIEl0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2UgWzAsIFFVRVVFX01BWF9BUlJBWV9TSVpFKS5cbiAgICAgICAgdGhpcy5fY3Vyc29yID0gMDtcbiAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBub2RlLCBzaXplID09PSBlbGVtZW50cy5sZW5ndGggLSBjdXJzb3IuXG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGV4Y2VwdGlvbiBzYWZldHksIHRoaXMgbWV0aG9kIGlzIHN0cnVjdHVyZWQgaW4gb3JkZXI6XG4gICAgLy8gMS4gUmVhZCBzdGF0ZVxuICAgIC8vIDIuIENhbGN1bGF0ZSByZXF1aXJlZCBzdGF0ZSBtdXRhdGlvbnNcbiAgICAvLyAzLiBQZXJmb3JtIHN0YXRlIG11dGF0aW9uc1xuICAgIHB1c2goZWxlbWVudCkge1xuICAgICAgICBjb25zdCBvbGRCYWNrID0gdGhpcy5fYmFjaztcbiAgICAgICAgbGV0IG5ld0JhY2sgPSBvbGRCYWNrO1xuICAgICAgICBpZiAob2xkQmFjay5fZWxlbWVudHMubGVuZ3RoID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSAtIDEpIHtcbiAgICAgICAgICAgIG5ld0JhY2sgPSB7XG4gICAgICAgICAgICAgICAgX2VsZW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBfbmV4dDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2goKSBpcyB0aGUgbXV0YXRpb24gbW9zdCBsaWtlbHkgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBzbyBpdFxuICAgICAgICAvLyBnb2VzIGZpcnN0LlxuICAgICAgICBvbGRCYWNrLl9lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBpZiAobmV3QmFjayAhPT0gb2xkQmFjaykge1xuICAgICAgICAgICAgdGhpcy5fYmFjayA9IG5ld0JhY2s7XG4gICAgICAgICAgICBvbGRCYWNrLl9uZXh0ID0gbmV3QmFjaztcbiAgICAgICAgfVxuICAgICAgICArK3RoaXMuX3NpemU7XG4gICAgfVxuICAgIC8vIExpa2UgcHVzaCgpLCBzaGlmdCgpIGZvbGxvd3MgdGhlIHJlYWQgLT4gY2FsY3VsYXRlIC0+IG11dGF0ZSBwYXR0ZXJuIGZvclxuICAgIC8vIGV4Y2VwdGlvbiBzYWZldHkuXG4gICAgc2hpZnQoKSB7IC8vIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhbiBlbXB0eSBxdWV1ZVxuICAgICAgICBjb25zdCBvbGRGcm9udCA9IHRoaXMuX2Zyb250O1xuICAgICAgICBsZXQgbmV3RnJvbnQgPSBvbGRGcm9udDtcbiAgICAgICAgY29uc3Qgb2xkQ3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICBsZXQgbmV3Q3Vyc29yID0gb2xkQ3Vyc29yICsgMTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBvbGRGcm9udC5fZWxlbWVudHM7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvbGRDdXJzb3JdO1xuICAgICAgICBpZiAobmV3Q3Vyc29yID09PSBRVUVVRV9NQVhfQVJSQVlfU0laRSkge1xuICAgICAgICAgICAgbmV3RnJvbnQgPSBvbGRGcm9udC5fbmV4dDtcbiAgICAgICAgICAgIG5ld0N1cnNvciA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gbXV0YXRpb25zIGJlZm9yZSB0aGlzIHBvaW50LlxuICAgICAgICAtLXRoaXMuX3NpemU7XG4gICAgICAgIHRoaXMuX2N1cnNvciA9IG5ld0N1cnNvcjtcbiAgICAgICAgaWYgKG9sZEZyb250ICE9PSBuZXdGcm9udCkge1xuICAgICAgICAgICAgdGhpcy5fZnJvbnQgPSBuZXdGcm9udDtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJtaXQgc2hpZnRlZCBlbGVtZW50IHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgICAgICBlbGVtZW50c1tvbGRDdXJzb3JdID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgLy8gVGhlIHRyaWNreSB0aGluZyBhYm91dCBmb3JFYWNoKCkgaXMgdGhhdCBpdCBjYW4gYmUgY2FsbGVkXG4gICAgLy8gcmUtZW50cmFudGx5LiBUaGUgcXVldWUgbWF5IGJlIG11dGF0ZWQgaW5zaWRlIHRoZSBjYWxsYmFjay4gSXQgaXMgZWFzeSB0b1xuICAgIC8vIHNlZSB0aGF0IHB1c2goKSB3aXRoaW4gdGhlIGNhbGxiYWNrIGhhcyBubyBuZWdhdGl2ZSBlZmZlY3RzIHNpbmNlIHRoZSBlbmRcbiAgICAvLyBvZiB0aGUgcXVldWUgaXMgY2hlY2tlZCBmb3Igb24gZXZlcnkgaXRlcmF0aW9uLiBJZiBzaGlmdCgpIGlzIGNhbGxlZFxuICAgIC8vIHJlcGVhdGVkbHkgd2l0aGluIHRoZSBjYWxsYmFjayB0aGVuIHRoZSBuZXh0IGl0ZXJhdGlvbiBtYXkgcmV0dXJuIGFuXG4gICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuIEluIHRoaXMgY2FzZSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAgICAvLyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMgdW50aWwgd2UgZWl0aGVyIFwiY2F0Y2ggdXBcIiB3aXRoIGVsZW1lbnRzIHRoYXQgc3RpbGxcbiAgICAvLyBleGlzdCBvciByZWFjaCB0aGUgYmFjayBvZiB0aGUgcXVldWUuXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICBsZXQgaSA9IHRoaXMuX2N1cnNvcjtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gbm9kZS5fZWxlbWVudHM7XG4gICAgICAgIHdoaWxlIChpICE9PSBlbGVtZW50cy5sZW5ndGggfHwgbm9kZS5fbmV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuX25leHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50cztcbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVsZW1lbnRzW2ldKTtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBpZiBzaGlmdCgpIHdhcyBjYWxsZWQgbm93LFxuICAgIC8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBxdWV1ZS5cbiAgICBwZWVrKCkgeyAvLyBtdXN0IG5vdCBiZSBjYWxsZWQgb24gYW4gZW1wdHkgcXVldWVcbiAgICAgICAgY29uc3QgZnJvbnQgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgY29uc3QgY3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICByZXR1cm4gZnJvbnQuX2VsZW1lbnRzW2N1cnNvcl07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHJlYWRlciwgc3RyZWFtKSB7XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5fcmVhZGVyID0gcmVhZGVyO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHJlYWRlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHJlYWRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxufVxuLy8gQSBjbGllbnQgb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIGFuZCBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIgbWF5IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdG8gYnlwYXNzIHN0YXRlXG4vLyBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbChyZWFkZXIsIHJlYXNvbikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbTtcbiAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpIHtcbiAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIG5ldyBUeXBlRXJyb3IoYFJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQocmVhZGVyLCBuZXcgVHlwZUVycm9yKGBSZWFkZXIgd2FzIHJlbGVhc2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgc3RyZWFtJ3MgY2xvc2VkbmVzc2ApKTtcbiAgICB9XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtLl9yZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID0gdW5kZWZpbmVkO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG5mdW5jdGlvbiByZWFkZXJMb2NrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHJlYWRlcicpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpIHtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZShyZWFkZXIpO1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQocmVhZGVyKSB7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdChyZWFkZXIsIHJlYXNvbikge1xuICAgIGlmIChyZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHJlYWRlci5fY2xvc2VkUHJvbWlzZSk7XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZChyZWFkZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQocmVhZGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcikge1xuICAgIGlmIChyZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBBYm9ydFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbQWJvcnRTdGVwc11dJyk7XG5jb25zdCBFcnJvclN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbRXJyb3JTdGVwc11dJyk7XG5jb25zdCBDYW5jZWxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW0NhbmNlbFN0ZXBzXV0nKTtcbmNvbnN0IFB1bGxTdGVwcyA9IFN5bWJvbFBvbHlmaWxsKCdbW1B1bGxTdGVwc11dJyk7XG5cbi8vLyA8cmVmZXJlbmNlIGxpYj1cImVzMjAxNS5jb3JlXCIgLz5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0Zpbml0ZSNQb2x5ZmlsbFxuY29uc3QgTnVtYmVySXNGaW5pdGUgPSBOdW1iZXIuaXNGaW5pdGUgfHwgZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmIGlzRmluaXRlKHgpO1xufTtcblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC90cnVuYyNQb2x5ZmlsbFxuY29uc3QgTWF0aFRydW5jID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2IDwgMCA/IE1hdGguY2VpbCh2KSA6IE1hdGguZmxvb3Iodik7XG59O1xuXG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtZGljdGlvbmFyaWVzXG5mdW5jdGlvbiBpc0RpY3Rpb25hcnkoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBhc3NlcnREaWN0aW9uYXJ5KG9iaiwgY29udGV4dCkge1xuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCAmJiAhaXNEaWN0aW9uYXJ5KG9iaikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gb2JqZWN0LmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC1jYWxsYmFjay1mdW5jdGlvbnNcbmZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uKHgsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIHggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYSBmdW5jdGlvbi5gKTtcbiAgICB9XG59XG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtb2JqZWN0XG5mdW5jdGlvbiBpc09iamVjdCh4KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCkgfHwgdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBhc3NlcnRPYmplY3QoeCwgY29udGV4dCkge1xuICAgIGlmICghaXNPYmplY3QoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gb2JqZWN0LmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoeCwgcG9zaXRpb24sIGNvbnRleHQpIHtcbiAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFBhcmFtZXRlciAke3Bvc2l0aW9ufSBpcyByZXF1aXJlZCBpbiAnJHtjb250ZXh0fScuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVxdWlyZWRGaWVsZCh4LCBmaWVsZCwgY29udGV4dCkge1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtmaWVsZH0gaXMgcmVxdWlyZWQgaW4gJyR7Y29udGV4dH0nLmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC11bnJlc3RyaWN0ZWQtZG91YmxlXG5mdW5jdGlvbiBjb252ZXJ0VW5yZXN0cmljdGVkRG91YmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG59XG5mdW5jdGlvbiBjZW5zb3JOZWdhdGl2ZVplcm8oeCkge1xuICAgIHJldHVybiB4ID09PSAwID8gMCA6IHg7XG59XG5mdW5jdGlvbiBpbnRlZ2VyUGFydCh4KSB7XG4gICAgcmV0dXJuIGNlbnNvck5lZ2F0aXZlWmVybyhNYXRoVHJ1bmMoeCkpO1xufVxuLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jaWRsLXVuc2lnbmVkLWxvbmctbG9uZ1xuZnVuY3Rpb24gY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgbG93ZXJCb3VuZCA9IDA7XG4gICAgY29uc3QgdXBwZXJCb3VuZCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIGxldCB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICB4ID0gY2Vuc29yTmVnYXRpdmVaZXJvKHgpO1xuICAgIGlmICghTnVtYmVySXNGaW5pdGUoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyYCk7XG4gICAgfVxuICAgIHggPSBpbnRlZ2VyUGFydCh4KTtcbiAgICBpZiAoeCA8IGxvd2VyQm91bmQgfHwgeCA+IHVwcGVyQm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBvdXRzaWRlIHRoZSBhY2NlcHRlZCByYW5nZSBvZiAke2xvd2VyQm91bmR9IHRvICR7dXBwZXJCb3VuZH0sIGluY2x1c2l2ZWApO1xuICAgIH1cbiAgICBpZiAoIU51bWJlcklzRmluaXRlKHgpIHx8IHggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIFRPRE8gVXNlIEJpZ0ludCBpZiBzdXBwb3J0ZWQ/XG4gICAgLy8gbGV0IHhCaWdJbnQgPSBCaWdJbnQoaW50ZWdlclBhcnQoeCkpO1xuICAgIC8vIHhCaWdJbnQgPSBCaWdJbnQuYXNVaW50Tig2NCwgeEJpZ0ludCk7XG4gICAgLy8gcmV0dXJuIE51bWJlcih4QmlnSW50KTtcbiAgICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVhZGFibGVTdHJlYW0oeCwgY29udGV4dCkge1xuICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIFJlYWRhYmxlU3RyZWFtLmApO1xuICAgIH1cbn1cblxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xufVxuLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0sIHJlYWRSZXF1ZXN0KSB7XG4gICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5wdXNoKHJlYWRSZXF1ZXN0KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBjb25zdCByZWFkUmVxdWVzdCA9IHJlYWRlci5fcmVhZFJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pIHtcbiAgICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRSZXF1ZXN0cy5sZW5ndGg7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIEEgZGVmYXVsdCByZWFkZXIgdmVuZGVkIGJ5IGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoc3RyZWFtLCAxLCAnUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyJyk7XG4gICAgICAgIGFzc2VydFJlYWRhYmxlU3RyZWFtKHN0cmVhbSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHJlYWRpbmcgYnkgYW5vdGhlciByZWFkZXInKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgIHRoaXMuX3JlYWRSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCxcbiAgICAgKiBvciByZWplY3RlZCBpZiB0aGUgc3RyZWFtIGV2ZXIgZXJyb3JzIG9yIHRoZSByZWFkZXIncyBsb2NrIGlzIHJlbGVhc2VkIGJlZm9yZSB0aGUgc3RyZWFtIGZpbmlzaGVzIGNsb3NpbmcuXG4gICAgICovXG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFJlYWRhYmxlU3RyZWFtLmNhbmNlbCB8IHN0cmVhbS5jYW5jZWwocmVhc29uKX0uXG4gICAgICovXG4gICAgY2FuY2VsKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgbmV4dCBjaHVuayBmcm9tIHRoZSBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogSWYgcmVhZGluZyBhIGNodW5rIGNhdXNlcyB0aGUgcXVldWUgdG8gYmVjb21lIGVtcHR5LCBtb3JlIGRhdGEgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgdW5kZXJseWluZyBzb3VyY2UuXG4gICAgICovXG4gICAgcmVhZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbigncmVhZCBmcm9tJykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlUHJvbWlzZTtcbiAgICAgICAgbGV0IHJlamVjdFByb21pc2U7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlamVjdFByb21pc2UgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZWFkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSksXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogKCkgPT4gcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pLFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6IGUgPT4gcmVqZWN0UHJvbWlzZShlKVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHRoaXMsIHJlYWRSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSByZWFkZXIncyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICogZnJvbSBub3cgb247IG90aGVyd2lzZSwgdGhlIHJlYWRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBBIHJlYWRlcidzIGxvY2sgY2Fubm90IGJlIHJlbGVhc2VkIHdoaWxlIGl0IHN0aWxsIGhhcyBhIHBlbmRpbmcgcmVhZCByZXF1ZXN0LCBpLmUuLCBpZiBhIHByb21pc2UgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgcmVhZGVyJ3Mge0BsaW5rIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5yZWFkIHwgcmVhZCgpfSBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBzZXR0bGVkLiBBdHRlbXB0aW5nIHRvXG4gICAgICogZG8gc28gd2lsbCB0aHJvdyBhIGBUeXBlRXJyb3JgIGFuZCBsZWF2ZSB0aGUgcmVhZGVyIGxvY2tlZCB0byB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwge1xuICAgIGNhbmNlbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVsZWFzZUxvY2s6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGNsb3NlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSByZWFkZXJzLlxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkUmVxdWVzdHMnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZChyZWFkZXIsIHJlYWRSZXF1ZXN0KSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJlYWRSZXF1ZXN0Ll9lcnJvclN0ZXBzKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCk7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlci5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJgKTtcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE4LmFzeW5jaXRlcmFibGVcIiAvPlxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5jb25zdCBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihhc3luYyBmdW5jdGlvbiogKCkgeyB9KS5wcm90b3R5cGUpO1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTguYXN5bmNpdGVyYWJsZVwiIC8+XG5jbGFzcyBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkZXIsIHByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2lzRmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gcmVhZGVyO1xuICAgICAgICB0aGlzLl9wcmV2ZW50Q2FuY2VsID0gcHJldmVudENhbmNlbDtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgbmV4dFN0ZXBzID0gKCkgPT4gdGhpcy5fbmV4dFN0ZXBzKCk7XG4gICAgICAgIHRoaXMuX29uZ29pbmdQcm9taXNlID0gdGhpcy5fb25nb2luZ1Byb21pc2UgP1xuICAgICAgICAgICAgdHJhbnNmb3JtUHJvbWlzZVdpdGgodGhpcy5fb25nb2luZ1Byb21pc2UsIG5leHRTdGVwcywgbmV4dFN0ZXBzKSA6XG4gICAgICAgICAgICBuZXh0U3RlcHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uZ29pbmdQcm9taXNlO1xuICAgIH1cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmV0dXJuU3RlcHMgPSAoKSA9PiB0aGlzLl9yZXR1cm5TdGVwcyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbmdvaW5nUHJvbWlzZSA/XG4gICAgICAgICAgICB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0aGlzLl9vbmdvaW5nUHJvbWlzZSwgcmV0dXJuU3RlcHMsIHJldHVyblN0ZXBzKSA6XG4gICAgICAgICAgICByZXR1cm5TdGVwcygpO1xuICAgIH1cbiAgICBfbmV4dFN0ZXBzKCkge1xuICAgICAgICBpZiAodGhpcy5faXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGVyID0gdGhpcy5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2l0ZXJhdGUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYnkgb25lIG1pY3JvdGFzaywgb3RoZXJ3aXNlIHdlIHN0b3AgcHVsbGluZyB0b28gZWFybHkgd2hpY2ggYnJlYWtzIGEgdGVzdC5cbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBJcyB0aGlzIGEgYnVnIGluIHRoZSBzcGVjaWZpY2F0aW9uLCBvciBpbiB0aGUgdGVzdD9cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogcmVhc29uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICAgICAgcmVqZWN0UHJvbWlzZShyZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgX3JldHVyblN0ZXBzKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWUsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHRoaXMuX3JlYWRlcjtcbiAgICAgICAgaWYgKHJlYWRlci5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdmaW5pc2ggaXRlcmF0aW5nJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlciwgdmFsdWUpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKHJlc3VsdCwgKCkgPT4gKHsgdmFsdWUsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICB9XG59XG5jb25zdCBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSB7XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24oJ25leHQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jSXRlcmF0b3JJbXBsLm5leHQoKTtcbiAgICB9LFxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbigncmV0dXJuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hc3luY0l0ZXJhdG9ySW1wbC5yZXR1cm4odmFsdWUpO1xuICAgIH1cbn07XG5pZiAoQXN5bmNJdGVyYXRvclByb3RvdHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG5mdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgcHJldmVudENhbmNlbCkge1xuICAgIGNvbnN0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBjb25zdCBpbXBsID0gbmV3IFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGwocmVhZGVyLCBwcmV2ZW50Q2FuY2VsKTtcbiAgICBjb25zdCBpdGVyYXRvciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICBpdGVyYXRvci5fYXN5bmNJdGVyYXRvckltcGwgPSBpbXBsO1xuICAgIHJldHVybiBpdGVyYXRvcjtcbn1cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXN5bmNJdGVyYXRvckltcGwnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBTdXNwaWNpb3VzVHlwZU9mR3VhcmRcbiAgICAgICAgcmV0dXJuIHguX2FzeW5jSXRlcmF0b3JJbXBsIGluc3RhbmNlb2ZcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGw7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gc3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdGVhbUFzeW5jSXRlcmF0b3JgKTtcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzTmFOI1BvbHlmaWxsXG5jb25zdCBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoeCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4geCAhPT0geDtcbn07XG5cbmZ1bmN0aW9uIENyZWF0ZUFycmF5RnJvbUxpc3QoZWxlbWVudHMpIHtcbiAgICAvLyBXZSB1c2UgYXJyYXlzIHRvIHJlcHJlc2VudCBsaXN0cywgc28gdGhpcyBpcyBiYXNpY2FsbHkgYSBuby1vcC5cbiAgICAvLyBEbyBhIHNsaWNlIHRob3VnaCBqdXN0IGluIGNhc2Ugd2UgaGFwcGVuIHRvIGRlcGVuZCBvbiB0aGUgdW5pcXVlLW5lc3MuXG4gICAgcmV0dXJuIGVsZW1lbnRzLnNsaWNlKCk7XG59XG5mdW5jdGlvbiBDb3B5RGF0YUJsb2NrQnl0ZXMoZGVzdCwgZGVzdE9mZnNldCwgc3JjLCBzcmNPZmZzZXQsIG4pIHtcbiAgICBuZXcgVWludDhBcnJheShkZXN0KS5zZXQobmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNPZmZzZXQsIG4pLCBkZXN0T2Zmc2V0KTtcbn1cbi8vIE5vdCBpbXBsZW1lbnRlZCBjb3JyZWN0bHlcbmZ1bmN0aW9uIFRyYW5zZmVyQXJyYXlCdWZmZXIoTykge1xuICAgIHJldHVybiBPO1xufVxuLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gSXNEZXRhY2hlZEJ1ZmZlcihPKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gQXJyYXlCdWZmZXJTbGljZShidWZmZXIsIGJlZ2luLCBlbmQpIHtcbiAgICAvLyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgaXMgbm90IGF2YWlsYWJsZSBvbiBJRTEwXG4gICAgLy8gaHR0cHM6Ly93d3cuY2FuaXVzZS5jb20vbWRuLWphdmFzY3JpcHRfYnVpbHRpbnNfYXJyYXlidWZmZXJfc2xpY2VcbiAgICBpZiAoYnVmZmVyLnNsaWNlKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoYmVnaW4sIGVuZCk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IGVuZCAtIGJlZ2luO1xuICAgIGNvbnN0IHNsaWNlID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gICAgQ29weURhdGFCbG9ja0J5dGVzKHNsaWNlLCAwLCBidWZmZXIsIGJlZ2luLCBsZW5ndGgpO1xuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gSXNOb25OZWdhdGl2ZU51bWJlcih2KSB7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChOdW1iZXJJc05hTih2KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gQ2xvbmVBc1VpbnQ4QXJyYXkoTykge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEFycmF5QnVmZmVyU2xpY2UoTy5idWZmZXIsIE8uYnl0ZU9mZnNldCwgTy5ieXRlT2Zmc2V0ICsgTy5ieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gRGVxdWV1ZVZhbHVlKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IHBhaXIgPSBjb250YWluZXIuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSAtPSBwYWlyLnNpemU7XG4gICAgaWYgKGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPCAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5fcXVldWVUb3RhbFNpemUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gcGFpci52YWx1ZTtcbn1cbmZ1bmN0aW9uIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRhaW5lciwgdmFsdWUsIHNpemUpIHtcbiAgICBpZiAoIUlzTm9uTmVnYXRpdmVOdW1iZXIoc2l6ZSkgfHwgc2l6ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1NpemUgbXVzdCBiZSBhIGZpbml0ZSwgbm9uLU5hTiwgbm9uLW5lZ2F0aXZlIG51bWJlci4nKTtcbiAgICB9XG4gICAgY29udGFpbmVyLl9xdWV1ZS5wdXNoKHsgdmFsdWUsIHNpemUgfSk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSArPSBzaXplO1xufVxuZnVuY3Rpb24gUGVla1F1ZXVlVmFsdWUoY29udGFpbmVyKSB7XG4gICAgY29uc3QgcGFpciA9IGNvbnRhaW5lci5fcXVldWUucGVlaygpO1xuICAgIHJldHVybiBwYWlyLnZhbHVlO1xufVxuZnVuY3Rpb24gUmVzZXRRdWV1ZShjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX3F1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG59XG5cbi8qKlxuICogQSBwdWxsLWludG8gcmVxdWVzdCBpbiBhIHtAbGluayBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZpZXcgZm9yIHdyaXRpbmcgaW4gdG8sIG9yIGBudWxsYCBpZiB0aGUgQllPQiByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gcmVzcG9uZGVkIHRvLlxuICAgICAqL1xuICAgIGdldCB2aWV3KCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKCd2aWV3Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXc7XG4gICAgfVxuICAgIHJlc3BvbmQoYnl0ZXNXcml0dGVuKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KGJ5dGVzV3JpdHRlbiwgMSwgJ3Jlc3BvbmQnKTtcbiAgICAgICAgYnl0ZXNXcml0dGVuID0gY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKGJ5dGVzV3JpdHRlbiwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih0aGlzLl92aWV3LmJ1ZmZlcikpIDtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbik7XG4gICAgfVxuICAgIHJlc3BvbmRXaXRoTmV3Vmlldyh2aWV3KSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3Jlc3BvbmRXaXRoTmV3VmlldycpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQodmlldywgMSwgJ3Jlc3BvbmRXaXRoTmV3VmlldycpO1xuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyh2aWV3KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IGNhbiBvbmx5IHJlc3BvbmQgd2l0aCBhcnJheSBidWZmZXIgdmlld3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBCWU9CIHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcih2aWV3LmJ1ZmZlcikpIDtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciwgdmlldyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUsIHtcbiAgICByZXNwb25kOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICByZXNwb25kV2l0aE5ld1ZpZXc6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHZpZXc6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QnLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW0gfCByZWFkYWJsZSBieXRlIHN0cmVhbX0ncyBzdGF0ZSBhbmQgaW50ZXJuYWwgcXVldWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEJZT0IgcHVsbCByZXF1ZXN0LCBvciBgbnVsbGAgaWYgdGhlcmUgaXNuJ3Qgb25lLlxuICAgICAqL1xuICAgIGdldCBieW9iUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignYnlvYlJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgY29udHJvbGxlZCBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXNcbiAgICAgKiBvdmVyLWZ1bGwuIEFuIHVuZGVybHlpbmcgYnl0ZSBzb3VyY2Ugb3VnaHQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gYW5kIGhvdyB0byBhcHBseSBiYWNrcHJlc3N1cmUuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29udHJvbGxlZCByZWFkYWJsZSBzdHJlYW0uIENvbnN1bWVycyB3aWxsIHN0aWxsIGJlIGFibGUgdG8gcmVhZCBhbnkgcHJldmlvdXNseS1lbnF1ZXVlZCBjaHVua3MgZnJvbVxuICAgICAqIHRoZSBzdHJlYW0sIGJ1dCBvbmNlIHRob3NlIGFyZSByZWFkLCB0aGUgc3RyZWFtIHdpbGwgYmVjb21lIGNsb3NlZC5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQ7IGRvIG5vdCBjbG9zZSBpdCBhZ2FpbiEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHJlYWRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKHRoaXMpO1xuICAgIH1cbiAgICBlbnF1ZXVlKGNodW5rKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KGNodW5rLCAxLCAnZW5xdWV1ZScpO1xuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NodW5rIG11c3QgYmUgYW4gYXJyYXkgYnVmZmVyIHZpZXcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2h1bmsgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsuYnVmZmVyLmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGNodW5rJ3MgYnVmZmVyIG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzdHJlYW0gaXMgY2xvc2VkIG9yIGRyYWluaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgc3RyZWFtIChpbiAke3N0YXRlfSBzdGF0ZSkgaXMgbm90IGluIHRoZSByZWFkYWJsZSBzdGF0ZSBhbmQgY2Fubm90IGJlIGVucXVldWVkIHRvYCk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFcnJvcnMgdGhlIGNvbnRyb2xsZWQgcmVhZGFibGUgc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZSBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC5cbiAgICAgKi9cbiAgICBlcnJvcihlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKHRoaXMsIGUpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0NhbmNlbFN0ZXBzXShyZWFzb24pIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyh0aGlzKTtcbiAgICAgICAgUmVzZXRRdWV1ZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY2FuY2VsQWxnb3JpdGhtKHJlYXNvbik7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbUHVsbFN0ZXBzXShyZWFkUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgICAgICBpZiAodGhpcy5fcXVldWVUb3RhbFNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZVRvdGFsU2l6ZSAtPSBlbnRyeS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4odGhpcyk7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW50cnkuYnVmZmVyLCBlbnRyeS5ieXRlT2Zmc2V0LCBlbnRyeS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHRoaXMuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICAgICAgaWYgKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChidWZmZXJFKSB7XG4gICAgICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2Vycm9yU3RlcHMoYnVmZmVyRSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHVsbEludG9EZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICBidWZmZXJCeXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsXG4gICAgICAgICAgICAgICAgYnl0ZU9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBhdXRvQWxsb2NhdGVDaHVua1NpemUsXG4gICAgICAgICAgICAgICAgYnl0ZXNGaWxsZWQ6IDAsXG4gICAgICAgICAgICAgICAgZWxlbWVudFNpemU6IDEsXG4gICAgICAgICAgICAgICAgdmlld0NvbnN0cnVjdG9yOiBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgIHJlYWRlclR5cGU6ICdkZWZhdWx0J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtLCByZWFkUmVxdWVzdCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVucXVldWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBieW9iUmVxdWVzdDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZGVzaXJlZFNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLlxuZnVuY3Rpb24gSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzaG91bGRQdWxsID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgIGlmICghc2hvdWxkUHVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wdWxsaW5nKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IHRydWU7XG4gICAgLy8gVE9ETzogVGVzdCBjb250cm9sbGVyIGFyZ3VtZW50XG4gICAgY29uc3QgcHVsbFByb21pc2UgPSBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHVsbFByb21pc2UsICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbEFnYWluKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgfSwgZSA9PiB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcikge1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihzdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBmaWxsZWRWaWV3ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLnJlYWRlclR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIGZpbGxlZFZpZXcsIGRvbmUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IocHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgYnl0ZXNGaWxsZWQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7XG4gICAgY29uc3QgZWxlbWVudFNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgcmV0dXJuIG5ldyBwdWxsSW50b0Rlc2NyaXB0b3Iudmlld0NvbnN0cnVjdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCBieXRlc0ZpbGxlZCAvIGVsZW1lbnRTaXplKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGNvbnRyb2xsZXIuX3F1ZXVlLnB1c2goeyBidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGggfSk7XG4gICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgKz0gYnl0ZUxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IGVsZW1lbnRTaXplID0gcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplO1xuICAgIGNvbnN0IGN1cnJlbnRBbGlnbmVkQnl0ZXMgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTtcbiAgICBjb25zdCBtYXhCeXRlc1RvQ29weSA9IE1hdGgubWluKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZUxlbmd0aCAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCk7XG4gICAgY29uc3QgbWF4Qnl0ZXNGaWxsZWQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKyBtYXhCeXRlc1RvQ29weTtcbiAgICBjb25zdCBtYXhBbGlnbmVkQnl0ZXMgPSBtYXhCeXRlc0ZpbGxlZCAtIG1heEJ5dGVzRmlsbGVkICUgZWxlbWVudFNpemU7XG4gICAgbGV0IHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPSBtYXhCeXRlc1RvQ29weTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICBpZiAobWF4QWxpZ25lZEJ5dGVzID4gY3VycmVudEFsaWduZWRCeXRlcykge1xuICAgICAgICB0b3RhbEJ5dGVzVG9Db3B5UmVtYWluaW5nID0gbWF4QWxpZ25lZEJ5dGVzIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICByZWFkeSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXVlID0gY29udHJvbGxlci5fcXVldWU7XG4gICAgd2hpbGUgKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPiAwKSB7XG4gICAgICAgIGNvbnN0IGhlYWRPZlF1ZXVlID0gcXVldWUucGVlaygpO1xuICAgICAgICBjb25zdCBieXRlc1RvQ29weSA9IE1hdGgubWluKHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcsIGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCBkZXN0U3RhcnQgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCArIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICAgICAgQ29weURhdGFCbG9ja0J5dGVzKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIGRlc3RTdGFydCwgaGVhZE9mUXVldWUuYnVmZmVyLCBoZWFkT2ZRdWV1ZS5ieXRlT2Zmc2V0LCBieXRlc1RvQ29weSk7XG4gICAgICAgIGlmIChoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoID09PSBieXRlc1RvQ29weSkge1xuICAgICAgICAgICAgcXVldWUuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRPZlF1ZXVlLmJ5dGVPZmZzZXQgKz0gYnl0ZXNUb0NvcHk7XG4gICAgICAgICAgICBoZWFkT2ZRdWV1ZS5ieXRlTGVuZ3RoIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplIC09IGJ5dGVzVG9Db3B5O1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNUb0NvcHksIHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgLT0gYnl0ZXNUb0NvcHk7XG4gICAgfVxuICAgIHJldHVybiByZWFkeTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLCBzaXplLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgKz0gc2l6ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDAgJiYgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJJbnZhbGlkYXRlQllPQlJlcXVlc3QoY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0Ll9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdC5fdmlldyA9IG51bGw7XG4gICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBudWxsO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZShjb250cm9sbGVyKSB7XG4gICAgd2hpbGUgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhjb250cm9sbGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGxldCBlbGVtZW50U2l6ZSA9IDE7XG4gICAgaWYgKHZpZXcuY29uc3RydWN0b3IgIT09IERhdGFWaWV3KSB7XG4gICAgICAgIGVsZW1lbnRTaXplID0gdmlldy5jb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICB9XG4gICAgY29uc3QgY3RvciA9IHZpZXcuY29uc3RydWN0b3I7XG4gICAgLy8gdHJ5IHtcbiAgICBjb25zdCBidWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKTtcbiAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgLy8gICByZWFkSW50b1JlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIGNvbnN0IHB1bGxJbnRvRGVzY3JpcHRvciA9IHtcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICBidWZmZXJCeXRlTGVuZ3RoOiBidWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgYnl0ZU9mZnNldDogdmlldy5ieXRlT2Zmc2V0LFxuICAgICAgICBieXRlTGVuZ3RoOiB2aWV3LmJ5dGVMZW5ndGgsXG4gICAgICAgIGJ5dGVzRmlsbGVkOiAwLFxuICAgICAgICBlbGVtZW50U2l6ZSxcbiAgICAgICAgdmlld0NvbnN0cnVjdG9yOiBjdG9yLFxuICAgICAgICByZWFkZXJUeXBlOiAnYnlvYidcbiAgICB9O1xuICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIC8vIE5vIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKCkgY2FsbCBzaW5jZTpcbiAgICAgICAgLy8gLSBObyBjaGFuZ2UgaGFwcGVucyBvbiBkZXNpcmVkU2l6ZVxuICAgICAgICAvLyAtIFRoZSBzb3VyY2UgaGFzIGFscmVhZHkgYmVlbiBub3RpZmllZCBvZiB0aGF0IHRoZXJlJ3MgYXQgbGVhc3QgMSBwZW5kaW5nIHJlYWQodmlldylcbiAgICAgICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCByZWFkSW50b1JlcXVlc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBjb25zdCBlbXB0eVZpZXcgPSBuZXcgY3RvcihwdWxsSW50b0Rlc2NyaXB0b3IuYnVmZmVyLCBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZU9mZnNldCwgMCk7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2xvc2VTdGVwcyhlbXB0eVZpZXcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgaWYgKFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsUHVsbEludG9EZXNjcmlwdG9yRnJvbVF1ZXVlKGNvbnRyb2xsZXIsIHB1bGxJbnRvRGVzY3JpcHRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4oY29udHJvbGxlcik7XG4gICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX2NodW5rU3RlcHMoZmlsbGVkVmlldyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgICAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9lcnJvclN0ZXBzKGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucHVzaChwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgcmVhZEludG9SZXF1ZXN0KTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZShjb250cm9sbGVyLCBmaXJzdERlc2NyaXB0b3IpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0JZT0JSZWFkZXIoc3RyZWFtKSkge1xuICAgICAgICB3aGlsZSAoUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKHN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbiwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBpZiAocHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkIDwgcHVsbEludG9EZXNjcmlwdG9yLmVsZW1lbnRTaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlbWFpbmRlclNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgJSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgaWYgKHJlbWFpbmRlclNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICBjb25zdCByZW1haW5kZXIgPSBBcnJheUJ1ZmZlclNsaWNlKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIGVuZCAtIHJlbWFpbmRlclNpemUsIGVuZCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHJlbWFpbmRlciwgMCwgcmVtYWluZGVyLmJ5dGVMZW5ndGgpO1xuICAgIH1cbiAgICBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgLT0gcmVtYWluZGVyU2l6ZTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0sIHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclByb2Nlc3NQdWxsSW50b0Rlc2NyaXB0b3JzVXNpbmdRdWV1ZShjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKSB7XG4gICAgY29uc3QgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBmaXJzdERlc2NyaXB0b3IpO1xuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3Muc2hpZnQoKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZGVzaXJlZFNpemUgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgaWYgKGRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG4vLyBBIGNsaWVudCBvZiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgfHwgc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RQZW5kaW5nUHVsbEludG8gPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgaWYgKGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ5dGVzRmlsbGVkID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBUeXBlRXJyb3IoJ0luc3VmZmljaWVudCBieXRlcyB0byBmaWxsIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBidWZmZXInKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkIHx8IHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBjaHVuay5idWZmZXI7XG4gICAgY29uc3QgYnl0ZU9mZnNldCA9IGNodW5rLmJ5dGVPZmZzZXQ7XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgdHJhbnNmZXJyZWRCdWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdFBlbmRpbmdQdWxsSW50byA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoSXNEZXRhY2hlZEJ1ZmZlcihmaXJzdFBlbmRpbmdQdWxsSW50by5idWZmZXIpKSA7XG4gICAgICAgIGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3RQZW5kaW5nUHVsbEludG8uYnVmZmVyKTtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyKHN0cmVhbSkpIHtcbiAgICAgICAgaWYgKFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPT09IDApIHtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlKGNvbnRyb2xsZXIsIHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlcnJlZFZpZXcgPSBuZXcgVWludDhBcnJheSh0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdChzdHJlYW0sIHRyYW5zZmVycmVkVmlldywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pKSB7XG4gICAgICAgIC8vIFRPRE86IElkZWFsbHkgaW4gdGhpcyBicmFuY2ggZGV0YWNoaW5nIHNob3VsZCBoYXBwZW4gb25seSBpZiB0aGUgYnVmZmVyIGlzIG5vdCBjb25zdW1lZCBmdWxseS5cbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgdHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgdHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhclBlbmRpbmdQdWxsSW50b3MoY29udHJvbGxlcik7XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXRCWU9CUmVxdWVzdChjb250cm9sbGVyKSB7XG4gICAgaWYgKGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID09PSBudWxsICYmIGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGZpcnN0RGVzY3JpcHRvci5idWZmZXIsIGZpcnN0RGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkLCBmaXJzdERlc2NyaXB0b3IuYnl0ZUxlbmd0aCAtIGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCk7XG4gICAgICAgIGNvbnN0IGJ5b2JSZXF1ZXN0ID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSk7XG4gICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdChieW9iUmVxdWVzdCwgY29udHJvbGxlciwgdmlldyk7XG4gICAgICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gYnlvYlJlcXVlc3Q7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLl9ieW9iUmVxdWVzdDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNIC0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemU7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pIHtcbiAgICBjb25zdCBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgaWYgKGJ5dGVzV3JpdHRlbiAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYnl0ZXNXcml0dGVuIG11c3QgYmUgMCB3aGVuIGNhbGxpbmcgcmVzcG9uZCgpIG9uIGEgY2xvc2VkIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYnl0ZXNXcml0dGVuID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMCB3aGVuIGNhbGxpbmcgcmVzcG9uZCgpIG9uIGEgcmVhZGFibGUgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCArIGJ5dGVzV3JpdHRlbiA+IGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYnl0ZXNXcml0dGVuIG91dCBvZiByYW5nZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpcnN0RGVzY3JpcHRvci5idWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKGZpcnN0RGVzY3JpcHRvci5idWZmZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcoY29udHJvbGxlciwgdmlldykge1xuICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBpZiAodmlldy5ieXRlTGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmlld1xcJ3MgbGVuZ3RoIG11c3QgYmUgMCB3aGVuIGNhbGxpbmcgcmVzcG9uZFdpdGhOZXdWaWV3KCkgb24gYSBjbG9zZWQgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2aWV3XFwncyBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMCB3aGVuIGNhbGxpbmcgcmVzcG9uZFdpdGhOZXdWaWV3KCkgb24gYSByZWFkYWJsZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgIT09IHZpZXcuYnl0ZU9mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHJlZ2lvbiBzcGVjaWZpZWQgYnkgdmlldyBkb2VzIG5vdCBtYXRjaCBieW9iUmVxdWVzdCcpO1xuICAgIH1cbiAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlckJ5dGVMZW5ndGggIT09IHZpZXcuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBidWZmZXIgb2YgdmlldyBoYXMgZGlmZmVyZW50IGNhcGFjaXR5IHRoYW4gYnlvYlJlcXVlc3QnKTtcbiAgICB9XG4gICAgaWYgKGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCArIHZpZXcuYnl0ZUxlbmd0aCA+IGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgcmVnaW9uIHNwZWNpZmllZCBieSB2aWV3IGlzIGxhcmdlciB0aGFuIGJ5b2JSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCeXRlTGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoO1xuICAgIGZpcnN0RGVzY3JpcHRvci5idWZmZXIgPSBUcmFuc2ZlckFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsKGNvbnRyb2xsZXIsIHZpZXdCeXRlTGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0gPSBzdHJlYW07XG4gICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID0gbnVsbDtcbiAgICAvLyBOZWVkIHRvIHNldCB0aGUgc2xvdHMgc28gdGhhdCB0aGUgYXNzZXJ0IGRvZXNuJ3QgZmlyZS4gSW4gdGhlIHNwZWMgdGhlIHNsb3RzIGFscmVhZHkgZXhpc3QgaW1wbGljaXRseS5cbiAgICBjb250cm9sbGVyLl9xdWV1ZSA9IGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lIV00gPSBoaWdoV2F0ZXJNYXJrO1xuICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSBwdWxsQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9hdXRvQWxsb2NhdGVDaHVua1NpemUgPSBhdXRvQWxsb2NhdGVDaHVua1NpemU7XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICBjb25zdCBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCksICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZShzdHJlYW0sIHVuZGVybHlpbmdCeXRlU291cmNlLCBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBsZXQgcHVsbEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgY2FuY2VsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ0J5dGVTb3VyY2Uuc3RhcnQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5wdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHVsbEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdCeXRlU291cmNlLnB1bGwoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nQnl0ZVNvdXJjZS5jYW5jZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW5jZWxBbGdvcml0aG0gPSByZWFzb24gPT4gdW5kZXJseWluZ0J5dGVTb3VyY2UuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IHVuZGVybHlpbmdCeXRlU291cmNlLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICBpZiAoYXV0b0FsbG9jYXRlQ2h1bmtTaXplID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F1dG9BbGxvY2F0ZUNodW5rU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSk7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QocmVxdWVzdCwgY29udHJvbGxlciwgdmlldykge1xuICAgIHJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICByZXF1ZXN0Ll92aWV3ID0gdmlldztcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LlxuZnVuY3Rpb24gYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdGApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG5mdW5jdGlvbiBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyYCk7XG59XG5cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbmZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoc3RyZWFtKTtcbn1cbi8vIFJlYWRhYmxlU3RyZWFtIEFQSSBleHBvc2VkIGZvciBjb250cm9sbGVycy5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgcmVhZEludG9SZXF1ZXN0KSB7XG4gICAgc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMucHVzaChyZWFkSW50b1JlcXVlc3QpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGRvbmUpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBjb25zdCByZWFkSW50b1JlcXVlc3QgPSByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMuc2hpZnQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgICByZWFkSW50b1JlcXVlc3QuX2Nsb3NlU3RlcHMoY2h1bmspO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQSBCWU9CIHJlYWRlciB2ZW5kZWQgYnkgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChzdHJlYW0sIDEsICdSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXInKTtcbiAgICAgICAgYXNzZXJ0UmVhZGFibGVTdHJlYW0oc3RyZWFtLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciBmb3IgYSBzdHJlYW0gbm90IGNvbnN0cnVjdGVkIHdpdGggYSBieXRlICcgK1xuICAgICAgICAgICAgICAgICdzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplKHRoaXMsIHN0cmVhbSk7XG4gICAgICAgIHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aGVuIHRoZSBzdHJlYW0gYmVjb21lcyBjbG9zZWQsIG9yIHJlamVjdGVkIGlmIHRoZSBzdHJlYW0gZXZlciBlcnJvcnMgb3JcbiAgICAgKiB0aGUgcmVhZGVyJ3MgbG9jayBpcyByZWxlYXNlZCBiZWZvcmUgdGhlIHN0cmVhbSBmaW5pc2hlcyBjbG9zaW5nLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZWFkZXIgaXMgYWN0aXZlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAbGluayBSZWFkYWJsZVN0cmVhbS5jYW5jZWwgfCBzdHJlYW0uY2FuY2VsKHJlYXNvbil9LlxuICAgICAqL1xuICAgIGNhbmNlbChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdjYW5jZWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0NhbmNlbCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byByZWFkcyBieXRlcyBpbnRvIHZpZXcsIGFuZCByZXR1cm5zIGEgcHJvbWlzZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBJZiByZWFkaW5nIGEgY2h1bmsgY2F1c2VzIHRoZSBxdWV1ZSB0byBiZWNvbWUgZW1wdHksIG1vcmUgZGF0YSB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvdXJjZS5cbiAgICAgKi9cbiAgICByZWFkKHZpZXcpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcodmlldykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ3ZpZXcgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlldy5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCd2aWV3IG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aWV3LmJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKGB2aWV3J3MgYnVmZmVyIG11c3QgaGF2ZSBub24temVybyBieXRlTGVuZ3RoYCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHZpZXcuYnVmZmVyKSkgO1xuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdyZWFkIGZyb20nKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRJbnRvUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSksXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogY2h1bmsgPT4gcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogY2h1bmssIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogZSA9PiByZWplY3RQcm9taXNlKGUpXG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQodGhpcywgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSByZWFkZXIncyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICogZnJvbSBub3cgb247IG90aGVyd2lzZSwgdGhlIHJlYWRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBBIHJlYWRlcidzIGxvY2sgY2Fubm90IGJlIHJlbGVhc2VkIHdoaWxlIGl0IHN0aWxsIGhhcyBhIHBlbmRpbmcgcmVhZCByZXF1ZXN0LCBpLmUuLCBpZiBhIHByb21pc2UgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgcmVhZGVyJ3Mge0BsaW5rIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5yZWFkIHwgcmVhZCgpfSBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBzZXR0bGVkLiBBdHRlbXB0aW5nIHRvXG4gICAgICogZG8gc28gd2lsbCB0aHJvdyBhIGBUeXBlRXJyb3JgIGFuZCBsZWF2ZSB0aGUgcmVhZGVyIGxvY2tlZCB0byB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gcmVsZWFzZSBhIHJlYWRlciBsb2NrIHdoZW4gdGhhdCByZWFkZXIgaGFzIHBlbmRpbmcgcmVhZCgpIGNhbGxzIHVuLXNldHRsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIHtcbiAgICBjYW5jZWw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlYWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlbGVhc2VMb2NrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgcmVhZGVycy5cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZEludG9SZXF1ZXN0cycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXI7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkKHJlYWRlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fZXJyb3JTdGVwcyhzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byhzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICB9XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLlxuZnVuY3Rpb24gYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcmApO1xufVxuXG5mdW5jdGlvbiBFeHRyYWN0SGlnaFdhdGVyTWFyayhzdHJhdGVneSwgZGVmYXVsdEhXTSkge1xuICAgIGNvbnN0IHsgaGlnaFdhdGVyTWFyayB9ID0gc3RyYXRlZ3k7XG4gICAgaWYgKGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdEhXTTtcbiAgICB9XG4gICAgaWYgKE51bWJlcklzTmFOKGhpZ2hXYXRlck1hcmspIHx8IGhpZ2hXYXRlck1hcmsgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIGhpZ2hXYXRlck1hcmsnKTtcbiAgICB9XG4gICAgcmV0dXJuIGhpZ2hXYXRlck1hcms7XG59XG5mdW5jdGlvbiBFeHRyYWN0U2l6ZUFsZ29yaXRobShzdHJhdGVneSkge1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gc3RyYXRlZ3k7XG4gICAgaWYgKCFzaXplKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiAxO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydFF1ZXVpbmdTdHJhdGVneShpbml0LCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShpbml0LCBjb250ZXh0KTtcbiAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmhpZ2hXYXRlck1hcms7XG4gICAgY29uc3Qgc2l6ZSA9IGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5zaXplO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IGhpZ2hXYXRlck1hcmsgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRVbnJlc3RyaWN0ZWREb3VibGUoaGlnaFdhdGVyTWFyayksXG4gICAgICAgIHNpemU6IHNpemUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lTaXplKHNpemUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3NpemUnIHRoYXRgKVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5U2l6ZShmbiwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gY2h1bmsgPT4gY29udmVydFVucmVzdHJpY3RlZERvdWJsZShmbihjaHVuaykpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1Npbmsob3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9yaWdpbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCBhYm9ydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5hYm9ydDtcbiAgICBjb25zdCBjbG9zZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5jbG9zZTtcbiAgICBjb25zdCBzdGFydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5zdGFydDtcbiAgICBjb25zdCB0eXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnR5cGU7XG4gICAgY29uc3Qgd3JpdGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwud3JpdGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWJvcnQ6IGFib3J0ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2soYWJvcnQsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdhYm9ydCcgdGhhdGApLFxuICAgICAgICBjbG9zZTogY2xvc2UgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTaW5rQ2xvc2VDYWxsYmFjayhjbG9zZSwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2Nsb3NlJyB0aGF0YCksXG4gICAgICAgIHN0YXJ0OiBzdGFydCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NpbmtTdGFydENhbGxiYWNrKHN0YXJ0LCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc3RhcnQnIHRoYXRgKSxcbiAgICAgICAgd3JpdGU6IHdyaXRlID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua1dyaXRlQ2FsbGJhY2sod3JpdGUsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd3cml0ZScgdGhhdGApLFxuICAgICAgICB0eXBlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAocmVhc29uKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtyZWFzb25dKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua0Nsb3NlQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2lua1N0YXJ0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcmVmbGVjdENhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTaW5rV3JpdGVDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjaHVuaywgY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY2h1bmssIGNvbnRyb2xsZXJdKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGVTdHJlYW0oeCwgY29udGV4dCkge1xuICAgIGlmICghSXNXcml0YWJsZVN0cmVhbSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIFdyaXRhYmxlU3RyZWFtLmApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydFNpZ25hbCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5hYm9ydGVkID09PSAnYm9vbGVhbic7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICAvLyBBYm9ydFNpZ25hbC5wcm90b3R5cGUuYWJvcnRlZCB0aHJvd3MgaWYgaXRzIGJyYW5kIGNoZWNrIGZhaWxzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBzdXBwb3J0c0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbic7XG4vKipcbiAqIENvbnN0cnVjdCBhIG5ldyBBYm9ydENvbnRyb2xsZXIsIGlmIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFib3J0Q29udHJvbGxlcigpIHtcbiAgICBpZiAoc3VwcG9ydHNBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHdyaXRhYmxlIHN0cmVhbSByZXByZXNlbnRzIGEgZGVzdGluYXRpb24gZm9yIGRhdGEsIGludG8gd2hpY2ggeW91IGNhbiB3cml0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFdyaXRhYmxlU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdVbmRlcmx5aW5nU2luayA9IHt9LCByYXdTdHJhdGVneSA9IHt9KSB7XG4gICAgICAgIGlmIChyYXdVbmRlcmx5aW5nU2luayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByYXdVbmRlcmx5aW5nU2luayA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnRPYmplY3QocmF3VW5kZXJseWluZ1NpbmssICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3U3RyYXRlZ3ksICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHVuZGVybHlpbmdTaW5rID0gY29udmVydFVuZGVybHlpbmdTaW5rKHJhd1VuZGVybHlpbmdTaW5rLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIEluaXRpYWxpemVXcml0YWJsZVN0cmVhbSh0aGlzKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHVuZGVybHlpbmdTaW5rLnR5cGU7XG4gICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGUgaXMgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHN0cmF0ZWd5KTtcbiAgICAgICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCAxKTtcbiAgICAgICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rKHRoaXMsIHVuZGVybHlpbmdTaW5rLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgd3JpdGFibGUgc3RyZWFtIGlzIGxvY2tlZCB0byBhIHdyaXRlci5cbiAgICAgKi9cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignbG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0cyB0aGUgc3RyZWFtLCBzaWduYWxpbmcgdGhhdCB0aGUgcHJvZHVjZXIgY2FuIG5vIGxvbmdlciBzdWNjZXNzZnVsbHkgd3JpdGUgdG8gdGhlIHN0cmVhbSBhbmQgaXQgaXMgdG8gYmVcbiAgICAgKiBpbW1lZGlhdGVseSBtb3ZlZCB0byBhbiBlcnJvcmVkIHN0YXRlLCB3aXRoIGFueSBxdWV1ZWQtdXAgd3JpdGVzIGRpc2NhcmRlZC4gVGhpcyB3aWxsIGFsc28gZXhlY3V0ZSBhbnkgYWJvcnRcbiAgICAgKiBtZWNoYW5pc20gb2YgdGhlIHVuZGVybHlpbmcgc2luay5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgZnVsZmlsbCBpZiB0aGUgc3RyZWFtIHNodXRzIGRvd24gc3VjY2Vzc2Z1bGx5LCBvciByZWplY3QgaWYgdGhlIHVuZGVybHlpbmcgc2luayBzaWduYWxlZFxuICAgICAqIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGRvaW5nIHNvLiBBZGRpdGlvbmFsbHksIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBgVHlwZUVycm9yYCAod2l0aG91dCBhdHRlbXB0aW5nIHRvIGNhbmNlbFxuICAgICAqIHRoZSBzdHJlYW0pIGlmIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGxvY2tlZC5cbiAgICAgKi9cbiAgICBhYm9ydChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgYWJvcnQgYSBzdHJlYW0gdGhhdCBhbHJlYWR5IGhhcyBhIHdyaXRlcicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbS4gVGhlIHVuZGVybHlpbmcgc2luayB3aWxsIGZpbmlzaCBwcm9jZXNzaW5nIGFueSBwcmV2aW91c2x5LXdyaXR0ZW4gY2h1bmtzLCBiZWZvcmUgaW52b2tpbmcgaXRzXG4gICAgICogY2xvc2UgYmVoYXZpb3IuIER1cmluZyB0aGlzIHRpbWUgYW55IGZ1cnRoZXIgYXR0ZW1wdHMgdG8gd3JpdGUgd2lsbCBmYWlsICh3aXRob3V0IGVycm9yaW5nIHRoZSBzdHJlYW0pLlxuICAgICAqXG4gICAgICogVGhlIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgZnVsZmlsbCBpZiBhbGwgcmVtYWluaW5nIGNodW5rcyBhcmUgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gYW5kIHRoZSBzdHJlYW1cbiAgICAgKiBzdWNjZXNzZnVsbHkgY2xvc2VzLCBvciByZWplY3RzIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGR1cmluZyB0aGlzIHByb2Nlc3MuIEFkZGl0aW9uYWxseSwgaXQgd2lsbCByZWplY3Qgd2l0aFxuICAgICAqIGEgYFR5cGVFcnJvcmAgKHdpdGhvdXQgYXR0ZW1wdGluZyB0byBjYW5jZWwgdGhlIHN0cmVhbSkgaWYgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjbG9zZSBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgd3JpdGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQ2xvc2UodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgd3JpdGVyfSBhbmQgbG9ja3MgdGhlIHN0cmVhbSB0byB0aGUgbmV3IHdyaXRlci4gV2hpbGUgdGhlIHN0cmVhbVxuICAgICAqIGlzIGxvY2tlZCwgbm8gb3RoZXIgd3JpdGVyIGNhbiBiZSBhY3F1aXJlZCB1bnRpbCB0aGlzIG9uZSBpcyByZWxlYXNlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYWJzdHJhY3Rpb25zIHRoYXQgZGVzaXJlIHRoZSBhYmlsaXR5IHRvIHdyaXRlIHRvIGEgc3RyZWFtXG4gICAgICogd2l0aG91dCBpbnRlcnJ1cHRpb24gb3IgaW50ZXJsZWF2aW5nLiBCeSBnZXR0aW5nIGEgd3JpdGVyIGZvciB0aGUgc3RyZWFtLCB5b3UgY2FuIGVuc3VyZSBub2JvZHkgZWxzZSBjYW4gd3JpdGUgYXRcbiAgICAgKiB0aGUgc2FtZSB0aW1lLCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgcmVzdWx0aW5nIHdyaXR0ZW4gZGF0YSB0byBiZSB1bnByZWRpY3RhYmxlIGFuZCBwcm9iYWJseSB1c2VsZXNzLlxuICAgICAqL1xuICAgIGdldFdyaXRlcigpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2dldFdyaXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGFib3J0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZ2V0V3JpdGVyOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBsb2NrZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdXcml0YWJsZVN0cmVhbScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihzdHJlYW0pO1xufVxuLy8gVGhyb3dzIGlmIGFuZCBvbmx5IGlmIHN0YXJ0QWxnb3JpdGhtIHRocm93cy5cbmZ1bmN0aW9uIENyZWF0ZVdyaXRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrID0gMSwgc2l6ZUFsZ29yaXRobSA9ICgpID0+IDEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuZnVuY3Rpb24gSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnd3JpdGFibGUnO1xuICAgIC8vIFRoZSBlcnJvciB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYnkgbmV3IG1ldGhvZCBjYWxscyBvbmNlIHRoZSBzdGF0ZSBiZWNvbWVzIGVycm9yZWQuIE9ubHkgc2V0IHdoZW4gW1tzdGF0ZV1dIGlzXG4gICAgLy8gJ2Vycm9yaW5nJyBvciAnZXJyb3JlZCcuIE1heSBiZSBzZXQgdG8gYW4gdW5kZWZpbmVkIHZhbHVlLlxuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl93cml0ZXIgPSB1bmRlZmluZWQ7XG4gICAgLy8gSW5pdGlhbGl6ZSB0byB1bmRlZmluZWQgZmlyc3QgYmVjYXVzZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNvbnRyb2xsZXIgY2hlY2tzIHRoaXNcbiAgICAvLyB2YXJpYWJsZSB0byB2YWxpZGF0ZSB0aGUgY2FsbGVyLlxuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoaXMgcXVldWUgaXMgcGxhY2VkIGhlcmUgaW5zdGVhZCBvZiB0aGUgd3JpdGVyIGNsYXNzIGluIG9yZGVyIHRvIGFsbG93IGZvciBwYXNzaW5nIGEgd3JpdGVyIHRvIHRoZSBuZXh0IGRhdGFcbiAgICAvLyBwcm9kdWNlciB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBxdWV1ZWQgd3JpdGVzIHRvIGZpbmlzaC5cbiAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICAvLyBXcml0ZSByZXF1ZXN0cyBhcmUgcmVtb3ZlZCBmcm9tIF93cml0ZVJlcXVlc3RzIHdoZW4gd3JpdGUoKSBpcyBjYWxsZWQgb24gdGhlIHVuZGVybHlpbmcgc2luay4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIHRoZW0gZnJvbSBiZWluZyBlcnJvbmVvdXNseSByZWplY3RlZCBvbiBlcnJvci4gSWYgYSB3cml0ZSgpIGNhbGwgaXMgaW4tZmxpZ2h0LCB0aGUgcmVxdWVzdCBpcyBzdG9yZWQgaGVyZS5cbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBwcm9taXNlIHRoYXQgd2FzIHJldHVybmVkIGZyb20gd3JpdGVyLmNsb3NlKCkuIFN0b3JlZCBoZXJlIGJlY2F1c2UgaXQgbWF5IGJlIGZ1bGZpbGxlZCBhZnRlciB0aGUgd3JpdGVyXG4gICAgLy8gaGFzIGJlZW4gZGV0YWNoZWQuXG4gICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gQ2xvc2UgcmVxdWVzdCBpcyByZW1vdmVkIGZyb20gX2Nsb3NlUmVxdWVzdCB3aGVuIGNsb3NlKCkgaXMgY2FsbGVkIG9uIHRoZSB1bmRlcmx5aW5nIHNpbmsuIFRoaXMgcHJldmVudHMgaXRcbiAgICAvLyBmcm9tIGJlaW5nIGVycm9uZW91c2x5IHJlamVjdGVkIG9uIGVycm9yLiBJZiBhIGNsb3NlKCkgY2FsbCBpcyBpbi1mbGlnaHQsIHRoZSByZXF1ZXN0IGlzIHN0b3JlZCBoZXJlLlxuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHByb21pc2UgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB3cml0ZXIuYWJvcnQoKS4gVGhpcyBtYXkgYWxzbyBiZSBmdWxmaWxsZWQgYWZ0ZXIgdGhlIHdyaXRlciBoYXMgZGV0YWNoZWQuXG4gICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBiYWNrcHJlc3N1cmUgc2lnbmFsIHNldCBieSB0aGUgY29udHJvbGxlci5cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXcml0YWJsZVN0cmVhbTtcbn1cbmZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5fd3JpdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQWJvcnQoc3RyZWFtLCByZWFzb24pIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlci5fYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgKF9hID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIuX2Fib3J0Q29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KCk7XG4gICAgLy8gVHlwZVNjcmlwdCBuYXJyb3dzIHRoZSB0eXBlIG9mIGBzdHJlYW0uX3N0YXRlYCBkb3duIHRvICd3cml0YWJsZScgfCAnZXJyb3JpbmcnLFxuICAgIC8vIGJ1dCBpdCBkb2Vzbid0IGtub3cgdGhhdCBzaWduYWxpbmcgYWJvcnQgcnVucyBhdXRob3IgY29kZSB0aGF0IG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGUgc3RhdGUuXG4gICAgLy8gV2lkZW4gdGhlIHR5cGUgYWdhaW4gYnkgY2FzdGluZyB0byBXcml0YWJsZVN0cmVhbVN0YXRlLlxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2U7XG4gICAgfVxuICAgIGxldCB3YXNBbHJlYWR5RXJyb3JpbmcgPSBmYWxzZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgd2FzQWxyZWFkeUVycm9yaW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gcmVhc29uIHdpbGwgbm90IGJlIHVzZWQsIHNvIGRvbid0IGtlZXAgYSByZWZlcmVuY2UgdG8gaXQuXG4gICAgICAgIHJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfcHJvbWlzZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX3Jlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICBfcmVqZWN0OiByZWplY3QsXG4gICAgICAgICAgICBfcmVhc29uOiByZWFzb24sXG4gICAgICAgICAgICBfd2FzQWxyZWFkeUVycm9yaW5nOiB3YXNBbHJlYWR5RXJyb3JpbmdcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgIGlmICghd2FzQWxyZWFkeUVycm9yaW5nKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIHJlYXNvbik7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHdyaXRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgY2xvc2VkYCkpO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsb3NlUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgX3JlamVjdDogcmVqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gY2xvc2VSZXF1ZXN0O1xuICAgIH0pO1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSAmJiBzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2Uoc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuLy8gV3JpdGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3Qoc3RyZWFtKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdFxuICAgICAgICB9O1xuICAgICAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMucHVzaCh3cml0ZVJlcXVlc3QpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCBlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JpbmcnO1xuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbiAgICB9XG4gICAgaWYgKCFXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0KHN0cmVhbSkgJiYgY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hFcnJvcmluZyhzdHJlYW0pIHtcbiAgICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yZWQnO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyW0Vycm9yU3RlcHNdKCk7XG4gICAgY29uc3Qgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5mb3JFYWNoKHdyaXRlUmVxdWVzdCA9PiB7XG4gICAgICAgIHdyaXRlUmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICB9KTtcbiAgICBzdHJlYW0uX3dyaXRlUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFib3J0UmVxdWVzdCA9IHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdDtcbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFib3J0UmVxdWVzdC5fd2FzQWxyZWFkeUVycm9yaW5nKSB7XG4gICAgICAgIGFib3J0UmVxdWVzdC5fcmVqZWN0KHN0b3JlZEVycm9yKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcltBYm9ydFN0ZXBzXShhYm9ydFJlcXVlc3QuX3JlYXNvbik7XG4gICAgdXBvblByb21pc2UocHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBhYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgICAgYWJvcnRSZXF1ZXN0Ll9yZWplY3QocmVhc29uKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yKHN0cmVhbSwgZXJyb3IpIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0Ll9yZWplY3QoZXJyb3IpO1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbihzdHJlYW0sIGVycm9yKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0Ll9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgIC8vIFRoZSBlcnJvciB3YXMgdG9vIGxhdGUgdG8gZG8gYW55dGhpbmcsIHNvIGl0IGlzIGlnbm9yZWQuXG4gICAgICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0Ll9yZXNvbHZlKCk7XG4gICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3Ioc3RyZWFtLCBlcnJvcikge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3JlamVjdChlcnJvcik7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAvLyBOZXZlciBleGVjdXRlIHNpbmsgYWJvcnQoKSBhZnRlciBzaW5rIGNsb3NlKCkuXG4gICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpO1xufVxuLy8gVE9ETyhyaWNlYSk6IEZpeCBhbHBoYWJldGljYWwgb3JkZXIuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPT09IHVuZGVmaW5lZCAmJiBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPSBzdHJlYW0uX2Nsb3NlUmVxdWVzdDtcbiAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5zaGlmdCgpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1SZWplY3RDbG9zZUFuZENsb3NlZFByb21pc2VJZk5lZWRlZChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9jbG9zZVJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdC5fcmVqZWN0KHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQgJiYgYmFja3ByZXNzdXJlICE9PSBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICBpZiAoYmFja3ByZXNzdXJlKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7XG59XG4vKipcbiAqIEEgZGVmYXVsdCB3cml0ZXIgdmVuZGVkIGJ5IGEge0BsaW5rIFdyaXRhYmxlU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoc3RyZWFtLCAxLCAnV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyJyk7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlU3RyZWFtKHN0cmVhbSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZCBmb3IgZXhjbHVzaXZlIHdyaXRpbmcgYnkgYW5vdGhlciB3cml0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBzdHJlYW0uX3dyaXRlciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBpZiAoIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgJiYgc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZEVycm9yID0gc3RyZWFtLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh0aGlzLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCwgb3IgcmVqZWN0ZWQgaWYgdGhlIHN0cmVhbSBldmVyIGVycm9ycyBvclxuICAgICAqIHRoZSB3cml0ZXLigJlzIGxvY2sgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBzdHJlYW0gZmluaXNoZXMgY2xvc2luZy5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgc3RyZWFt4oCZcyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXMgb3Zlci1mdWxsLlxuICAgICAqIEEgcHJvZHVjZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEgdG8gd3JpdGUuXG4gICAgICpcbiAgICAgKiBJdCB3aWxsIGJlIGBudWxsYCBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byAoZHVlIHRvIGVpdGhlciBiZWluZyBlcnJvcmVkLCBvciBoYXZpbmcgYW4gYWJvcnRcbiAgICAgKiBxdWV1ZWQgdXApLiBJdCB3aWxsIHJldHVybiB6ZXJvIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkLiBBbmQgdGhlIGdldHRlciB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpbnZva2VkIHdoZW5cbiAgICAgKiB0aGUgd3JpdGVy4oCZcyBsb2NrIGlzIHJlbGVhc2VkLlxuICAgICAqL1xuICAgIGdldCBkZXNpcmVkU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBzdHJlYW3igJlzIGludGVybmFsIHF1ZXVlIHRyYW5zaXRpb25zXG4gICAgICogZnJvbSBub24tcG9zaXRpdmUgdG8gcG9zaXRpdmUsIHNpZ25hbGluZyB0aGF0IGl0IGlzIG5vIGxvbmdlciBhcHBseWluZyBiYWNrcHJlc3N1cmUuIE9uY2UgdGhlIGRlc2lyZWQgc2l6ZSBkaXBzXG4gICAgICogYmFjayB0byB6ZXJvIG9yIGJlbG93LCB0aGUgZ2V0dGVyIHdpbGwgcmV0dXJuIGEgbmV3IHByb21pc2UgdGhhdCBzdGF5cyBwZW5kaW5nIHVudGlsIHRoZSBuZXh0IHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3RyZWFtIGJlY29tZXMgZXJyb3JlZCBvciBhYm9ydGVkLCBvciB0aGUgd3JpdGVy4oCZcyBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlY29tZVxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIGdldCByZWFkeSgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWR5JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSByZWFkZXIgaXMgYWN0aXZlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAbGluayBXcml0YWJsZVN0cmVhbS5hYm9ydCB8IHN0cmVhbS5hYm9ydChyZWFzb24pfS5cbiAgICAgKi9cbiAgICBhYm9ydChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdhYm9ydCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFdyaXRhYmxlU3RyZWFtLmNsb3NlIHwgc3RyZWFtLmNsb3NlKCl9LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignY2xvc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjbG9zZSBhbiBhbHJlYWR5LWNsb3Npbmcgc3RyZWFtJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIHdyaXRlcuKAmXMgbG9jayBvbiB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0uIEFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgd3JpdGVyIGlzIG5vIGxvbmdlciBhY3RpdmUuXG4gICAgICogSWYgdGhlIGFzc29jaWF0ZWQgc3RyZWFtIGlzIGVycm9yZWQgd2hlbiB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIHdyaXRlciB3aWxsIGFwcGVhciBlcnJvcmVkIGluIHRoZSBzYW1lIHdheSBmcm9tXG4gICAgICogbm93IG9uOyBvdGhlcndpc2UsIHRoZSB3cml0ZXIgd2lsbCBhcHBlYXIgY2xvc2VkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBsb2NrIGNhbiBzdGlsbCBiZSByZWxlYXNlZCBldmVuIGlmIHNvbWUgb25nb2luZyB3cml0ZXMgaGF2ZSBub3QgeWV0IGZpbmlzaGVkIChpLmUuIGV2ZW4gaWYgdGhlXG4gICAgICogcHJvbWlzZXMgcmV0dXJuZWQgZnJvbSBwcmV2aW91cyBjYWxscyB0byB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLndyaXRlIHwgd3JpdGUoKX0gaGF2ZSBub3QgeWV0IHNldHRsZWQpLlxuICAgICAqIEl04oCZcyBub3QgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlIGxvY2sgb24gdGhlIHdyaXRlciBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3cml0ZTsgdGhlIGxvY2sgaW5zdGVhZCBzaW1wbHkgcHJldmVudHNcbiAgICAgKiBvdGhlciBwcm9kdWNlcnMgZnJvbSB3cml0aW5nIGluIGFuIGludGVybGVhdmVkIG1hbm5lci5cbiAgICAgKi9cbiAgICByZWxlYXNlTG9jaygpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlbGVhc2VMb2NrJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh0aGlzKTtcbiAgICB9XG4gICAgd3JpdGUoY2h1bmsgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ3dyaXRlJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUodGhpcywgY2h1bmspO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIHtcbiAgICBhYm9ydDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlbGVhc2VMb2NrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB3cml0ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2VkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBkZXNpcmVkU2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZHk6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLlxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19vd25lcldyaXRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcjtcbn1cbi8vIEEgY2xpZW50IG9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydChzdHJlYW0sIHJlYXNvbik7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24od3JpdGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSB8fCBzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHtcbiAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZVJlYWR5UHJvbWlzZVJlamVjdGVkKHdyaXRlciwgZXJyb3IpIHtcbiAgICBpZiAod3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCBlcnJvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckdldERlc2lyZWRTaXplKHdyaXRlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcgfHwgc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3QgcmVsZWFzZWRFcnJvciA9IG5ldyBUeXBlRXJyb3IoYFdyaXRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCk7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWxlYXNlZEVycm9yKTtcbiAgICAvLyBUaGUgc3RhdGUgdHJhbnNpdGlvbnMgdG8gXCJlcnJvcmVkXCIgYmVmb3JlIHRoZSBzaW5rIGFib3J0KCkgbWV0aG9kIHJ1bnMsIGJ1dCB0aGUgd3JpdGVyLmNsb3NlZCBwcm9taXNlIGlzIG5vdFxuICAgIC8vIHJlamVjdGVkIHVudGlsIGFmdGVyd2FyZHMuIFRoaXMgbWVhbnMgdGhhdCBzaW1wbHkgdGVzdGluZyBzdGF0ZSB3aWxsIG5vdCB3b3JrLlxuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCh3cml0ZXIsIHJlbGVhc2VkRXJyb3IpO1xuICAgIHN0cmVhbS5fd3JpdGVyID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbSA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlKHdyaXRlciwgY2h1bmspIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUoY29udHJvbGxlciwgY2h1bmspO1xuICAgIGlmIChzdHJlYW0gIT09IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignd3JpdGUgdG8nKSk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgfHwgc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgY2xvc2luZyBvciBjbG9zZWQgYW5kIGNhbm5vdCBiZSB3cml0dGVuIHRvJykpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdChzdHJlYW0pO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmNvbnN0IGNsb3NlU2VudGluZWwgPSB7fTtcbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW0gfCB3cml0YWJsZSBzdHJlYW19J3Mgc3RhdGUgYW5kIGludGVybmFsIHF1ZXVlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aGljaCB3YXMgcGFzc2VkIHRvIGBXcml0YWJsZVN0cmVhbS5hYm9ydChyZWFzb24pYCB3aGVuIHRoZSBzdHJlYW0gd2FzIGFib3J0ZWQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqICBUaGlzIHByb3BlcnR5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvc3RyZWFtcy9wdWxsLzExNzcuXG4gICAgICogIFVzZSB7QGxpbmsgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5zaWduYWx9J3MgYHJlYXNvbmAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBnZXQgYWJvcnRSZWFzb24oKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMignYWJvcnRSZWFzb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWJvcnRSZWFzb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGBBYm9ydFNpZ25hbGAgdGhhdCBjYW4gYmUgdXNlZCB0byBhYm9ydCB0aGUgcGVuZGluZyB3cml0ZSBvciBjbG9zZSBvcGVyYXRpb24gd2hlbiB0aGUgc3RyZWFtIGlzIGFib3J0ZWQuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdzaWduYWwnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYWJvcnRDb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIE9sZGVyIGJyb3dzZXJzIG9yIG9sZGVyIE5vZGUgdmVyc2lvbnMgbWF5IG5vdCBzdXBwb3J0IGBBYm9ydENvbnRyb2xsZXJgIG9yIGBBYm9ydFNpZ25hbGAuXG4gICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGJ1bmRsZSBhbmQgc2hpcCBhbiBgQWJvcnRDb250cm9sbGVyYCBwb2x5ZmlsbCB0b2dldGhlciB3aXRoIG91ciBwb2x5ZmlsbCxcbiAgICAgICAgICAgIC8vIHNvIGluc3RlYWQgd2Ugb25seSBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgYHNpZ25hbGAgaWYgd2UgZmluZCBhIGdsb2JhbCBgQWJvcnRDb250cm9sbGVyYCBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLnNpZ25hbCBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29udHJvbGxlZCB3cml0YWJsZSBzdHJlYW0sIG1ha2luZyBhbGwgZnV0dXJlIGludGVyYWN0aW9ucyB3aXRoIGl0IGZhaWwgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgYGVgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcmFyZWx5IHVzZWQsIHNpbmNlIHVzdWFsbHkgaXQgc3VmZmljZXMgdG8gcmV0dXJuIGEgcmVqZWN0ZWQgcHJvbWlzZSBmcm9tIG9uZSBvZiB0aGUgdW5kZXJseWluZ1xuICAgICAqIHNpbmsncyBtZXRob2RzLiBIb3dldmVyLCBpdCBjYW4gYmUgdXNlZnVsIGZvciBzdWRkZW5seSBzaHV0dGluZyBkb3duIGEgc3RyZWFtIGluIHJlc3BvbnNlIHRvIGFuIGV2ZW50IG91dHNpZGUgdGhlXG4gICAgICogbm9ybWFsIGxpZmVjeWNsZSBvZiBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgdW5kZXJseWluZyBzaW5rLlxuICAgICAqL1xuICAgIGVycm9yKGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlICE9PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICAvLyBUaGUgc3RyZWFtIGlzIGNsb3NlZCwgZXJyb3JlZCBvciB3aWxsIGJlIHNvb24uIFRoZSBzaW5rIGNhbid0IGRvIGFueXRoaW5nIHVzZWZ1bCBpZiBpdCBnZXRzIGFuIGVycm9yIGhlcmUsIHNvXG4gICAgICAgICAgICAvLyBqdXN0IHRyZWF0IGl0IGFzIGEgbm8tb3AuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsIGUpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0Fib3J0U3RlcHNdKHJlYXNvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9hYm9ydEFsZ29yaXRobShyZWFzb24pO1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW0Vycm9yU3RlcHNdKCkge1xuICAgICAgICBSZXNldFF1ZXVlKHRoaXMpO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgYWJvcnRSZWFzb246IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZXJyb3I6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgaW1wbGVtZW50aW5nIGludGVyZmFjZSByZXF1aXJlZCBieSB0aGUgV3JpdGFibGVTdHJlYW0uXG5mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkV3JpdGFibGVTdHJlYW0nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbn1cbmZ1bmN0aW9uIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCB3cml0ZUFsZ29yaXRobSwgY2xvc2VBbGdvcml0aG0sIGFib3J0QWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7XG4gICAgY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAvLyBOZWVkIHRvIHNldCB0aGUgc2xvdHMgc28gdGhhdCB0aGUgYXNzZXJ0IGRvZXNuJ3QgZmlyZS4gSW4gdGhlIHNwZWMgdGhlIHNsb3RzIGFscmVhZHkgZXhpc3QgaW1wbGljaXRseS5cbiAgICBjb250cm9sbGVyLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuX2Fib3J0UmVhc29uID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2Fib3J0Q29udHJvbGxlciA9IGNyZWF0ZUFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSBzaXplQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNID0gaGlnaFdhdGVyTWFyaztcbiAgICBjb250cm9sbGVyLl93cml0ZUFsZ29yaXRobSA9IHdyaXRlQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtID0gY2xvc2VBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fYWJvcnRBbGdvcml0aG0gPSBhYm9ydEFsZ29yaXRobTtcbiAgICBjb25zdCBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpO1xuICAgIFdyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKTtcbiAgICBjb25zdCBzdGFydFJlc3VsdCA9IHN0YXJ0QWxnb3JpdGhtKCk7XG4gICAgY29uc3Qgc3RhcnRQcm9taXNlID0gcHJvbWlzZVJlc29sdmVkV2l0aChzdGFydFJlc3VsdCk7XG4gICAgdXBvblByb21pc2Uoc3RhcnRQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfSwgciA9PiB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1Npbmsoc3RyZWFtLCB1bmRlcmx5aW5nU2luaywgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBsZXQgc3RhcnRBbGdvcml0aG0gPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgbGV0IHdyaXRlQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGxldCBjbG9zZUFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgYWJvcnRBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgaWYgKHVuZGVybHlpbmdTaW5rLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRBbGdvcml0aG0gPSAoKSA9PiB1bmRlcmx5aW5nU2luay5zdGFydChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdTaW5rLndyaXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd3JpdGVBbGdvcml0aG0gPSBjaHVuayA9PiB1bmRlcmx5aW5nU2luay53cml0ZShjaHVuaywgY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU2luay5jbG9zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsb3NlQWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ1NpbmsuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdTaW5rLmFib3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWJvcnRBbGdvcml0aG0gPSByZWFzb24gPT4gdW5kZXJseWluZ1NpbmsuYWJvcnQocmVhc29uKTtcbiAgICB9XG4gICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xufVxuLy8gQ2xlYXJBbGdvcml0aG1zIG1heSBiZSBjYWxsZWQgdHdpY2UuIEVycm9yaW5nIHRoZSBzYW1lIHN0cmVhbSBpbiBtdWx0aXBsZSB3YXlzIHdpbGwgb2Z0ZW4gcmVzdWx0IGluIHJlZHVuZGFudCBjYWxscy5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2Fib3J0QWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShjb250cm9sbGVyKSB7XG4gICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgY2xvc2VTZW50aW5lbCwgMCk7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldENodW5rU2l6ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0oY2h1bmspO1xuICAgIH1cbiAgICBjYXRjaCAoY2h1bmtTaXplRSkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBjaHVua1NpemVFKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJXcml0ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udHJvbGxlciwgY2h1bmssIGNodW5rU2l6ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlbnF1ZXVlRSkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBlbnF1ZXVlRSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgIGlmICghV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSAmJiBzdHJlYW0uX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgIGNvbnN0IGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKTtcbiAgICB9XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBpZiAoIWNvbnRyb2xsZXIuX3N0YXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gUGVla1F1ZXVlVmFsdWUoY29udHJvbGxlcik7XG4gICAgaWYgKHZhbHVlID09PSBjbG9zZVNlbnRpbmVsKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChjb250cm9sbGVyLCBlcnJvcikge1xuICAgIGlmIChjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0uX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlcnJvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NDbG9zZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgIFdyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSk7XG4gICAgRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHNpbmtDbG9zZVByb21pc2UgPSBjb250cm9sbGVyLl9jbG9zZUFsZ29yaXRobSgpO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgdXBvblByb21pc2Uoc2lua0Nsb3NlUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2Uoc3RyZWFtKTtcbiAgICB9LCByZWFzb24gPT4ge1xuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0KHN0cmVhbSk7XG4gICAgY29uc3Qgc2lua1dyaXRlUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtKGNodW5rKTtcbiAgICB1cG9uUHJvbWlzZShzaW5rV3JpdGVQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZShzdHJlYW0pO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgICAgIERlcXVldWVWYWx1ZShjb250cm9sbGVyKTtcbiAgICAgICAgaWYgKCFXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pICYmIHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBjb25zdCBiYWNrcHJlc3N1cmUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9LCByZWFzb24gPT4ge1xuICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3Ioc3RyZWFtLCByZWFzb24pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKSB7XG4gICAgY29uc3QgZGVzaXJlZFNpemUgPSBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgcmV0dXJuIGRlc2lyZWRTaXplIDw9IDA7XG59XG4vLyBBIGNsaWVudCBvZiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlcnJvcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbTtcbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIGVycm9yKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbS5cbmZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBXcml0YWJsZVN0cmVhbWApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG5mdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJgKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIuXG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyYCk7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCAnICsgbmFtZSArICcgYSBzdHJlYW0gdXNpbmcgYSByZWxlYXNlZCB3cml0ZXInKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpIHtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdwZW5kaW5nJztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHdyaXRlcikge1xuICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpO1xuICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pIHtcbiAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh3cml0ZXIuX2Nsb3NlZFByb21pc2UpO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QocmVhc29uKTtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZVN0YXRlID0gJ3JlamVjdGVkJztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUod3JpdGVyKSB7XG4gICAgaWYgKHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncmVzb2x2ZWQnO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKSB7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCh3cml0ZXIpIHtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpO1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKSB7XG4gICAgaWYgKHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSh3cml0ZXIuX3JlYWR5UHJvbWlzZSk7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0KHJlYXNvbik7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VTdGF0ZSA9ICdyZWplY3RlZCc7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQod3JpdGVyKSB7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUod3JpdGVyKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKSB7XG4gICAgaWYgKHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ2Z1bGZpbGxlZCc7XG59XG5cbi8vLyA8cmVmZXJlbmNlIGxpYj1cImRvbVwiIC8+XG5jb25zdCBOYXRpdmVET01FeGNlcHRpb24gPSB0eXBlb2YgRE9NRXhjZXB0aW9uICE9PSAndW5kZWZpbmVkJyA/IERPTUV4Y2VwdGlvbiA6IHVuZGVmaW5lZDtcblxuLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbmZ1bmN0aW9uIGlzRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IoY3Rvcikge1xuICAgIGlmICghKHR5cGVvZiBjdG9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBjdG9yID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBuZXcgY3RvcigpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgY29uc3QgY3RvciA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJyc7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgJ0Vycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCAnY29uc3RydWN0b3InLCB7IHZhbHVlOiBjdG9yLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIHJldHVybiBjdG9yO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuY29uc3QgRE9NRXhjZXB0aW9uJDEgPSBpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yKE5hdGl2ZURPTUV4Y2VwdGlvbikgPyBOYXRpdmVET01FeGNlcHRpb24gOiBjcmVhdGVET01FeGNlcHRpb25Qb2x5ZmlsbCgpO1xuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVBpcGVUbyhzb3VyY2UsIGRlc3QsIHByZXZlbnRDbG9zZSwgcHJldmVudEFib3J0LCBwcmV2ZW50Q2FuY2VsLCBzaWduYWwpIHtcbiAgICBjb25zdCByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHNvdXJjZSk7XG4gICAgY29uc3Qgd3JpdGVyID0gQWNxdWlyZVdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcihkZXN0KTtcbiAgICBzb3VyY2UuX2Rpc3R1cmJlZCA9IHRydWU7XG4gICAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuICAgIC8vIFRoaXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzcGVjJ3MgcmVxdWlyZW1lbnQgdGhhdCB3ZSB3YWl0IGZvciBvbmdvaW5nIHdyaXRlcyBkdXJpbmcgc2h1dGRvd24uXG4gICAgbGV0IGN1cnJlbnRXcml0ZSA9IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICByZXR1cm4gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBhYm9ydEFsZ29yaXRobTtcbiAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYm9ydEFsZ29yaXRobSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBET01FeGNlcHRpb24kMSgnQWJvcnRlZCcsICdBYm9ydEVycm9yJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmICghcHJldmVudEFib3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdC5fc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1BYm9ydChkZXN0LCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2ZW50Q2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLl9zdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gUHJvbWlzZS5hbGwoYWN0aW9ucy5tYXAoYWN0aW9uID0+IGFjdGlvbigpKSksIHRydWUsIGVycm9yKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBhYm9ydEFsZ29yaXRobSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0QWxnb3JpdGhtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2luZyByZWFkZXIgYW5kIHdyaXRlciwgcmVhZCBhbGwgY2h1bmtzIGZyb20gdGhpcyBhbmQgd3JpdGUgdGhlbSB0byBkZXN0XG4gICAgICAgIC8vIC0gQmFja3ByZXNzdXJlIG11c3QgYmUgZW5mb3JjZWRcbiAgICAgICAgLy8gLSBTaHV0ZG93biBtdXN0IHN0b3AgYWxsIGFjdGl2aXR5XG4gICAgICAgIGZ1bmN0aW9uIHBpcGVMb29wKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ld1Byb21pc2UoKHJlc29sdmVMb29wLCByZWplY3RMb29wKSA9PiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbmV4dChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlTG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGBQZXJmb3JtUHJvbWlzZVRoZW5gIGluc3RlYWQgb2YgYHVwb25Qcm9taXNlYCB0byBhdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHVubmVjZXNzYXJ5IGAuY2F0Y2gocmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKWAgaGFuZGxlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1Qcm9taXNlVGhlbihwaXBlU3RlcCgpLCBuZXh0LCByZWplY3RMb29wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHBpcGVTdGVwKCkge1xuICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93bikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFBlcmZvcm1Qcm9taXNlVGhlbih3cml0ZXIuX3JlYWR5UHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdQcm9taXNlKChyZXNvbHZlUmVhZCwgcmVqZWN0UmVhZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50V3JpdGUgPSBQZXJmb3JtUHJvbWlzZVRoZW4oV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUod3JpdGVyLCBjaHVuayksIHVuZGVmaW5lZCwgbm9vcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVJlYWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiAoKSA9PiByZXNvbHZlUmVhZCh0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvclN0ZXBzOiByZWplY3RSZWFkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXJyb3JzIG11c3QgYmUgcHJvcGFnYXRlZCBmb3J3YXJkXG4gICAgICAgIGlzT3JCZWNvbWVzRXJyb3JlZChzb3VyY2UsIHJlYWRlci5fY2xvc2VkUHJvbWlzZSwgc3RvcmVkRXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcmV2ZW50QWJvcnQpIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gV3JpdGFibGVTdHJlYW1BYm9ydChkZXN0LCBzdG9yZWRFcnJvciksIHRydWUsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNodXRkb3duKHRydWUsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVycm9ycyBtdXN0IGJlIHByb3BhZ2F0ZWQgYmFja3dhcmRcbiAgICAgICAgaXNPckJlY29tZXNFcnJvcmVkKGRlc3QsIHdyaXRlci5fY2xvc2VkUHJvbWlzZSwgc3RvcmVkRXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcmV2ZW50Q2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHNvdXJjZSwgc3RvcmVkRXJyb3IpLCB0cnVlLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bih0cnVlLCBzdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDbG9zaW5nIG11c3QgYmUgcHJvcGFnYXRlZCBmb3J3YXJkXG4gICAgICAgIGlzT3JCZWNvbWVzQ2xvc2VkKHNvdXJjZSwgcmVhZGVyLl9jbG9zZWRQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXByZXZlbnRDbG9zZSkge1xuICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbigoKSA9PiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZVdpdGhFcnJvclByb3BhZ2F0aW9uKHdyaXRlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENsb3NpbmcgbXVzdCBiZSBwcm9wYWdhdGVkIGJhY2t3YXJkXG4gICAgICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChkZXN0KSB8fCBkZXN0Ll9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RDbG9zZWQgPSBuZXcgVHlwZUVycm9yKCd0aGUgZGVzdGluYXRpb24gd3JpdGFibGUgc3RyZWFtIGNsb3NlZCBiZWZvcmUgYWxsIGRhdGEgY291bGQgYmUgcGlwZWQgdG8gaXQnKTtcbiAgICAgICAgICAgIGlmICghcHJldmVudENhbmNlbCkge1xuICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbigoKSA9PiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzb3VyY2UsIGRlc3RDbG9zZWQpLCB0cnVlLCBkZXN0Q2xvc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNodXRkb3duKHRydWUsIGRlc3RDbG9zZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocGlwZUxvb3AoKSk7XG4gICAgICAgIGZ1bmN0aW9uIHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpIHtcbiAgICAgICAgICAgIC8vIEFub3RoZXIgd3JpdGUgbWF5IGhhdmUgc3RhcnRlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgb24gdGhpcyBjdXJyZW50V3JpdGUsIHNvIHdlIGhhdmUgdG8gYmUgc3VyZSB0byB3YWl0XG4gICAgICAgICAgICAvLyBmb3IgdGhhdCB0b28uXG4gICAgICAgICAgICBjb25zdCBvbGRDdXJyZW50V3JpdGUgPSBjdXJyZW50V3JpdGU7XG4gICAgICAgICAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKGN1cnJlbnRXcml0ZSwgKCkgPT4gb2xkQ3VycmVudFdyaXRlICE9PSBjdXJyZW50V3JpdGUgPyB3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNPckJlY29tZXNFcnJvcmVkKHN0cmVhbSwgcHJvbWlzZSwgYWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBvblJlamVjdGlvbihwcm9taXNlLCBhY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzT3JCZWNvbWVzQ2xvc2VkKHN0cmVhbSwgcHJvbWlzZSwgYWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwb25GdWxmaWxsbWVudChwcm9taXNlLCBhY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNodXRkb3duV2l0aEFjdGlvbihhY3Rpb24sIG9yaWdpbmFsSXNFcnJvciwgb3JpZ2luYWxFcnJvcikge1xuICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93bikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZGVzdC5fc3RhdGUgPT09ICd3cml0YWJsZScgJiYgIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpKSB7XG4gICAgICAgICAgICAgICAgdXBvbkZ1bGZpbGxtZW50KHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpLCBkb1RoZVJlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9UaGVSZXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBkb1RoZVJlc3QoKSB7XG4gICAgICAgICAgICAgICAgdXBvblByb21pc2UoYWN0aW9uKCksICgpID0+IGZpbmFsaXplKG9yaWdpbmFsSXNFcnJvciwgb3JpZ2luYWxFcnJvciksIG5ld0Vycm9yID0+IGZpbmFsaXplKHRydWUsIG5ld0Vycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2h1dGRvd24oaXNFcnJvciwgZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGRlc3QuX3N0YXRlID09PSAnd3JpdGFibGUnICYmICFXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChkZXN0KSkge1xuICAgICAgICAgICAgICAgIHVwb25GdWxmaWxsbWVudCh3YWl0Rm9yV3JpdGVzVG9GaW5pc2goKSwgKCkgPT4gZmluYWxpemUoaXNFcnJvciwgZXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcikge1xuICAgICAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSh3cml0ZXIpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbGdvcml0aG0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW0gfCByZWFkYWJsZSBzdHJlYW19J3Mgc3RhdGUgYW5kIGludGVybmFsIHF1ZXVlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGVzaXJlZCBzaXplIHRvIGZpbGwgdGhlIGNvbnRyb2xsZWQgc3RyZWFtJ3MgaW50ZXJuYWwgcXVldWUuIEl0IGNhbiBiZSBuZWdhdGl2ZSwgaWYgdGhlIHF1ZXVlIGlzXG4gICAgICogb3Zlci1mdWxsLiBBbiB1bmRlcmx5aW5nIHNvdXJjZSBvdWdodCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hlbiBhbmQgaG93IHRvIGFwcGx5IGJhY2twcmVzc3VyZS5cbiAgICAgKi9cbiAgICBnZXQgZGVzaXJlZFNpemUoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnZGVzaXJlZFNpemUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbnRyb2xsZWQgcmVhZGFibGUgc3RyZWFtLiBDb25zdW1lcnMgd2lsbCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgYW55IHByZXZpb3VzbHktZW5xdWV1ZWQgY2h1bmtzIGZyb21cbiAgICAgKiB0aGUgc3RyZWFtLCBidXQgb25jZSB0aG9zZSBhcmUgcmVhZCwgdGhlIHN0cmVhbSB3aWxsIGJlY29tZSBjbG9zZWQuXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UodGhpcyk7XG4gICAgfVxuICAgIGVucXVldWUoY2h1bmsgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdlbnF1ZXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGVucXVldWUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFcnJvcnMgdGhlIGNvbnRyb2xsZWQgcmVhZGFibGUgc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZSBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC5cbiAgICAgKi9cbiAgICBlcnJvcihlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbQ2FuY2VsU3RlcHNdKHJlYXNvbikge1xuICAgICAgICBSZXNldFF1ZXVlKHRoaXMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jYW5jZWxBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtQdWxsU3RlcHNdKHJlYWRSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgaWYgKHRoaXMuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gRGVxdWV1ZVZhbHVlKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Nsb3NlUmVxdWVzdGVkICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkUmVxdWVzdC5fY2h1bmtTdGVwcyhjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHN0cmVhbSwgcmVhZFJlcXVlc3QpO1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIGNsb3NlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBlbnF1ZXVlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBlcnJvcjogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZGVzaXJlZFNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc2hvdWxkUHVsbCA9IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKTtcbiAgICBpZiAoIXNob3VsZFB1bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29udHJvbGxlci5fcHVsbGluZykge1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHB1bGxQcm9taXNlID0gY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSgpO1xuICAgIHVwb25Qcm9taXNlKHB1bGxQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3B1bGxBZ2Fpbikge1xuICAgICAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgIH0sIGUgPT4ge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICBpZiAoIVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGRlc2lyZWRTaXplID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpO1xuICAgIGlmIChkZXNpcmVkU2l6ZSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbn1cbi8vIEEgY2xpZW50IG9mIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgbWF5IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdG8gYnlwYXNzIHN0YXRlIGNoZWNrLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoIVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IHRydWU7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICBpZiAoIVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShjb250cm9sbGVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbTtcbiAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgY2h1bmssIGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjaHVua1NpemU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaHVua1NpemUgPSBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0oY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChjaHVua1NpemVFKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgY2h1bmtTaXplRSk7XG4gICAgICAgICAgICB0aHJvdyBjaHVua1NpemVFO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZW5xdWV1ZUUpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlbnF1ZXVlRSk7XG4gICAgICAgICAgICB0aHJvdyBlbnF1ZXVlRTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbn1cbi8vIFRoaXMgaXMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgVHJhbnNmb3JtU3RyZWFtLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShjb250cm9sbGVyKSB7XG4gICAgaWYgKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKCFjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCAmJiBzdGF0ZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbSA9IHN0cmVhbTtcbiAgICBjb250cm9sbGVyLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX3B1bGxpbmcgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneVNpemVBbGdvcml0aG0gPSBzaXplQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5SFdNID0gaGlnaFdhdGVyTWFyaztcbiAgICBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtID0gcHVsbEFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSBjYW5jZWxBbGdvcml0aG07XG4gICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfSwgciA9PiB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCByKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHN0cmVhbSwgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBsZXQgc3RhcnRBbGdvcml0aG0gPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgbGV0IHB1bGxBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgbGV0IGNhbmNlbEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBpZiAodW5kZXJseWluZ1NvdXJjZS5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ1NvdXJjZS5zdGFydChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdTb3VyY2UucHVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHB1bGxBbGdvcml0aG0gPSAoKSA9PiB1bmRlcmx5aW5nU291cmNlLnB1bGwoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh1bmRlcmx5aW5nU291cmNlLmNhbmNlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbmNlbEFsZ29yaXRobSA9IHJlYXNvbiA9PiB1bmRlcmx5aW5nU291cmNlLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEobmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyYCk7XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtVGVlKHN0cmVhbSwgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgaWYgKElzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcikpIHtcbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbVRlZShzdHJlYW0pO1xuICAgIH1cbiAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0VGVlKHN0cmVhbSk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRUZWUoc3RyZWFtLCBjbG9uZUZvckJyYW5jaDIpIHtcbiAgICBjb25zdCByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgbGV0IHJlYWRpbmcgPSBmYWxzZTtcbiAgICBsZXQgcmVhZEFnYWluID0gZmFsc2U7XG4gICAgbGV0IGNhbmNlbGVkMSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWxlZDIgPSBmYWxzZTtcbiAgICBsZXQgcmVhc29uMTtcbiAgICBsZXQgcmVhc29uMjtcbiAgICBsZXQgYnJhbmNoMTtcbiAgICBsZXQgYnJhbmNoMjtcbiAgICBsZXQgcmVzb2x2ZUNhbmNlbFByb21pc2U7XG4gICAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ld1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkge1xuICAgICAgICBpZiAocmVhZGluZykge1xuICAgICAgICAgICAgcmVhZEFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYSBtaWNyb3Rhc2sgYmVjYXVzZSBpdCB0YWtlcyBhdCBsZWFzdCBhIG1pY3JvdGFzayB0byBkZXRlY3QgZXJyb3JzICh1c2luZ1xuICAgICAgICAgICAgICAgIC8vIHJlYWRlci5fY2xvc2VkUHJvbWlzZSBiZWxvdyksIGFuZCB3ZSB3YW50IGVycm9ycyBpbiBzdHJlYW0gdG8gZXJyb3IgYm90aCBicmFuY2hlcyBpbW1lZGlhdGVseS4gV2UgY2Fubm90IGxldFxuICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgc3luY2hyb25vdXNseS1hdmFpbGFibGUgcmVhZHMgZ2V0IGFoZWFkIG9mIGFzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSBlcnJvcnMuXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWFkQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsxID0gY2h1bms7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gYWNjZXNzIHRoZSBjbG9uaW5nIGNvZGUgcmlnaHQgbm93IGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFkZCBvbmUgdGhlbiB3ZSdsbCBuZWVkIGFuIGltcGxlbWVudGF0aW9uIGZvciBzZXJpYWxpemFibGUgb2JqZWN0cy5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFjYW5jZWxlZDIgJiYgY2xvbmVGb3JCcmFuY2gyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgY2h1bmsyID0gU3RydWN0dXJlZERlc2VyaWFsaXplKFN0cnVjdHVyZWRTZXJpYWxpemUoY2h1bmsyKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmsxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBZ2Fpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVsbEFsZ29yaXRobSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSB8fCAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwxQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDEgPSB0cnVlO1xuICAgICAgICByZWFzb24xID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwyQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDIgPSB0cnVlO1xuICAgICAgICByZWFzb24yID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBicmFuY2gxID0gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbDFBbGdvcml0aG0pO1xuICAgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMkFsZ29yaXRobSk7XG4gICAgdXBvblJlamVjdGlvbihyZWFkZXIuX2Nsb3NlZFByb21pc2UsIChyKSA9PiB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgaWYgKCFjYW5jZWxlZDEgfHwgIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbYnJhbmNoMSwgYnJhbmNoMl07XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1UZWUoc3RyZWFtKSB7XG4gICAgbGV0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBsZXQgcmVhZGluZyA9IGZhbHNlO1xuICAgIGxldCByZWFkQWdhaW5Gb3JCcmFuY2gxID0gZmFsc2U7XG4gICAgbGV0IHJlYWRBZ2FpbkZvckJyYW5jaDIgPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsZWQxID0gZmFsc2U7XG4gICAgbGV0IGNhbmNlbGVkMiA9IGZhbHNlO1xuICAgIGxldCByZWFzb24xO1xuICAgIGxldCByZWFzb24yO1xuICAgIGxldCBicmFuY2gxO1xuICAgIGxldCBicmFuY2gyO1xuICAgIGxldCByZXNvbHZlQ2FuY2VsUHJvbWlzZTtcbiAgICBjb25zdCBjYW5jZWxQcm9taXNlID0gbmV3UHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGZvcndhcmRSZWFkZXJFcnJvcih0aGlzUmVhZGVyKSB7XG4gICAgICAgIHVwb25SZWplY3Rpb24odGhpc1JlYWRlci5fY2xvc2VkUHJvbWlzZSwgciA9PiB7XG4gICAgICAgICAgICBpZiAodGhpc1JlYWRlciAhPT0gcmVhZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgcik7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgICAgIGlmICghY2FuY2VsZWQxIHx8ICFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVsbFdpdGhEZWZhdWx0UmVhZGVyKCkge1xuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xuICAgICAgICAgICAgZm9yd2FyZFJlYWRlckVycm9yKHJlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfY2h1bmtTdGVwczogY2h1bmsgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZGVsYXllZCBhIG1pY3JvdGFzayBiZWNhdXNlIGl0IHRha2VzIGF0IGxlYXN0IGEgbWljcm90YXNrIHRvIGRldGVjdCBlcnJvcnMgKHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gcmVhZGVyLl9jbG9zZWRQcm9taXNlIGJlbG93KSwgYW5kIHdlIHdhbnQgZXJyb3JzIGluIHN0cmVhbSB0byBlcnJvciBib3RoIGJyYW5jaGVzIGltbWVkaWF0ZWx5LiBXZSBjYW5ub3QgbGV0XG4gICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSByZWFkcyBnZXQgYWhlYWQgb2YgYXN5bmNocm9ub3VzbHktYXZhaWxhYmxlIGVycm9ycy5cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRBZ2FpbkZvckJyYW5jaDEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmVhZEFnYWluRm9yQnJhbmNoMiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuazEgPSBjaHVuaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSAmJiAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rMiA9IENsb25lQXNVaW50OEFycmF5KGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChjbG9uZUUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjbG9uZUUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCBjbG9uZUUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmsxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBZ2FpbkZvckJyYW5jaDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1bGwxQWxnb3JpdGhtKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVhZEFnYWluRm9yQnJhbmNoMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVsbDJBbGdvcml0aG0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQxKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZChicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSB8fCAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsV2l0aEJZT0JSZWFkZXIodmlldywgZm9yQnJhbmNoMikge1xuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICAgICAgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pO1xuICAgICAgICAgICAgZm9yd2FyZFJlYWRlckVycm9yKHJlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnlvYkJyYW5jaCA9IGZvckJyYW5jaDIgPyBicmFuY2gyIDogYnJhbmNoMTtcbiAgICAgICAgY29uc3Qgb3RoZXJCcmFuY2ggPSBmb3JCcmFuY2gyID8gYnJhbmNoMSA6IGJyYW5jaDI7XG4gICAgICAgIGNvbnN0IHJlYWRJbnRvUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBkZWxheWVkIGEgbWljcm90YXNrIGJlY2F1c2UgaXQgdGFrZXMgYXQgbGVhc3QgYSBtaWNyb3Rhc2sgdG8gZGV0ZWN0IGVycm9ycyAodXNpbmdcbiAgICAgICAgICAgICAgICAvLyByZWFkZXIuX2Nsb3NlZFByb21pc2UgYmVsb3cpLCBhbmQgd2Ugd2FudCBlcnJvcnMgaW4gc3RyZWFtIHRvIGVycm9yIGJvdGggYnJhbmNoZXMgaW1tZWRpYXRlbHkuIFdlIGNhbm5vdCBsZXRcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHN5bmNocm9ub3VzbHktYXZhaWxhYmxlIHJlYWRzIGdldCBhaGVhZCBvZiBhc3luY2hyb25vdXNseS1hdmFpbGFibGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZEFnYWluRm9yQnJhbmNoMSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZWFkQWdhaW5Gb3JCcmFuY2gyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5b2JDYW5jZWxlZCA9IGZvckJyYW5jaDIgPyBjYW5jZWxlZDIgOiBjYW5jZWxlZDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyQ2FuY2VsZWQgPSBmb3JCcmFuY2gyID8gY2FuY2VsZWQxIDogY2FuY2VsZWQyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW90aGVyQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9uZWRDaHVuaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkQ2h1bmsgPSBDbG9uZUFzVWludDhBcnJheShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoY2xvbmVFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3Iob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNsb25lRSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3VmlldyhieW9iQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lZENodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBZ2FpbkZvckJyYW5jaDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1bGwxQWxnb3JpdGhtKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVhZEFnYWluRm9yQnJhbmNoMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVsbDJBbGdvcml0aG0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ5b2JDYW5jZWxlZCA9IGZvckJyYW5jaDIgPyBjYW5jZWxlZDIgOiBjYW5jZWxlZDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJDYW5jZWxlZCA9IGZvckJyYW5jaDIgPyBjYW5jZWxlZDEgOiBjYW5jZWxlZDI7XG4gICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghb3RoZXJDYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2Uob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnlvYkNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3RoZXJDYW5jZWxlZCAmJiBvdGhlckJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYnlvYkNhbmNlbGVkIHx8ICFvdGhlckNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXJSZWFkKHJlYWRlciwgdmlldywgcmVhZEludG9SZXF1ZXN0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVsbDFBbGdvcml0aG0oKSB7XG4gICAgICAgIGlmIChyZWFkaW5nKSB7XG4gICAgICAgICAgICByZWFkQWdhaW5Gb3JCcmFuY2gxID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJ5b2JSZXF1ZXN0ID0gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgIGlmIChieW9iUmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHVsbFdpdGhEZWZhdWx0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwdWxsV2l0aEJZT0JSZWFkZXIoYnlvYlJlcXVlc3QuX3ZpZXcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsMkFsZ29yaXRobSgpIHtcbiAgICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJlYWRBZ2FpbkZvckJyYW5jaDIgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgYnlvYlJlcXVlc3QgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0QllPQlJlcXVlc3QoYnJhbmNoMi5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgaWYgKGJ5b2JSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBwdWxsV2l0aERlZmF1bHRSZWFkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHB1bGxXaXRoQllPQlJlYWRlcihieW9iUmVxdWVzdC5fdmlldywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2FuY2VsMUFsZ29yaXRobShyZWFzb24pIHtcbiAgICAgICAgY2FuY2VsZWQxID0gdHJ1ZTtcbiAgICAgICAgcmVhc29uMSA9IHJlYXNvbjtcbiAgICAgICAgaWYgKGNhbmNlbGVkMikge1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlUmVhc29uID0gQ3JlYXRlQXJyYXlGcm9tTGlzdChbcmVhc29uMSwgcmVhc29uMl0pO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsUmVzdWx0ID0gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCBjb21wb3NpdGVSZWFzb24pO1xuICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsUHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2FuY2VsMkFsZ29yaXRobShyZWFzb24pIHtcbiAgICAgICAgY2FuY2VsZWQyID0gdHJ1ZTtcbiAgICAgICAgcmVhc29uMiA9IHJlYXNvbjtcbiAgICAgICAgaWYgKGNhbmNlbGVkMSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlUmVhc29uID0gQ3JlYXRlQXJyYXlGcm9tTGlzdChbcmVhc29uMSwgcmVhc29uMl0pO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsUmVzdWx0ID0gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCBjb21wb3NpdGVSZWFzb24pO1xuICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UoY2FuY2VsUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsUHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RhcnRBbGdvcml0aG0oKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYnJhbmNoMSA9IENyZWF0ZVJlYWRhYmxlQnl0ZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbDFBbGdvcml0aG0sIGNhbmNlbDFBbGdvcml0aG0pO1xuICAgIGJyYW5jaDIgPSBDcmVhdGVSZWFkYWJsZUJ5dGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGwyQWxnb3JpdGhtLCBjYW5jZWwyQWxnb3JpdGhtKTtcbiAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICByZXR1cm4gW2JyYW5jaDEsIGJyYW5jaDJdO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ0RlZmF1bHRPckJ5dGVTb3VyY2Uoc291cmNlLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShzb3VyY2UsIGNvbnRleHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gc291cmNlO1xuICAgIGNvbnN0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5hdXRvQWxsb2NhdGVDaHVua1NpemU7XG4gICAgY29uc3QgY2FuY2VsID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLmNhbmNlbDtcbiAgICBjb25zdCBwdWxsID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnB1bGw7XG4gICAgY29uc3Qgc3RhcnQgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuc3RhcnQ7XG4gICAgY29uc3QgdHlwZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC50eXBlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGF1dG9BbGxvY2F0ZUNodW5rU2l6ZTogYXV0b0FsbG9jYXRlQ2h1bmtTaXplID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbnNpZ25lZExvbmdMb25nV2l0aEVuZm9yY2VSYW5nZShhdXRvQWxsb2NhdGVDaHVua1NpemUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2F1dG9BbGxvY2F0ZUNodW5rU2l6ZScgdGhhdGApLFxuICAgICAgICBjYW5jZWw6IGNhbmNlbCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZUNhbmNlbENhbGxiYWNrKGNhbmNlbCwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2NhbmNlbCcgdGhhdGApLFxuICAgICAgICBwdWxsOiBwdWxsID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU291cmNlUHVsbENhbGxiYWNrKHB1bGwsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdwdWxsJyB0aGF0YCksXG4gICAgICAgIHN0YXJ0OiBzdGFydCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVN0YXJ0Q2FsbGJhY2soc3RhcnQsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdzdGFydCcgdGhhdGApLFxuICAgICAgICB0eXBlOiB0eXBlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBjb252ZXJ0UmVhZGFibGVTdHJlYW1UeXBlKHR5cGUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3R5cGUnIHRoYXRgKVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZUNhbmNlbENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKHJlYXNvbikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbcmVhc29uXSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVB1bGxDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjb250cm9sbGVyKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtjb250cm9sbGVyXSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVN0YXJ0Q2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcmVmbGVjdENhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFJlYWRhYmxlU3RyZWFtVHlwZSh0eXBlLCBjb250ZXh0KSB7XG4gICAgdHlwZSA9IGAke3R5cGV9YDtcbiAgICBpZiAodHlwZSAhPT0gJ2J5dGVzJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9ICcke3R5cGV9JyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgUmVhZGFibGVTdHJlYW1UeXBlYCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UmVhZGVyT3B0aW9ucyhvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShvcHRpb25zLCBjb250ZXh0KTtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1vZGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogbW9kZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY29udmVydFJlYWRhYmxlU3RyZWFtUmVhZGVyTW9kZShtb2RlLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdtb2RlJyB0aGF0YClcbiAgICB9O1xufVxuZnVuY3Rpb24gY29udmVydFJlYWRhYmxlU3RyZWFtUmVhZGVyTW9kZShtb2RlLCBjb250ZXh0KSB7XG4gICAgbW9kZSA9IGAke21vZGV9YDtcbiAgICBpZiAobW9kZSAhPT0gJ2J5b2InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7Y29udGV4dH0gJyR7bW9kZX0nIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciBSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGVgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJdGVyYXRvck9wdGlvbnMob3B0aW9ucywgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkob3B0aW9ucywgY29udGV4dCk7XG4gICAgY29uc3QgcHJldmVudENhbmNlbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmV2ZW50Q2FuY2VsO1xuICAgIHJldHVybiB7IHByZXZlbnRDYW5jZWw6IEJvb2xlYW4ocHJldmVudENhbmNlbCkgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBpcGVPcHRpb25zKG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9wdGlvbnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IHByZXZlbnRBYm9ydCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmV2ZW50QWJvcnQ7XG4gICAgY29uc3QgcHJldmVudENhbmNlbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmV2ZW50Q2FuY2VsO1xuICAgIGNvbnN0IHByZXZlbnRDbG9zZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmV2ZW50Q2xvc2U7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0QWJvcnRTaWduYWwoc2lnbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdzaWduYWwnIHRoYXRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJldmVudEFib3J0OiBCb29sZWFuKHByZXZlbnRBYm9ydCksXG4gICAgICAgIHByZXZlbnRDYW5jZWw6IEJvb2xlYW4ocHJldmVudENhbmNlbCksXG4gICAgICAgIHByZXZlbnRDbG9zZTogQm9vbGVhbihwcmV2ZW50Q2xvc2UpLFxuICAgICAgICBzaWduYWxcbiAgICB9O1xufVxuZnVuY3Rpb24gYXNzZXJ0QWJvcnRTaWduYWwoc2lnbmFsLCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSBpcyBub3QgYW4gQWJvcnRTaWduYWwuYCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0UmVhZGFibGVXcml0YWJsZVBhaXIocGFpciwgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkocGFpciwgY29udGV4dCk7XG4gICAgY29uc3QgcmVhZGFibGUgPSBwYWlyID09PSBudWxsIHx8IHBhaXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhaXIucmVhZGFibGU7XG4gICAgYXNzZXJ0UmVxdWlyZWRGaWVsZChyZWFkYWJsZSwgJ3JlYWRhYmxlJywgJ1JlYWRhYmxlV3JpdGFibGVQYWlyJyk7XG4gICAgYXNzZXJ0UmVhZGFibGVTdHJlYW0ocmVhZGFibGUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3JlYWRhYmxlJyB0aGF0YCk7XG4gICAgY29uc3Qgd3JpdGFibGUgPSBwYWlyID09PSBudWxsIHx8IHBhaXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhaXIud3JpdGFibGU7XG4gICAgYXNzZXJ0UmVxdWlyZWRGaWVsZCh3cml0YWJsZSwgJ3dyaXRhYmxlJywgJ1JlYWRhYmxlV3JpdGFibGVQYWlyJyk7XG4gICAgYXNzZXJ0V3JpdGFibGVTdHJlYW0od3JpdGFibGUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3dyaXRhYmxlJyB0aGF0YCk7XG4gICAgcmV0dXJuIHsgcmVhZGFibGUsIHdyaXRhYmxlIH07XG59XG5cbi8qKlxuICogQSByZWFkYWJsZSBzdHJlYW0gcmVwcmVzZW50cyBhIHNvdXJjZSBvZiBkYXRhLCBmcm9tIHdoaWNoIHlvdSBjYW4gcmVhZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdVbmRlcmx5aW5nU291cmNlID0ge30sIHJhd1N0cmF0ZWd5ID0ge30pIHtcbiAgICAgICAgaWYgKHJhd1VuZGVybHlpbmdTb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmF3VW5kZXJseWluZ1NvdXJjZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnRPYmplY3QocmF3VW5kZXJseWluZ1NvdXJjZSwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gY29udmVydFF1ZXVpbmdTdHJhdGVneShyYXdTdHJhdGVneSwgJ1NlY29uZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgY29uc3QgdW5kZXJseWluZ1NvdXJjZSA9IGNvbnZlcnRVbmRlcmx5aW5nRGVmYXVsdE9yQnl0ZVNvdXJjZShyYXdVbmRlcmx5aW5nU291cmNlLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbSh0aGlzKTtcbiAgICAgICAgaWYgKHVuZGVybHlpbmdTb3VyY2UudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAgICAgaWYgKHN0cmF0ZWd5LnNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgc3RyYXRlZ3kgZm9yIGEgYnl0ZSBzdHJlYW0gY2Fubm90IGhhdmUgYSBzaXplIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gRXh0cmFjdEhpZ2hXYXRlck1hcmsoc3RyYXRlZ3ksIDApO1xuICAgICAgICAgICAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2UodGhpcywgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzaXplQWxnb3JpdGhtID0gRXh0cmFjdFNpemVBbGdvcml0aG0oc3RyYXRlZ3kpO1xuICAgICAgICAgICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCAxKTtcbiAgICAgICAgICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHRoaXMsIHVuZGVybHlpbmdTb3VyY2UsIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSByZWFkYWJsZSBzdHJlYW0gaXMgbG9ja2VkIHRvIGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB8IHJlYWRlcn0uXG4gICAgICovXG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2xvY2tlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIHRoZSBzdHJlYW0sIHNpZ25hbGluZyBhIGxvc3Mgb2YgaW50ZXJlc3QgaW4gdGhlIHN0cmVhbSBieSBhIGNvbnN1bWVyLlxuICAgICAqXG4gICAgICogVGhlIHN1cHBsaWVkIGByZWFzb25gIGFyZ3VtZW50IHdpbGwgYmUgZ2l2ZW4gdG8gdGhlIHVuZGVybHlpbmcgc291cmNlJ3Mge0BsaW5rIFVuZGVybHlpbmdTb3VyY2UuY2FuY2VsIHwgY2FuY2VsKCl9XG4gICAgICogbWV0aG9kLCB3aGljaCBtaWdodCBvciBtaWdodCBub3QgdXNlIGl0LlxuICAgICAqL1xuICAgIGNhbmNlbChyZWFzb24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbmNlbCBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgcmVhZGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICBnZXRSZWFkZXIocmF3T3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnZ2V0UmVhZGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbnZlcnRSZWFkZXJPcHRpb25zKHJhd09wdGlvbnMsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKTtcbiAgICB9XG4gICAgcGlwZVRocm91Z2gocmF3VHJhbnNmb3JtLCByYXdPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3BpcGVUaHJvdWdoJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChyYXdUcmFuc2Zvcm0sIDEsICdwaXBlVGhyb3VnaCcpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBjb252ZXJ0UmVhZGFibGVXcml0YWJsZVBhaXIocmF3VHJhbnNmb3JtLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb252ZXJ0UGlwZU9wdGlvbnMocmF3T3B0aW9ucywgJ1NlY29uZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBSZWFkYWJsZVN0cmVhbScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHRyYW5zZm9ybS53cml0YWJsZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVGhyb3VnaCBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBXcml0YWJsZVN0cmVhbScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBSZWFkYWJsZVN0cmVhbVBpcGVUbyh0aGlzLCB0cmFuc2Zvcm0ud3JpdGFibGUsIG9wdGlvbnMucHJldmVudENsb3NlLCBvcHRpb25zLnByZXZlbnRBYm9ydCwgb3B0aW9ucy5wcmV2ZW50Q2FuY2VsLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocHJvbWlzZSk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ucmVhZGFibGU7XG4gICAgfVxuICAgIHBpcGVUbyhkZXN0aW5hdGlvbiwgcmF3T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdwaXBlVG8nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGBQYXJhbWV0ZXIgMSBpcyByZXF1aXJlZCBpbiAncGlwZVRvJy5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0oZGVzdGluYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvJ3MgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIFdyaXRhYmxlU3RyZWFtYCkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcHRpb25zO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGNvbnZlcnRQaXBlT3B0aW9ucyhyYXdPcHRpb25zLCAnU2Vjb25kIHBhcmFtZXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbyBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBSZWFkYWJsZVN0cmVhbScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZChkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8gY2Fubm90IGJlIHVzZWQgb24gYSBsb2NrZWQgV3JpdGFibGVTdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtUGlwZVRvKHRoaXMsIGRlc3RpbmF0aW9uLCBvcHRpb25zLnByZXZlbnRDbG9zZSwgb3B0aW9ucy5wcmV2ZW50QWJvcnQsIG9wdGlvbnMucHJldmVudENhbmNlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZWVzIHRoaXMgcmVhZGFibGUgc3RyZWFtLCByZXR1cm5pbmcgYSB0d28tZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZSB0d28gcmVzdWx0aW5nIGJyYW5jaGVzIGFzXG4gICAgICogbmV3IHtAbGluayBSZWFkYWJsZVN0cmVhbX0gaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogVGVlaW5nIGEgc3RyZWFtIHdpbGwgbG9jayBpdCwgcHJldmVudGluZyBhbnkgb3RoZXIgY29uc3VtZXIgZnJvbSBhY3F1aXJpbmcgYSByZWFkZXIuXG4gICAgICogVG8gY2FuY2VsIHRoZSBzdHJlYW0sIGNhbmNlbCBib3RoIG9mIHRoZSByZXN1bHRpbmcgYnJhbmNoZXM7IGEgY29tcG9zaXRlIGNhbmNlbGxhdGlvbiByZWFzb24gd2lsbCB0aGVuIGJlXG4gICAgICogcHJvcGFnYXRlZCB0byB0aGUgc3RyZWFtJ3MgdW5kZXJseWluZyBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIGNodW5rcyBzZWVuIGluIGVhY2ggYnJhbmNoIHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGUgY2h1bmtzIGFyZSBub3QgaW1tdXRhYmxlLFxuICAgICAqIHRoaXMgY291bGQgYWxsb3cgaW50ZXJmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBicmFuY2hlcy5cbiAgICAgKi9cbiAgICB0ZWUoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCd0ZWUnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicmFuY2hlcyA9IFJlYWRhYmxlU3RyZWFtVGVlKHRoaXMpO1xuICAgICAgICByZXR1cm4gQ3JlYXRlQXJyYXlGcm9tTGlzdChicmFuY2hlcyk7XG4gICAgfVxuICAgIHZhbHVlcyhyYXdPcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCd2YWx1ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gY29udmVydEl0ZXJhdG9yT3B0aW9ucyhyYXdPcHRpb25zLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIHJldHVybiBBY3F1aXJlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMsIG9wdGlvbnMucHJldmVudENhbmNlbCk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgY2FuY2VsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBnZXRSZWFkZXI6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHBpcGVUaHJvdWdoOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBwaXBlVG86IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHRlZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgdmFsdWVzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBsb2NrZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC5hc3luY0l0ZXJhdG9yID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IsIHtcbiAgICAgICAgdmFsdWU6IFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS52YWx1ZXMsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbi8vIFRocm93cyBpZiBhbmQgb25seSBpZiBzdGFydEFsZ29yaXRobSB0aHJvd3MuXG5mdW5jdGlvbiBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrID0gMSwgc2l6ZUFsZ29yaXRobSA9ICgpID0+IDEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgIHJldHVybiBzdHJlYW07XG59XG4vLyBUaHJvd3MgaWYgYW5kIG9ubHkgaWYgc3RhcnRBbGdvcml0aG0gdGhyb3dzLlxuZnVuY3Rpb24gQ3JlYXRlUmVhZGFibGVCeXRlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0pIHtcbiAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIDAsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHN0cmVhbTtcbn1cbmZ1bmN0aW9uIEluaXRpYWxpemVSZWFkYWJsZVN0cmVhbShzdHJlYW0pIHtcbiAgICBzdHJlYW0uX3N0YXRlID0gJ3JlYWRhYmxlJztcbiAgICBzdHJlYW0uX3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkO1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gZmFsc2U7XG59XG5mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9yZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DYW5jZWwoc3RyZWFtLCByZWFzb24pIHtcbiAgICBzdHJlYW0uX2Rpc3R1cmJlZCA9IHRydWU7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyICE9PSB1bmRlZmluZWQgJiYgSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMuZm9yRWFjaChyZWFkSW50b1JlcXVlc3QgPT4ge1xuICAgICAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9jbG9zZVN0ZXBzKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlQ2FuY2VsUHJvbWlzZSA9IHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyW0NhbmNlbFN0ZXBzXShyZWFzb24pO1xuICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChzb3VyY2VDYW5jZWxQcm9taXNlLCBub29wKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgIGlmIChyZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZShyZWFkZXIpO1xuICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzLmZvckVhY2gocmVhZFJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2Nsb3NlU3RlcHMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpIHtcbiAgICBzdHJlYW0uX3N0YXRlID0gJ2Vycm9yZWQnO1xuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSBlO1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgIGlmIChyZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgZSk7XG4gICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaChyZWFkUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZWFkUmVxdWVzdC5fZXJyb3JTdGVwcyhlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5fcmVhZFJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMuZm9yRWFjaChyZWFkSW50b1JlcXVlc3QgPT4ge1xuICAgICAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9lcnJvclN0ZXBzKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLl9yZWFkSW50b1JlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtYCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lJbml0KGluaXQsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KGluaXQsIGNvbnRleHQpO1xuICAgIGNvbnN0IGhpZ2hXYXRlck1hcmsgPSBpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuaGlnaFdhdGVyTWFyaztcbiAgICBhc3NlcnRSZXF1aXJlZEZpZWxkKGhpZ2hXYXRlck1hcmssICdoaWdoV2F0ZXJNYXJrJywgJ1F1ZXVpbmdTdHJhdGVneUluaXQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBoaWdoV2F0ZXJNYXJrOiBjb252ZXJ0VW5yZXN0cmljdGVkRG91YmxlKGhpZ2hXYXRlck1hcmspXG4gICAgfTtcbn1cblxuLy8gVGhlIHNpemUgZnVuY3Rpb24gbXVzdCBub3QgaGF2ZSBhIHByb3RvdHlwZSBwcm9wZXJ0eSBub3IgYmUgYSBjb25zdHJ1Y3RvclxuY29uc3QgYnl0ZUxlbmd0aFNpemVGdW5jdGlvbiA9IChjaHVuaykgPT4ge1xuICAgIHJldHVybiBjaHVuay5ieXRlTGVuZ3RoO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShieXRlTGVuZ3RoU2l6ZUZ1bmN0aW9uLCAnbmFtZScsIHtcbiAgICB2YWx1ZTogJ3NpemUnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG4vKipcbiAqIEEgcXVldWluZyBzdHJhdGVneSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggY2h1bmsuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQob3B0aW9ucywgMSwgJ0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3knKTtcbiAgICAgICAgb3B0aW9ucyA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lJbml0KG9wdGlvbnMsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgdGhpcy5fYnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsgPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhpZ2ggd2F0ZXIgbWFyayBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgZ2V0IGhpZ2hXYXRlck1hcmsoKSB7XG4gICAgICAgIGlmICghSXNCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlTGVuZ3RoQnJhbmRDaGVja0V4Y2VwdGlvbignaGlnaFdhdGVyTWFyaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWVhc3VyZXMgdGhlIHNpemUgb2YgYGNodW5rYCBieSByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIGl0cyBgYnl0ZUxlbmd0aGAgcHJvcGVydHkuXG4gICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIGlmICghSXNCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlTGVuZ3RoQnJhbmRDaGVja0V4Y2VwdGlvbignc2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlTGVuZ3RoU2l6ZUZ1bmN0aW9uO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLCB7XG4gICAgaGlnaFdhdGVyTWFyazogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgc2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kuXG5mdW5jdGlvbiBieXRlTGVuZ3RoQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3lgKTtcbn1cbmZ1bmN0aW9uIElzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3k7XG59XG5cbi8vIFRoZSBzaXplIGZ1bmN0aW9uIG11c3Qgbm90IGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgbm9yIGJlIGEgY29uc3RydWN0b3JcbmNvbnN0IGNvdW50U2l6ZUZ1bmN0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybiAxO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb3VudFNpemVGdW5jdGlvbiwgJ25hbWUnLCB7XG4gICAgdmFsdWU6ICdzaXplJyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuLyoqXG4gKiBBIHF1ZXVpbmcgc3RyYXRlZ3kgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiBjaHVua3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBDb3VudFF1ZXVpbmdTdHJhdGVneSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KG9wdGlvbnMsIDEsICdDb3VudFF1ZXVpbmdTdHJhdGVneScpO1xuICAgICAgICBvcHRpb25zID0gY29udmVydFF1ZXVpbmdTdHJhdGVneUluaXQob3B0aW9ucywgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICB0aGlzLl9jb3VudFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsgPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhpZ2ggd2F0ZXIgbWFyayBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgZ2V0IGhpZ2hXYXRlck1hcmsoKSB7XG4gICAgICAgIGlmICghSXNDb3VudFF1ZXVpbmdTdHJhdGVneSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgY291bnRCcmFuZENoZWNrRXhjZXB0aW9uKCdoaWdoV2F0ZXJNYXJrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50UXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWVhc3VyZXMgdGhlIHNpemUgb2YgYGNodW5rYCBieSBhbHdheXMgcmV0dXJuaW5nIDEuXG4gICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHRvdGFsIHF1ZXVlIHNpemUgaXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNodW5rcyBpbiB0aGUgcXVldWUuXG4gICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIGlmICghSXNDb3VudFF1ZXVpbmdTdHJhdGVneSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgY291bnRCcmFuZENoZWNrRXhjZXB0aW9uKCdzaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50U2l6ZUZ1bmN0aW9uO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENvdW50UXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZSwge1xuICAgIGhpZ2hXYXRlck1hcms6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvdW50UXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdDb3VudFF1ZXVpbmdTdHJhdGVneScsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIENvdW50UXVldWluZ1N0cmF0ZWd5LlxuZnVuY3Rpb24gY291bnRCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgQ291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIENvdW50UXVldWluZ1N0cmF0ZWd5YCk7XG59XG5mdW5jdGlvbiBJc0NvdW50UXVldWluZ1N0cmF0ZWd5KHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY291bnRRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIENvdW50UXVldWluZ1N0cmF0ZWd5O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNmb3JtZXIob3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9yaWdpbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCBmbHVzaCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5mbHVzaDtcbiAgICBjb25zdCByZWFkYWJsZVR5cGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwucmVhZGFibGVUeXBlO1xuICAgIGNvbnN0IHN0YXJ0ID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnN0YXJ0O1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC50cmFuc2Zvcm07XG4gICAgY29uc3Qgd3JpdGFibGVUeXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLndyaXRhYmxlVHlwZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmbHVzaDogZmx1c2ggPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFRyYW5zZm9ybWVyRmx1c2hDYWxsYmFjayhmbHVzaCwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2ZsdXNoJyB0aGF0YCksXG4gICAgICAgIHJlYWRhYmxlVHlwZSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRUcmFuc2Zvcm1lclN0YXJ0Q2FsbGJhY2soc3RhcnQsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdzdGFydCcgdGhhdGApLFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VHJhbnNmb3JtZXJUcmFuc2Zvcm1DYWxsYmFjayh0cmFuc2Zvcm0sIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICd0cmFuc2Zvcm0nIHRoYXRgKSxcbiAgICAgICAgd3JpdGFibGVUeXBlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2Zvcm1lckZsdXNoQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY29udHJvbGxlcl0pO1xufVxuZnVuY3Rpb24gY29udmVydFRyYW5zZm9ybWVyU3RhcnRDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjb250cm9sbGVyKSA9PiByZWZsZWN0Q2FsbChmbiwgb3JpZ2luYWwsIFtjb250cm9sbGVyXSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNmb3JtZXJUcmFuc2Zvcm1DYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjaHVuaywgY29udHJvbGxlcikgPT4gcHJvbWlzZUNhbGwoZm4sIG9yaWdpbmFsLCBbY2h1bmssIGNvbnRyb2xsZXJdKTtcbn1cblxuLy8gQ2xhc3MgVHJhbnNmb3JtU3RyZWFtXG4vKipcbiAqIEEgdHJhbnNmb3JtIHN0cmVhbSBjb25zaXN0cyBvZiBhIHBhaXIgb2Ygc3RyZWFtczogYSB7QGxpbmsgV3JpdGFibGVTdHJlYW0gfCB3cml0YWJsZSBzdHJlYW19LFxuICoga25vd24gYXMgaXRzIHdyaXRhYmxlIHNpZGUsIGFuZCBhIHtAbGluayBSZWFkYWJsZVN0cmVhbSB8IHJlYWRhYmxlIHN0cmVhbX0sIGtub3duIGFzIGl0cyByZWFkYWJsZSBzaWRlLlxuICogSW4gYSBtYW5uZXIgc3BlY2lmaWMgdG8gdGhlIHRyYW5zZm9ybSBzdHJlYW0gaW4gcXVlc3Rpb24sIHdyaXRlcyB0byB0aGUgd3JpdGFibGUgc2lkZSByZXN1bHQgaW4gbmV3IGRhdGEgYmVpbmdcbiAqIG1hZGUgYXZhaWxhYmxlIGZvciByZWFkaW5nIGZyb20gdGhlIHJlYWRhYmxlIHNpZGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBUcmFuc2Zvcm1TdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHJhd1RyYW5zZm9ybWVyID0ge30sIHJhd1dyaXRhYmxlU3RyYXRlZ3kgPSB7fSwgcmF3UmVhZGFibGVTdHJhdGVneSA9IHt9KSB7XG4gICAgICAgIGlmIChyYXdUcmFuc2Zvcm1lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByYXdUcmFuc2Zvcm1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd3JpdGFibGVTdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3V3JpdGFibGVTdHJhdGVneSwgJ1NlY29uZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgY29uc3QgcmVhZGFibGVTdHJhdGVneSA9IGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kocmF3UmVhZGFibGVTdHJhdGVneSwgJ1RoaXJkIHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IGNvbnZlcnRUcmFuc2Zvcm1lcihyYXdUcmFuc2Zvcm1lciwgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZXIucmVhZGFibGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHJlYWRhYmxlVHlwZSBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNmb3JtZXIud3JpdGFibGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHdyaXRhYmxlVHlwZSBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSBFeHRyYWN0SGlnaFdhdGVyTWFyayhyZWFkYWJsZVN0cmF0ZWd5LCAwKTtcbiAgICAgICAgY29uc3QgcmVhZGFibGVTaXplQWxnb3JpdGhtID0gRXh0cmFjdFNpemVBbGdvcml0aG0ocmVhZGFibGVTdHJhdGVneSk7XG4gICAgICAgIGNvbnN0IHdyaXRhYmxlSGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHdyaXRhYmxlU3RyYXRlZ3ksIDEpO1xuICAgICAgICBjb25zdCB3cml0YWJsZVNpemVBbGdvcml0aG0gPSBFeHRyYWN0U2l6ZUFsZ29yaXRobSh3cml0YWJsZVN0cmF0ZWd5KTtcbiAgICAgICAgbGV0IHN0YXJ0UHJvbWlzZV9yZXNvbHZlO1xuICAgICAgICBjb25zdCBzdGFydFByb21pc2UgPSBuZXdQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICAgICAgSW5pdGlhbGl6ZVRyYW5zZm9ybVN0cmVhbSh0aGlzLCBzdGFydFByb21pc2UsIHdyaXRhYmxlSGlnaFdhdGVyTWFyaywgd3JpdGFibGVTaXplQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIodGhpcywgdHJhbnNmb3JtZXIpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZXIuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUodHJhbnNmb3JtZXIuc3RhcnQodGhpcy5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnRQcm9taXNlX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVhZGFibGUgc2lkZSBvZiB0aGUgdHJhbnNmb3JtIHN0cmVhbS5cbiAgICAgKi9cbiAgICBnZXQgcmVhZGFibGUoKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24oJ3JlYWRhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd3JpdGFibGUgc2lkZSBvZiB0aGUgdHJhbnNmb3JtIHN0cmVhbS5cbiAgICAgKi9cbiAgICBnZXQgd3JpdGFibGUoKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24oJ3dyaXRhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICByZWFkYWJsZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgd3JpdGFibGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnVHJhbnNmb3JtU3RyZWFtJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG5mdW5jdGlvbiBJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtKHN0cmVhbSwgc3RhcnRQcm9taXNlLCB3cml0YWJsZUhpZ2hXYXRlck1hcmssIHdyaXRhYmxlU2l6ZUFsZ29yaXRobSwgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLCByZWFkYWJsZVNpemVBbGdvcml0aG0pIHtcbiAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0UHJvbWlzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd3JpdGVBbGdvcml0aG0oY2h1bmspIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0oc3RyZWFtLCBjaHVuayk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFib3J0QWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb3NlQWxnb3JpdGhtKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobShzdHJlYW0pO1xuICAgIH1cbiAgICBzdHJlYW0uX3dyaXRhYmxlID0gQ3JlYXRlV3JpdGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIHdyaXRhYmxlSGlnaFdhdGVyTWFyaywgd3JpdGFibGVTaXplQWxnb3JpdGhtKTtcbiAgICBmdW5jdGlvbiBwdWxsQWxnb3JpdGhtKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZVB1bGxBbGdvcml0aG0oc3RyZWFtKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2FuY2VsQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgcmVhc29uKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgc3RyZWFtLl9yZWFkYWJsZSA9IENyZWF0ZVJlYWRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKTtcbiAgICAvLyBUaGUgW1tiYWNrcHJlc3N1cmVdXSBzbG90IGlzIHNldCB0byB1bmRlZmluZWQgc28gdGhhdCBpdCBjYW4gYmUgaW5pdGlhbGlzZWQgYnkgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlLlxuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gdW5kZWZpbmVkO1xuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCB0cnVlKTtcbiAgICBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbSh4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgVHJhbnNmb3JtU3RyZWFtO1xufVxuLy8gVGhpcyBpcyBhIG5vLW9wIGlmIGJvdGggc2lkZXMgYXJlIGFscmVhZHkgZXJyb3JlZC5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbUVycm9yKHN0cmVhbSwgZSkge1xuICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGUpO1xuICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlKSB7XG4gICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyKTtcbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZChzdHJlYW0uX3dyaXRhYmxlLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIsIGUpO1xuICAgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICAvLyBQcmV0ZW5kIHRoYXQgcHVsbCgpIHdhcyBjYWxsZWQgdG8gcGVybWl0IGFueSBwZW5kaW5nIHdyaXRlKCkgY2FsbHMgdG8gY29tcGxldGUuIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSgpXG4gICAgICAgIC8vIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBlbnF1ZXVlKCkgb3IgcHVsbCgpIG9uY2UgdGhlIFJlYWRhYmxlU3RyZWFtIGlzIGVycm9yZWQsIHNvIHRoaXMgd2lsbCB3aWxsIGJlIHRoZSBmaW5hbCB0aW1lXG4gICAgICAgIC8vIF9iYWNrcHJlc3N1cmUgaXMgc2V0LlxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBmYWxzZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgYmFja3ByZXNzdXJlKSB7XG4gICAgLy8gUGFzc2VzIGFsc28gd2hlbiBjYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi5cbiAgICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUoKTtcbiAgICB9XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gbmV3UHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gYmFja3ByZXNzdXJlO1xufVxuLy8gQ2xhc3MgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJcbi8qKlxuICogQWxsb3dzIGNvbnRyb2wgb2YgdGhlIHtAbGluayBSZWFkYWJsZVN0cmVhbX0gYW5kIHtAbGluayBXcml0YWJsZVN0cmVhbX0gb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFRyYW5zZm9ybVN0cmVhbX0uXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGVzaXJlZCBzaXplIHRvIGZpbGwgdGhlIHJlYWRhYmxlIHNpZGXigJlzIGludGVybmFsIHF1ZXVlLiBJdCBjYW4gYmUgbmVnYXRpdmUsIGlmIHRoZSBxdWV1ZSBpcyBvdmVyLWZ1bGwuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkYWJsZUNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKHJlYWRhYmxlQ29udHJvbGxlcik7XG4gICAgfVxuICAgIGVucXVldWUoY2h1bmsgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2VucXVldWUnKTtcbiAgICAgICAgfVxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUodGhpcywgY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFcnJvcnMgYm90aCB0aGUgcmVhZGFibGUgc2lkZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGUgb2YgdGhlIGNvbnRyb2xsZWQgdHJhbnNmb3JtIHN0cmVhbSwgbWFraW5nIGFsbCBmdXR1cmVcbiAgICAgKiBpbnRlcmFjdGlvbnMgd2l0aCBpdCBmYWlsIHdpdGggdGhlIGdpdmVuIGVycm9yIGBlYC4gQW55IGNodW5rcyBxdWV1ZWQgZm9yIHRyYW5zZm9ybWF0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGVycm9yKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgcmVhZGFibGUgc2lkZSBhbmQgZXJyb3JzIHRoZSB3cml0YWJsZSBzaWRlIG9mIHRoZSBjb250cm9sbGVkIHRyYW5zZm9ybSBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlXG4gICAgICogdHJhbnNmb3JtZXIgb25seSBuZWVkcyB0byBjb25zdW1lIGEgcG9ydGlvbiBvZiB0aGUgY2h1bmtzIHdyaXR0ZW4gdG8gdGhlIHdyaXRhYmxlIHNpZGUuXG4gICAgICovXG4gICAgdGVybWluYXRlKCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbigndGVybWluYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgZW5xdWV1ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZXJyb3I6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHRlcm1pbmF0ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZGVzaXJlZFNpemU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcbmlmICh0eXBlb2YgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcicsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gVHJhbnNmb3JtIFN0cmVhbSBEZWZhdWx0IENvbnRyb2xsZXIgQWJzdHJhY3QgT3BlcmF0aW9uc1xuZnVuY3Rpb24gSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG59XG5mdW5jdGlvbiBTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgdHJhbnNmb3JtQWxnb3JpdGhtLCBmbHVzaEFsZ29yaXRobSkge1xuICAgIGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0gPSBzdHJlYW07XG4gICAgc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0gPSB0cmFuc2Zvcm1BbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0gPSBmbHVzaEFsZ29yaXRobTtcbn1cbmZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVHJhbnNmb3JtZXIoc3RyZWFtLCB0cmFuc2Zvcm1lcikge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgbGV0IHRyYW5zZm9ybUFsZ29yaXRobSA9IChjaHVuaykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKHRyYW5zZm9ybVJlc3VsdEUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHRyYW5zZm9ybVJlc3VsdEUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgZmx1c2hBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgaWYgKHRyYW5zZm9ybWVyLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyYW5zZm9ybUFsZ29yaXRobSA9IGNodW5rID0+IHRyYW5zZm9ybWVyLnRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm1lci5mbHVzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZsdXNoQWxnb3JpdGhtID0gKCkgPT4gdHJhbnNmb3JtZXIuZmx1c2goY29udHJvbGxlcik7XG4gICAgfVxuICAgIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCB0cmFuc2Zvcm1BbGdvcml0aG0sIGZsdXNoQWxnb3JpdGhtKTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyLl90cmFuc2Zvcm1BbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtO1xuICAgIGNvbnN0IHJlYWRhYmxlQ29udHJvbGxlciA9IHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICBpZiAoIVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlYWRhYmxlIHNpZGUgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBwZXJtaXRzIGVucXVldWUnKTtcbiAgICB9XG4gICAgLy8gV2UgdGhyb3R0bGUgdHJhbnNmb3JtIGludm9jYXRpb25zIGJhc2VkIG9uIHRoZSBiYWNrcHJlc3N1cmUgb2YgdGhlIFJlYWRhYmxlU3RyZWFtLCBidXQgd2Ugc3RpbGxcbiAgICAvLyBhY2NlcHQgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlKCkgY2FsbHMuXG4gICAgdHJ5IHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUocmVhZGFibGVDb250cm9sbGVyLCBjaHVuayk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlYWRhYmxlU3RyYXRlZ3kuc2l6ZSgpIHRocm93cy5cbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGUpO1xuICAgICAgICB0aHJvdyBzdHJlYW0uX3JlYWRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgY29uc3QgYmFja3ByZXNzdXJlID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZShyZWFkYWJsZUNvbnRyb2xsZXIpO1xuICAgIGlmIChiYWNrcHJlc3N1cmUgIT09IHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIHRydWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSkge1xuICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0sIGUpO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobShjaHVuayk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKHRyYW5zZm9ybVByb21pc2UsIHVuZGVmaW5lZCwgciA9PiB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0sIHIpO1xuICAgICAgICB0aHJvdyByO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJUZXJtaW5hdGUoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW07XG4gICAgY29uc3QgcmVhZGFibGVDb250cm9sbGVyID0gc3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShyZWFkYWJsZUNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcignVHJhbnNmb3JtU3RyZWFtIHRlcm1pbmF0ZWQnKTtcbiAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZXJyb3IpO1xufVxuLy8gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmsgQWxnb3JpdGhtc1xuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobShzdHJlYW0sIGNodW5rKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcjtcbiAgICBpZiAoc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgY29uc3QgYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSA9IHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGJhY2twcmVzc3VyZUNoYW5nZVByb21pc2UsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gc3RyZWFtLl93cml0YWJsZTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gd3JpdGFibGUuX3N0YXRlO1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgd3JpdGFibGUuX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybShjb250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQWJvcnRBbGdvcml0aG0oc3RyZWFtLCByZWFzb24pIHtcbiAgICAvLyBhYm9ydCgpIGlzIG5vdCBjYWxsZWQgc3luY2hyb25vdXNseSwgc28gaXQgaXMgcG9zc2libGUgZm9yIGFib3J0KCkgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBhbHJlYWR5XG4gICAgLy8gZXJyb3JlZC5cbiAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIHJlYXNvbik7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0oc3RyZWFtKSB7XG4gICAgLy8gc3RyZWFtLl9yZWFkYWJsZSBjYW5ub3QgY2hhbmdlIGFmdGVyIGNvbnN0cnVjdGlvbiwgc28gY2FjaGluZyBpdCBhY3Jvc3MgYSBjYWxsIHRvIHVzZXIgY29kZSBpcyBzYWZlLlxuICAgIGNvbnN0IHJlYWRhYmxlID0gc3RyZWFtLl9yZWFkYWJsZTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyO1xuICAgIGNvbnN0IGZsdXNoUHJvbWlzZSA9IGNvbnRyb2xsZXIuX2ZsdXNoQWxnb3JpdGhtKCk7XG4gICAgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgLy8gUmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHVuZGVmaW5lZCBvbiBzdWNjZXNzLlxuICAgIHJldHVybiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChmbHVzaFByb21pc2UsICgpID0+IHtcbiAgICAgICAgaWYgKHJlYWRhYmxlLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyByZWFkYWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHJlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgIH0sIHIgPT4ge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcihzdHJlYW0sIHIpO1xuICAgICAgICB0aHJvdyByZWFkYWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgfSk7XG59XG4vLyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlIEFsZ29yaXRobXNcbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtKHN0cmVhbSkge1xuICAgIC8vIEludmFyaWFudC4gRW5mb3JjZWQgYnkgdGhlIHByb21pc2VzIHJldHVybmVkIGJ5IHN0YXJ0KCkgYW5kIHB1bGwoKS5cbiAgICBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBmYWxzZSk7XG4gICAgLy8gUHJldmVudCB0aGUgbmV4dCBwdWxsKCkgY2FsbCB1bnRpbCB0aGVyZSBpcyBiYWNrcHJlc3N1cmUuXG4gICAgcmV0dXJuIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZTtcbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcmApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFRyYW5zZm9ybVN0cmVhbS5cbmZ1bmN0aW9uIHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBUcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFRyYW5zZm9ybVN0cmVhbWApO1xufVxuXG5leHBvcnQgeyBCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LCBDb3VudFF1ZXVpbmdTdHJhdGVneSwgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciwgUmVhZGFibGVTdHJlYW0sIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciwgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCwgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciwgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLCBUcmFuc2Zvcm1TdHJlYW0sIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLCBXcml0YWJsZVN0cmVhbSwgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciwgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb255ZmlsbC5lczIwMTgubWpzLm1hcFxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTc1KTtcbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJ0aGlzIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImV2ZW50VGFyZ2V0U2hpbSIsIkFib3J0U2lnbmFsIiwiRXZlbnRUYXJnZXQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiVHlwZUVycm9yIiwiYWJvcnRlZCIsImFib3J0ZWRGbGFncyIsImdldCIsImRlZmluZUV2ZW50QXR0cmlidXRlIiwicHJvdG90eXBlIiwiV2Vha01hcCIsImRlZmluZVByb3BlcnRpZXMiLCJlbnVtZXJhYmxlIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJjb25maWd1cmFibGUiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWxzIiwic2V0Iiwic2lnbmFsIiwiY3JlYXRlIiwiY2FsbCIsImNyZWF0ZUFib3J0U2lnbmFsIiwiZ2V0U2lnbmFsIiwiYWJvcnQiLCJkaXNwYXRjaEV2ZW50IiwidHlwZSIsImNvbnRyb2xsZXIiLCJvcHRpb25zIiwiZm9ybURhdGEiLCJjb25maWciLCJfX2Fzc2lnbiIsInVybCIsInVzZXJuYW1lIiwiRXJyb3IiLCJrZXkiLCJyZXF1ZXN0IiwicmVxdWVzdF8xIiwibWFpbExpc3RzTWVtYmVycyIsIm1haWxMaXN0TWVtYmVyc18xIiwiZG9tYWluQ3JlZGVudGlhbHNDbGllbnQiLCJkb21haW5zQ3JlZGVudGlhbHNfMSIsImRvbWFpblRlbXBsYXRlc0NsaWVudCIsImRvbWFpbnNUZW1wbGF0ZXNfMSIsImRvbWFpblRhZ3NDbGllbnQiLCJkb21haW5zVGFnc18xIiwibXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50IiwibXVsdGlwbGVWYWxpZGF0aW9uXzEiLCJkb21haW5zIiwiZG9tYWluc18xIiwid2ViaG9va3MiLCJ3ZWJob29rc18xIiwiZXZlbnRzIiwiZXZlbnRzXzEiLCJzdGF0cyIsInN0YXRzXzEiLCJzdXBwcmVzc2lvbnMiLCJzdXBwcmVzc2lvbnNfMSIsIm1lc3NhZ2VzIiwibWVzc2FnZXNfMSIsInJvdXRlcyIsInJvdXRlc18xIiwiaXBzIiwiaXBzXzEiLCJpcF9wb29scyIsImlwX3Bvb2xzXzEiLCJsaXN0cyIsImxpc3RzXzEiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlXzEiLCJkYXRhIiwicmVjZWl2aW5nIiwic2VuZGluZyIsIm5hbWUiLCJyZXF1aXJlX3RscyIsInNraXBfdmVyaWZpY2F0aW9uIiwic3RhdGUiLCJ3aWxkY2FyZCIsInNwYW1fYWN0aW9uIiwiY3JlYXRlZF9hdCIsInNtdHBfcGFzc3dvcmQiLCJzbXRwX2xvZ2luIiwicmVjZWl2aW5nX2Ruc19yZWNvcmRzIiwic2VuZGluZ19kbnNfcmVjb3JkcyIsImRvbWFpbkNyZWRlbnRpYWxzIiwiZG9tYWluVGVtcGxhdGVzIiwiZG9tYWluVGFncyIsIkRvbWFpbkNsaWVudCIsInJlc3BvbnNlIiwiYm9keSIsIml0ZW1zIiwibWFwIiwiaXRlbSIsIkRvbWFpbiIsImRvbWFpbiIsInRyYWNraW5nIiwicXVlcnkiLCJ0aGVuIiwicmVzIiwiX3BhcnNlRG9tYWluTGlzdCIsIl9wYXJzZURvbWFpbiIsInBvc3RPYmoiLCJmb3JjZV9ka2ltX2F1dGhvcml0eSIsInRvU3RyaW5nIiwicG9zdFdpdGhGRCIsInB1dCIsImRlbGV0ZSIsIl9wYXJzZU1lc3NhZ2UiLCJjb25uZWN0aW9uIiwiX3BhcnNlVHJhY2tpbmdTZXR0aW5ncyIsImFjdGl2ZSIsImVycm9yXzEiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwibWVzc2FnZSIsInB1dFdpdGhGRCIsIl9wYXJzZVRyYWNraW5nVXBkYXRlIiwiX2EiLCJpcCIsInBvb2xfaWQiLCJyZXBsYWNlbWVudCIsInNlYXJjaFBhcmFtcyIsInNlbGYiLCJka2ltU2VsZWN0b3IiLCJ3ZWJQcmVmaXgiLCJiYXNlUm91dGUiLCJEb21haW5DcmVkZW50aWFsc0NsaWVudCIsInRvdGFsQ291bnQiLCJ0b3RhbF9jb3VudCIsInNwZWMiLCJfcGFyc2VEb21haW5DcmVkZW50aWFsc0xpc3QiLCJjb25jYXQiLCJfcGFyc2VNZXNzYWdlUmVzcG9uc2UiLCJjcmVkZW50aWFsc0xvZ2luIiwiX3BhcnNlRGVsZXRlZFJlc3BvbnNlIiwidGFnSW5mbyIsInRhZyIsImRlc2NyaXB0aW9uIiwiRGF0ZSIsInRhZ1N0YXRpc3RpY0luZm8iLCJzdGFydCIsImVuZCIsInJlc29sdXRpb24iLCJzdGF0IiwidGltZSIsIkRvbWFpblRhZ3NDbGllbnQiLCJlbnRyaWVzIiwicGFnaW5nIiwicmVkdWNlIiwiYWNjIiwiZW50cmllIiwiaWQiLCJEb21haW5UYWciLCJwYWdlcyIsIl9wYXJzZVBhZ2VMaW5rcyIsIkRvbWFpblRhZ1N0YXRpc3RpYyIsIl9wYXJzZURvbWFpblRhZ3NMaXN0IiwiX3BhcnNlVGFnU3RhdGlzdGljIiwiZG9tYWluVGVtcGxhdGVGcm9tQVBJIiwiY3JlYXRlZEF0IiwiY3JlYXRlZEJ5IiwidmVyc2lvbiIsInZlcnNpb25zIiwibGVuZ3RoIiwicmVzdWx0IiwiRG9tYWluVGVtcGxhdGVzQ2xpZW50IiwiRG9tYWluVGVtcGxhdGVJdGVtIiwidGVtcGxhdGUiLCJ0ZW1wbGF0ZU5hbWUiLCJ0ZW1wbGF0ZVZlcnNpb24iLCJkIiwicGFyc2VMaXN0IiwicGFyc2VDcmVhdGlvblJlc3BvbnNlIiwicGFyc2VNdXRhdGlvblJlc3BvbnNlIiwicGFyc2VOb3RpZmljYXRpb25SZXNwb25zZSIsInBhcnNlQ3JlYXRpb25WZXJzaW9uUmVzcG9uc2UiLCJwYXJzZU11dGF0ZVRlbXBsYXRlVmVyc2lvblJlc3BvbnNlIiwicGFyc2VMaXN0VGVtcGxhdGVWZXJzaW9ucyIsIl9iIiwiYm9keU1lc3NhZ2UiLCJlcnJvciIsIl9zdXBlciIsInN0YWNrIiwiX3RoaXMiLCJkZXRhaWxzIiwiX19leHRlbmRzIiwiRXZlbnRDbGllbnQiLCJzcGxpdCIsInBvcCIsIm51bWJlciIsIl9wYXJzZVBhZ2VOdW1iZXIiLCJwYWlyIiwiX3BhcnNlUGFnZSIsInF1ZXJ5Q29weSIsInBhZ2UiLCJfcGFyc2VFdmVudExpc3QiLCJGb3JtRGF0YSIsIk1haWxndW4iLCJjbGllbnRfMSIsIlN1cHByZXNzaW9uTW9kZWxzIiwiSXBQb29sc0NsaWVudCIsInBhcnNlSXBQb29sc1Jlc3BvbnNlIiwicG9vbElkIiwicGF0Y2hXaXRoRkQiLCJJcHNDbGllbnQiLCJwYXJzZUlwc1Jlc3BvbnNlIiwibWVtYmVycyIsIkxpc3RzQ2xpZW50IiwidmFsaWRhdGlvblJlc3VsdCIsIm1haWxMaXN0QWRkcmVzcyIsImxpc3QiLCJwb3N0IiwicGFyc2VWYWxpZGF0aW9uUmVzdWx0IiwiTWFpbExpc3RzTWVtYmVycyIsIm5ld0RhdGEiLCJ2YXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsInN1YnNjcmliZWQiLCJtYWlsTGlzdE1lbWJlckFkZHJlc3MiLCJtZW1iZXIiLCJyZXFEYXRhIiwiY2hlY2tBbmRVcGRhdGVEYXRhIiwiQXJyYXkiLCJpc0FycmF5IiwidXBzZXJ0IiwiTWVzc2FnZXNDbGllbnQiLCJfcGFyc2VSZXNwb25zZSIsIk11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCIsImxpc3RJZCIsImZpbGUiLCJpc1N0cmVhbSIsInBpcGUiLCJpc05vZGVGb3JtRGF0YSIsImZvcm1EYXRhSW5zdGFuY2UiLCJ1bmRlZmluZWQiLCJnZXRIZWFkZXJzIiwidGltZW91dCIsImhlYWRlcnMiLCJGb3JtRGF0YUNvbnN0cnVjdG9yIiwiUmVxdWVzdCIsIm1ldGhvZCIsImlucHV0T3B0aW9ucyIsImJhc2ljIiwiYmFzZTY0IiwiZW5jb2RlIiwiQXV0aG9yaXphdGlvbiIsInBhcmFtcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJ0b0xvY2FsZVVwcGVyQ2FzZSIsInRocm93SHR0cEVycm9ycyIsIm9rIiwic3RyZWFtIiwiY2h1bmtzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsImNodW5rIiwicHVzaCIsIkJ1ZmZlciIsImpzb24iLCJnZXRSZXNwb25zZUJvZHkiLCJyZXNwb25zZVN0cmluZyIsInRleHQiLCJqc29uQm9keSIsInBhcnNlIiwiY29tbWFuZCIsImNyZWF0ZUZvcm1EYXRhIiwia2V5cyIsImZpbHRlciIsImZvcm1EYXRhQWNjIiwiaW5jbHVkZXMiLCJhZGRGaWxlc1RvRkQiLCJhZGRNaW1lRGF0YVRvRkQiLCJhZGRDb21tb25Qcm9wZXJ0eVRvRkQiLCJpc0J1ZmZlciIsImFwcGVuZCIsImZpbGVuYW1lIiwicHJvcGVydHlOYW1lIiwiYXBwZW5kRmlsZVRvRkQiLCJvYmoiLCJvYmpEYXRhIiwiY29udGVudFR5cGUiLCJrbm93bkxlbmd0aCIsImdldEF0dGFjaG1lbnRPcHRpb25zIiwiZm9yRWFjaCIsIlJvdXRlc0NsaWVudCIsInJvdXRlIiwiU3RhdHNDbGllbnQiLCJhcnJheVdpdGhQYWlycyIsImN1cnJlbnRQYWlyIiwicmVwZWF0ZWRQcm9wZXJ0eSIsIlN0YXRzIiwicHJlcGFyZVNlYXJjaFBhcmFtcyIsIl9wYXJzZVN0YXRzIiwiY3JlYXRlT3B0aW9ucyIsIlN1cHJlc3Npb25zXzEiLCJCT1VOQ0VTIiwiYWRkcmVzcyIsImNvZGUiLCJTdXBwcmVzc2lvbiIsIkNPTVBMQUlOVFMiLCJVTlNVQlNDUklCRVMiLCJ0YWdzIiwiV0hJVEVMSVNUUyIsInJlYXNvbiIsIm1vZGVscyIsIk1hcCIsIkJvdW5jZSIsIkNvbXBsYWludCIsIlVuc3Vic2NyaWJlIiwiV2hpdGVMaXN0IiwiU3VwcHJlc3Npb25DbGllbnQiLCJwYWdlVXJsIiwiVVJMIiwiaGFzIiwiTW9kZWwiLCJwcmVwYXJlUmVzcG9uc2UiLCJjaGVja1R5cGUiLCJtb2RlbCIsIl9wYXJzZUxpc3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJfcGFyc2VJdGVtIiwicG9zdERhdGEiLCJjcmVhdGVXaGl0ZUxpc3QiLCJtdWx0aXBsZVZhbGlkYXRpb24iLCJWYWxpZGF0ZUNsaWVudCIsIldlYmhvb2tDbGllbnQiLCJ3ZWJob29rUmVzcG9uc2UiLCJ3ZWJob29rIiwidXJscyIsIldlYmhvb2siLCJfcGFyc2VXZWJob29rTGlzdCIsIl9wYXJzZVdlYmhvb2tXaXRoSUQiLCJ0ZXN0IiwiX3BhcnNlV2ViaG9va1Rlc3QiLCJmcmVlRXhwb3J0cyIsImZyZWVHbG9iYWwiLCJnbG9iYWwiLCJ3aW5kb3ciLCJJbnZhbGlkQ2hhcmFjdGVyRXJyb3IiLCJUQUJMRSIsIlJFR0VYX1NQQUNFX0NIQVJBQ1RFUlMiLCJpbnB1dCIsIlN0cmluZyIsImEiLCJiIiwiYyIsImJ1ZmZlciIsInBhZGRpbmciLCJvdXRwdXQiLCJwb3NpdGlvbiIsImNoYXJDb2RlQXQiLCJjaGFyQXQiLCJyZXBsYWNlIiwiYml0U3RvcmFnZSIsImJpdENvdW50ZXIiLCJpbmRleE9mIiwiZnJvbUNoYXJDb2RlIiwidXJpIiwiZmlyc3RDb21tYSIsIm1ldGEiLCJzdWJzdHJpbmciLCJjaGFyc2V0IiwidHlwZUZ1bGwiLCJpIiwiZW5jb2RpbmciLCJ1bmVzY2FwZSIsImZyb20iLCJwcml2YXRlRGF0YSIsIndyYXBwZXJzIiwicGQiLCJldmVudCIsInJldHYiLCJjb25zb2xlIiwiYXNzZXJ0Iiwic2V0Q2FuY2VsRmxhZyIsInBhc3NpdmVMaXN0ZW5lciIsImNhbmNlbGFibGUiLCJjYW5jZWxlZCIsInByZXZlbnREZWZhdWx0IiwiRXZlbnQiLCJldmVudFRhcmdldCIsImV2ZW50UGhhc2UiLCJjdXJyZW50VGFyZ2V0Iiwic3RvcHBlZCIsImltbWVkaWF0ZVN0b3BwZWQiLCJ0aW1lU3RhbXAiLCJub3ciLCJkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3IiLCJkZWZpbmVDYWxsRGVzY3JpcHRvciIsImFwcGx5IiwiYXJndW1lbnRzIiwiZ2V0V3JhcHBlciIsInByb3RvIiwid3JhcHBlciIsIkJhc2VFdmVudCIsIkN1c3RvbUV2ZW50Iiwid3JpdGFibGUiLCJpc0Z1bmMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZWZpbmVXcmFwcGVyIiwiZ2V0UHJvdG90eXBlT2YiLCJpc1N0b3BwZWQiLCJzZXRQYXNzaXZlTGlzdGVuZXIiLCJ0YXJnZXQiLCJjb21wb3NlZFBhdGgiLCJOT05FIiwiQ0FQVFVSSU5HX1BIQVNFIiwiQVRfVEFSR0VUIiwiQlVCQkxJTkdfUEhBU0UiLCJzdG9wUHJvcGFnYXRpb24iLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJidWJibGVzIiwiQm9vbGVhbiIsImRlZmF1bHRQcmV2ZW50ZWQiLCJjb21wb3NlZCIsInNyY0VsZW1lbnQiLCJjYW5jZWxCdWJibGUiLCJyZXR1cm5WYWx1ZSIsImluaXRFdmVudCIsInNldFByb3RvdHlwZU9mIiwibGlzdGVuZXJzTWFwIiwiaXNPYmplY3QiLCJ4IiwiZ2V0TGlzdGVuZXJzIiwibGlzdGVuZXJzIiwiZXZlbnRUYXJnZXRQcm90b3R5cGUiLCJldmVudE5hbWUiLCJub2RlIiwibGlzdGVuZXJUeXBlIiwibGlzdGVuZXIiLCJuZXh0IiwicHJldiIsIm5ld05vZGUiLCJwYXNzaXZlIiwib25jZSIsImRlZmluZUV2ZW50QXR0cmlidXRlRGVzY3JpcHRvciIsImRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0IiwiZXZlbnROYW1lcyIsIkN1c3RvbUV2ZW50VGFyZ2V0IiwidHlwZXMiLCJhZGRFdmVudExpc3RlbmVyIiwib3B0aW9uc0lzT2JqIiwiY2FwdHVyZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3cmFwcGVkRXZlbnQiLCJ3cmFwRXZlbnQiLCJlcnIiLCJoYW5kbGVFdmVudCIsInNldEV2ZW50UGhhc2UiLCJzZXRDdXJyZW50VGFyZ2V0IiwiUmVhZGFibGUiLCJ3bSIsIkJsb2IiLCJibG9iUGFydHMiLCJzaXplIiwicGFydHMiLCJlbGVtZW50IiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInRvTG93ZXJDYXNlIiwiYXN5bmMiLCJhcnJheUJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJvZmZzZXQiLCJwYXJ0IiwicmVhZCIsInNsaWNlIiwicmVsYXRpdmVTdGFydCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJyZWxhdGl2ZUVuZCIsInNwYW4iLCJ2YWx1ZXMiLCJhZGRlZCIsImJsb2IiLCJhc3NpZ24iLCJzdGF0aWMiLCJoYXNJbnN0YW5jZSIsIm9iamVjdCIsImZldGNoIiwiaGlnaFdhdGVyTWFyayIsIkhlYWRlcnMiLCJSZXNwb25zZSIsIlJlYWRhYmxlU3RyZWFtIiwiXyIsImdsb2JhbHMiLCJnZXRHbG9iYWwiLCJwcm9wZXJ0eSIsImdsb2JhbFRoaXMiLCJnbG9iYWxQcm9wZXJ0aWVzIiwiZ2xvYmFsT2JqZWN0IiwiYmluZCIsInN1cHBvcnRzQWJvcnRDb250cm9sbGVyIiwic3VwcG9ydHNTdHJlYW1zIiwic3VwcG9ydHNGb3JtRGF0YSIsIm1lcmdlSGVhZGVycyIsInNvdXJjZTEiLCJzb3VyY2UyIiwiaXNIZWFkZXJzSW5zdGFuY2UiLCJzb3VyY2UiLCJkZWVwTWVyZ2UiLCJzb3VyY2VzIiwicmVxdWVzdE1ldGhvZHMiLCJyZXNwb25zZVR5cGVzIiwicmV0cnlBZnRlclN0YXR1c0NvZGVzIiwic3RvcCIsIkhUVFBFcnJvciIsIlRpbWVvdXRFcnJvciIsImRlbGF5IiwibXMiLCJzZXRUaW1lb3V0Iiwibm9ybWFsaXplUmVxdWVzdE1ldGhvZCIsInRvVXBwZXJDYXNlIiwiZGVmYXVsdFJldHJ5T3B0aW9ucyIsImxpbWl0IiwibWV0aG9kcyIsInN0YXR1c0NvZGVzIiwiYWZ0ZXJTdGF0dXNDb2RlcyIsIm5vcm1hbGl6ZVJldHJ5T3B0aW9ucyIsInJldHJ5IiwibWF4U2FmZVRpbWVvdXQiLCJLeSIsIl9yZXRyeUNvdW50IiwiX2lucHV0IiwiX29wdGlvbnMiLCJjcmVkZW50aWFscyIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsImJlZm9yZVJldHJ5IiwiYWZ0ZXJSZXNwb25zZSIsInByZWZpeFVybCIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsImFib3J0Q29udHJvbGxlciIsIlVSTFNlYXJjaFBhcmFtcyIsImZuIiwiUmFuZ2VFcnJvciIsIl9mZXRjaCIsImhvb2siLCJtb2RpZmllZFJlc3BvbnNlIiwiX2RlY29yYXRlUmVzcG9uc2UiLCJjbG9uZSIsIm9uRG93bmxvYWRQcm9ncmVzcyIsIl9zdHJlYW0iLCJfcmV0cnkiLCJtaW1lVHlwZSIsInBhcnNlSnNvbiIsIl9jYWxjdWxhdGVSZXRyeURlbGF5IiwicmV0cnlBZnRlciIsImFmdGVyIiwiTnVtYmVyIiwiaXNOYU4iLCJtYXhSZXRyeUFmdGVyIiwicmV0cnlDb3VudCIsInRpbWVvdXRJRCIsImNhdGNoIiwiY2xlYXJUaW1lb3V0IiwidG90YWxCeXRlcyIsInRyYW5zZmVycmVkQnl0ZXMiLCJyZWFkZXIiLCJnZXRSZWFkZXIiLCJwZXJjZW50IiwiZG9uZSIsImNsb3NlIiwiZW5xdWV1ZSIsInZhbGlkYXRlQW5kTWVyZ2UiLCJjcmVhdGVJbnN0YW5jZSIsImRlZmF1bHRzIiwia3kiLCJuZXdEZWZhdWx0cyIsImV4dGVuZCIsIm5vcm1hbGl6ZSIsInN0ckFycmF5IiwicmVzdWx0QXJyYXkiLCJtYXRjaCIsImZpcnN0Iiwic2hpZnQiLCJjb21wb25lbnQiLCJzdHIiLCJqb2luIiwiZGVmaW5pdGlvbiIsInJlcXVpcmUiLCJodHRwIiwiaHR0cHMiLCJ6bGliIiwiU3RyZWFtIiwiZGF0YVVyaVRvQnVmZmVyIiwidXRpbCIsImNyeXB0byIsIkZldGNoQmFzZUVycm9yIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJGZXRjaEVycm9yIiwic3lzdGVtRXJyb3IiLCJlcnJubyIsImVycm9yZWRTeXNDYWxsIiwic3lzY2FsbCIsIk5BTUUiLCJpc1VSTFNlYXJjaFBhcmFtZXRlcnMiLCJnZXRBbGwiLCJzb3J0IiwiaXNCbG9iIiwiaXNGb3JtRGF0YSIsImNhcnJpYWdlIiwiZGFzaGVzIiwicmVwZWF0IiwiY2FycmlhZ2VMZW5ndGgiLCJnZXRGb290ZXIiLCJib3VuZGFyeSIsImdldEhlYWRlciIsImZpZWxkIiwiaGVhZGVyIiwiSU5URVJOQUxTIiwiQm9keSIsImlzQW55QXJyYXlCdWZmZXIiLCJyYW5kb21CeXRlcyIsImZvcm0iLCJmb3JtRGF0YUl0ZXJhdG9yIiwiZGlzdHVyYmVkIiwiYm9keVVzZWQiLCJjb25zdW1lQm9keSIsImN0IiwiYnVmIiwiYWxsb2MiLCJhY2N1bSIsImFjY3VtQnl0ZXMiLCJkZXN0cm95IiwicmVhZGFibGVFbmRlZCIsIl9yZWFkYWJsZVN0YXRlIiwiZW5kZWQiLCJldmVyeSIsImluc3RhbmNlIiwicDEiLCJwMiIsImdldEJvdW5kYXJ5IiwiUGFzc1Rocm91Z2giLCJleHRyYWN0Q29udGVudFR5cGUiLCJnZXRUb3RhbEJ5dGVzIiwiZ2V0TGVuZ3RoU3luYyIsImhhc0tub3duTGVuZ3RoIiwiZ2V0Rm9ybURhdGFMZW5ndGgiLCJ2YWxpZGF0ZUhlYWRlck5hbWUiLCJ2YWxpZGF0ZUhlYWRlclZhbHVlIiwiaW5pdCIsInJhdyIsImlzQm94ZWRQcmltaXRpdmUiLCJpdGVyYXRvciIsIlByb3h5IiwicCIsInJlY2VpdmVyIiwiU2V0IiwiUmVmbGVjdCIsImNhbGxiYWNrIiwiZm9yIiwicmVkaXJlY3RTdGF0dXMiLCJpc1JlZGlyZWN0IiwiSU5URVJOQUxTJDEiLCJjb3VudGVyIiwicmVkaXJlY3RlZCIsImxvY2F0aW9uIiwiSU5URVJOQUxTJDIiLCJpc1JlcXVlc3QiLCJwYXJzZWRVUkwiLCJpbnB1dEJvZHkiLCJyZWRpcmVjdCIsImZvbGxvdyIsImNvbXByZXNzIiwiYWdlbnQiLCJpbnNlY3VyZUhUVFBQYXJzZXIiLCJmb3JtYXQiLCJBYm9ydEVycm9yIiwic3VwcG9ydGVkU2NoZW1hcyIsIm9wdGlvbnNfIiwiY29udGVudExlbmd0aFZhbHVlIiwic2VhcmNoIiwibGFzdE9mZnNldCIsImhyZWYiLCJoYXNoIiwiZ2V0U2VhcmNoIiwicGF0aCIsInBhdGhuYW1lIiwiaG9zdG5hbWUiLCJwcm90b2NvbCIsInBvcnQiLCJnZXROb2RlUmVxdWVzdE9wdGlvbnMiLCJzZW5kIiwiZW1pdCIsImFib3J0QW5kRmluYWxpemUiLCJmaW5hbGl6ZSIsInJlcXVlc3RfIiwicmVzcG9uc2VfIiwiaW5kZXgiLCJhcnJheSIsImZyb21SYXdIZWFkZXJzIiwicmF3SGVhZGVycyIsInN0YXR1c0NvZGUiLCJsb2NhdGlvblVSTCIsInJlcXVlc3RPcHRpb25zIiwicGlwZWxpbmUiLCJwcm9jZXNzIiwicmVzcG9uc2VPcHRpb25zIiwic3RhdHVzTWVzc2FnZSIsImNvZGluZ3MiLCJ6bGliT3B0aW9ucyIsImZsdXNoIiwiWl9TWU5DX0ZMVVNIIiwiZmluaXNoRmx1c2giLCJjcmVhdGVHdW56aXAiLCJjcmVhdGVCcm90bGlEZWNvbXByZXNzIiwiY3JlYXRlSW5mbGF0ZSIsImNyZWF0ZUluZmxhdGVSYXciLCJkZXN0Iiwid3JpdGUiLCJ3cml0ZVRvU3RyZWFtIiwiU3ltYm9sUG9seWZpbGwiLCJub29wIiwidHlwZUlzT2JqZWN0IiwicmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uIiwib3JpZ2luYWxQcm9taXNlIiwib3JpZ2luYWxQcm9taXNlVGhlbiIsIm9yaWdpbmFsUHJvbWlzZVJlc29sdmUiLCJvcmlnaW5hbFByb21pc2VSZWplY3QiLCJuZXdQcm9taXNlIiwiZXhlY3V0b3IiLCJwcm9taXNlUmVzb2x2ZWRXaXRoIiwicHJvbWlzZVJlamVjdGVkV2l0aCIsIlBlcmZvcm1Qcm9taXNlVGhlbiIsInByb21pc2UiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJ1cG9uUHJvbWlzZSIsInVwb25GdWxmaWxsbWVudCIsInVwb25SZWplY3Rpb24iLCJ0cmFuc2Zvcm1Qcm9taXNlV2l0aCIsImZ1bGZpbGxtZW50SGFuZGxlciIsInJlamVjdGlvbkhhbmRsZXIiLCJzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlIiwicXVldWVNaWNyb3Rhc2siLCJnbG9iYWxRdWV1ZU1pY3JvdGFzayIsInJlc29sdmVkUHJvbWlzZSIsInJlZmxlY3RDYWxsIiwiRiIsIlYiLCJhcmdzIiwiRnVuY3Rpb24iLCJwcm9taXNlQ2FsbCIsIlNpbXBsZVF1ZXVlIiwiX2N1cnNvciIsIl9zaXplIiwiX2Zyb250IiwiX2VsZW1lbnRzIiwiX25leHQiLCJfYmFjayIsIm9sZEJhY2siLCJuZXdCYWNrIiwiUVVFVUVfTUFYX0FSUkFZX1NJWkUiLCJvbGRGcm9udCIsIm5ld0Zyb250Iiwib2xkQ3Vyc29yIiwibmV3Q3Vyc29yIiwiZWxlbWVudHMiLCJwZWVrIiwiZnJvbnQiLCJjdXJzb3IiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNJbml0aWFsaXplIiwiX293bmVyUmVhZGFibGVTdHJlYW0iLCJfcmVhZGVyIiwiX3N0YXRlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJfc3RvcmVkRXJyb3IiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwiLCJSZWFkYWJsZVN0cmVhbUNhbmNlbCIsIlJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwicmVhZGVyTG9ja0V4Y2VwdGlvbiIsIl9jbG9zZWRQcm9taXNlIiwiX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSIsIl9jbG9zZWRQcm9taXNlX3JlamVjdCIsIkFib3J0U3RlcHMiLCJFcnJvclN0ZXBzIiwiQ2FuY2VsU3RlcHMiLCJQdWxsU3RlcHMiLCJOdW1iZXJJc0Zpbml0ZSIsImlzRmluaXRlIiwiTWF0aFRydW5jIiwidHJ1bmMiLCJ2IiwiY2VpbCIsImZsb29yIiwiYXNzZXJ0RGljdGlvbmFyeSIsImNvbnRleHQiLCJhc3NlcnRGdW5jdGlvbiIsImFzc2VydE9iamVjdCIsImFzc2VydFJlcXVpcmVkQXJndW1lbnQiLCJhc3NlcnRSZXF1aXJlZEZpZWxkIiwiY29udmVydFVucmVzdHJpY3RlZERvdWJsZSIsImNlbnNvck5lZ2F0aXZlWmVybyIsImNvbnZlcnRVbnNpZ25lZExvbmdMb25nV2l0aEVuZm9yY2VSYW5nZSIsInVwcGVyQm91bmQiLCJNQVhfU0FGRV9JTlRFR0VSIiwiaW50ZWdlclBhcnQiLCJhc3NlcnRSZWFkYWJsZVN0cmVhbSIsIklzUmVhZGFibGVTdHJlYW0iLCJBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIiwiUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdCIsInJlYWRSZXF1ZXN0IiwiX3JlYWRSZXF1ZXN0cyIsIlJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0IiwiX2Nsb3NlU3RlcHMiLCJfY2h1bmtTdGVwcyIsIlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzIiwiUmVhZGFibGVTdHJlYW1IYXNEZWZhdWx0UmVhZGVyIiwiSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIiLCJJc1JlYWRhYmxlU3RyZWFtTG9ja2VkIiwiY2xvc2VkIiwiZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJjYW5jZWwiLCJyZXNvbHZlUHJvbWlzZSIsInJlamVjdFByb21pc2UiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkIiwiX2Vycm9yU3RlcHMiLCJlIiwicmVsZWFzZUxvY2siLCJoYXNPd25Qcm9wZXJ0eSIsIl9kaXN0dXJiZWQiLCJfcmVhZGFibGVTdHJlYW1Db250cm9sbGVyIiwiQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGwiLCJwcmV2ZW50Q2FuY2VsIiwiX29uZ29pbmdQcm9taXNlIiwiX2lzRmluaXNoZWQiLCJfcHJldmVudENhbmNlbCIsIm5leHRTdGVwcyIsIl9uZXh0U3RlcHMiLCJyZXR1cm4iLCJyZXR1cm5TdGVwcyIsIl9yZXR1cm5TdGVwcyIsIlJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsIklzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yIiwiX2FzeW5jSXRlcmF0b3JJbXBsIiwic3RyZWFtQXN5bmNJdGVyYXRvckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJOdW1iZXJJc05hTiIsIkNyZWF0ZUFycmF5RnJvbUxpc3QiLCJDb3B5RGF0YUJsb2NrQnl0ZXMiLCJkZXN0T2Zmc2V0Iiwic3JjIiwic3JjT2Zmc2V0IiwibiIsIkFycmF5QnVmZmVyU2xpY2UiLCJiZWdpbiIsIkNsb25lQXNVaW50OEFycmF5IiwiTyIsIkRlcXVldWVWYWx1ZSIsImNvbnRhaW5lciIsIl9xdWV1ZSIsIl9xdWV1ZVRvdGFsU2l6ZSIsIkVucXVldWVWYWx1ZVdpdGhTaXplIiwiSW5maW5pdHkiLCJSZXNldFF1ZXVlIiwiUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCIsInZpZXciLCJJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24iLCJfdmlldyIsInJlc3BvbmQiLCJieXRlc1dyaXR0ZW4iLCJfYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZCIsInJlc3BvbmRXaXRoTmV3VmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiYnlvYlJlcXVlc3QiLCJJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0QllPQlJlcXVlc3QiLCJkZXNpcmVkU2l6ZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsIl9jbG9zZVJlcXVlc3RlZCIsIl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJQZW5kaW5nUHVsbEludG9zIiwiX2NhbmNlbEFsZ29yaXRobSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMiLCJlbnRyeSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJIYW5kbGVRdWV1ZURyYWluIiwiYXV0b0FsbG9jYXRlQ2h1bmtTaXplIiwiX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZSIsImJ1ZmZlckUiLCJwdWxsSW50b0Rlc2NyaXB0b3IiLCJidWZmZXJCeXRlTGVuZ3RoIiwiYnl0ZXNGaWxsZWQiLCJlbGVtZW50U2l6ZSIsInZpZXdDb25zdHJ1Y3RvciIsInJlYWRlclR5cGUiLCJfcGVuZGluZ1B1bGxJbnRvcyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkIiwic2hvdWxkUHVsbCIsIl9zdGFydGVkIiwiUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsIiwiX3B1bGxpbmciLCJfcHVsbEFnYWluIiwiX3B1bGxBbGdvcml0aG0iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvciIsImZpbGxlZFZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvciIsInJlYWRJbnRvUmVxdWVzdCIsIl9yZWFkSW50b1JlcXVlc3RzIiwiUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZEludG9SZXF1ZXN0IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbFB1bGxJbnRvRGVzY3JpcHRvckZyb21RdWV1ZSIsImN1cnJlbnRBbGlnbmVkQnl0ZXMiLCJtYXhCeXRlc1RvQ29weSIsIm1heEJ5dGVzRmlsbGVkIiwibWF4QWxpZ25lZEJ5dGVzIiwidG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyIsInJlYWR5IiwicXVldWUiLCJoZWFkT2ZRdWV1ZSIsImJ5dGVzVG9Db3B5IiwiZGVzdFN0YXJ0IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yIiwiUmVhZGFibGVTdHJlYW1DbG9zZSIsIl9ieW9iUmVxdWVzdCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEludGVybmFsIiwiZmlyc3REZXNjcmlwdG9yIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlIiwicmVtYWluZGVyU2l6ZSIsInJlbWFpbmRlciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5SZWFkYWJsZVN0YXRlIiwidHJhbnNmZXJyZWRCdWZmZXIiLCJmaXJzdFBlbmRpbmdQdWxsSW50byIsIlJlYWRhYmxlU3RyZWFtRXJyb3IiLCJTZXRVcFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJfc3RyYXRlZ3lIV00iLCJ2aWV3Qnl0ZUxlbmd0aCIsIlNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsInN0YXJ0QWxnb3JpdGhtIiwicHVsbEFsZ29yaXRobSIsImNhbmNlbEFsZ29yaXRobSIsInIiLCJBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIiwiUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3QiLCJJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlciIsImJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyUmVhZCIsIkRhdGFWaWV3IiwiQllURVNfUEVSX0VMRU1FTlQiLCJjdG9yIiwiZW1wdHlWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclB1bGxJbnRvIiwiRXh0cmFjdEhpZ2hXYXRlck1hcmsiLCJzdHJhdGVneSIsImRlZmF1bHRIV00iLCJFeHRyYWN0U2l6ZUFsZ29yaXRobSIsImNvbnZlcnRRdWV1aW5nU3RyYXRlZ3kiLCJjb252ZXJ0UXVldWluZ1N0cmF0ZWd5U2l6ZSIsImNvbnZlcnRVbmRlcmx5aW5nU2lua0Fib3J0Q2FsbGJhY2siLCJvcmlnaW5hbCIsImNvbnZlcnRVbmRlcmx5aW5nU2lua0Nsb3NlQ2FsbGJhY2siLCJjb252ZXJ0VW5kZXJseWluZ1NpbmtTdGFydENhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTaW5rV3JpdGVDYWxsYmFjayIsImFzc2VydFdyaXRhYmxlU3RyZWFtIiwiSXNXcml0YWJsZVN0cmVhbSIsIldyaXRhYmxlU3RyZWFtIiwicmF3VW5kZXJseWluZ1NpbmsiLCJyYXdTdHJhdGVneSIsInVuZGVybHlpbmdTaW5rIiwiY29udmVydFVuZGVybHlpbmdTaW5rIiwiSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtIiwic2l6ZUFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJ3cml0ZUFsZ29yaXRobSIsImNsb3NlQWxnb3JpdGhtIiwiYWJvcnRBbGdvcml0aG0iLCJTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NpbmsiLCJsb2NrZWQiLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDIiLCJJc1dyaXRhYmxlU3RyZWFtTG9ja2VkIiwiV3JpdGFibGVTdHJlYW1BYm9ydCIsIldyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0IiwiV3JpdGFibGVTdHJlYW1DbG9zZSIsImdldFdyaXRlciIsIkFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJfd3JpdGVyIiwiX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciIsIl93cml0ZVJlcXVlc3RzIiwiX2luRmxpZ2h0V3JpdGVSZXF1ZXN0IiwiX2Nsb3NlUmVxdWVzdCIsIl9pbkZsaWdodENsb3NlUmVxdWVzdCIsIl9wZW5kaW5nQWJvcnRSZXF1ZXN0IiwiX2JhY2twcmVzc3VyZSIsIl9hYm9ydFJlYXNvbiIsIl9hYm9ydENvbnRyb2xsZXIiLCJfcHJvbWlzZSIsIndhc0FscmVhZHlFcnJvcmluZyIsIl9yZXNvbHZlIiwiX3JlamVjdCIsIl9yZWFzb24iLCJfd2FzQWxyZWFkeUVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nIiwiY2xvc2VSZXF1ZXN0Iiwid3JpdGVyIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUiLCJjbG9zZVNlbnRpbmVsIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkIiwiV3JpdGFibGVTdHJlYW1EZWFsV2l0aFJlamVjdGlvbiIsIldyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3JpbmciLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCIsIldyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQiLCJzdG9yZWRFcnJvciIsIndyaXRlUmVxdWVzdCIsIldyaXRhYmxlU3RyZWFtUmVqZWN0Q2xvc2VBbmRDbG9zZWRQcm9taXNlSWZOZWVkZWQiLCJhYm9ydFJlcXVlc3QiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCIsIldyaXRhYmxlU3RyZWFtVXBkYXRlQmFja3ByZXNzdXJlIiwiYmFja3ByZXNzdXJlIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXQiLCJfb3duZXJXcml0YWJsZVN0cmVhbSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciIsImRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJHZXREZXNpcmVkU2l6ZSIsIl9yZWFkeVByb21pc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyUmVsZWFzZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcldyaXRlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkIiwiX2Nsb3NlZFByb21pc2VTdGF0ZSIsImRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwiX3JlYWR5UHJvbWlzZVN0YXRlIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQiLCJyZWxlYXNlZEVycm9yIiwiY2h1bmtTaXplIiwiX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSIsImNodW5rU2l6ZUUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3JJZk5lZWRlZCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRDaHVua1NpemUiLCJXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdCIsImVucXVldWVFIiwiX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyV3JpdGUiLCJhYm9ydFJlYXNvbiIsIklzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQyIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yIiwiX2Fib3J0QWxnb3JpdGhtIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsImNyZWF0ZUFib3J0Q29udHJvbGxlciIsIl93cml0ZUFsZ29yaXRobSIsIl9jbG9zZUFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtTWFya0Nsb3NlUmVxdWVzdEluRmxpZ2h0Iiwic2lua0Nsb3NlUHJvbWlzZSIsIldyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZSIsIldyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZVdpdGhFcnJvciIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzQ2xvc2UiLCJXcml0YWJsZVN0cmVhbU1hcmtGaXJzdFdyaXRlUmVxdWVzdEluRmxpZ2h0IiwiV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlIiwiV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlV2l0aEVycm9yIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NXcml0ZSIsIl9yZWFkeVByb21pc2VfcmVzb2x2ZSIsIl9yZWFkeVByb21pc2VfcmVqZWN0IiwiTmF0aXZlRE9NRXhjZXB0aW9uIiwiRE9NRXhjZXB0aW9uIiwiRE9NRXhjZXB0aW9uJDEiLCJpc0RPTUV4Y2VwdGlvbkNvbnN0cnVjdG9yIiwiY3JlYXRlRE9NRXhjZXB0aW9uUG9seWZpbGwiLCJSZWFkYWJsZVN0cmVhbVBpcGVUbyIsInByZXZlbnRDbG9zZSIsInByZXZlbnRBYm9ydCIsInNodXR0aW5nRG93biIsImN1cnJlbnRXcml0ZSIsImFjdGlvbnMiLCJzaHV0ZG93bldpdGhBY3Rpb24iLCJhbGwiLCJhY3Rpb24iLCJpc09yQmVjb21lc0Vycm9yZWQiLCJzaHV0ZG93biIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24iLCJkZXN0Q2xvc2VkIiwid2FpdEZvcldyaXRlc1RvRmluaXNoIiwib2xkQ3VycmVudFdyaXRlIiwib3JpZ2luYWxJc0Vycm9yIiwib3JpZ2luYWxFcnJvciIsImRvVGhlUmVzdCIsIm5ld0Vycm9yIiwiaXNFcnJvciIsInJlc29sdmVMb29wIiwicmVqZWN0TG9vcCIsInJlc29sdmVSZWFkIiwicmVqZWN0UmVhZCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFbnF1ZXVlIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW0iLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCIsIlNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsIlJlYWRhYmxlU3RyZWFtVGVlIiwiY2xvbmVGb3JCcmFuY2gyIiwicmVhc29uMSIsInJlYXNvbjIiLCJicmFuY2gxIiwiYnJhbmNoMiIsInJlc29sdmVDYW5jZWxQcm9taXNlIiwicmVhZGluZyIsInJlYWRBZ2FpbkZvckJyYW5jaDEiLCJyZWFkQWdhaW5Gb3JCcmFuY2gyIiwiY2FuY2VsZWQxIiwiY2FuY2VsZWQyIiwiY2FuY2VsUHJvbWlzZSIsImZvcndhcmRSZWFkZXJFcnJvciIsInRoaXNSZWFkZXIiLCJwdWxsV2l0aERlZmF1bHRSZWFkZXIiLCJjaHVuazEiLCJjaHVuazIiLCJjbG9uZUUiLCJwdWxsMUFsZ29yaXRobSIsInB1bGwyQWxnb3JpdGhtIiwicHVsbFdpdGhCWU9CUmVhZGVyIiwiZm9yQnJhbmNoMiIsImJ5b2JCcmFuY2giLCJvdGhlckJyYW5jaCIsImJ5b2JDYW5jZWxlZCIsImNsb25lZENodW5rIiwib3RoZXJDYW5jZWxlZCIsImNhbmNlbDFBbGdvcml0aG0iLCJjb21wb3NpdGVSZWFzb24iLCJjYW5jZWxSZXN1bHQiLCJjYW5jZWwyQWxnb3JpdGhtIiwiQ3JlYXRlUmVhZGFibGVCeXRlU3RyZWFtIiwiUmVhZGFibGVCeXRlU3RyZWFtVGVlIiwicmVhZEFnYWluIiwiQ3JlYXRlUmVhZGFibGVTdHJlYW0iLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRUZWUiLCJjb252ZXJ0VW5kZXJseWluZ1NvdXJjZUNhbmNlbENhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTb3VyY2VQdWxsQ2FsbGJhY2siLCJjb252ZXJ0VW5kZXJseWluZ1NvdXJjZVN0YXJ0Q2FsbGJhY2siLCJjb252ZXJ0UmVhZGFibGVTdHJlYW1UeXBlIiwiY29udmVydFJlYWRhYmxlU3RyZWFtUmVhZGVyTW9kZSIsIm1vZGUiLCJjb252ZXJ0UGlwZU9wdGlvbnMiLCJpc0Fib3J0U2lnbmFsIiwiYXNzZXJ0QWJvcnRTaWduYWwiLCJyYXdVbmRlcmx5aW5nU291cmNlIiwidW5kZXJseWluZ1NvdXJjZSIsInB1bGwiLCJjb252ZXJ0VW5kZXJseWluZ0RlZmF1bHRPckJ5dGVTb3VyY2UiLCJJbml0aWFsaXplUmVhZGFibGVTdHJlYW0iLCJ1bmRlcmx5aW5nQnl0ZVNvdXJjZSIsIlNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlIiwiU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2UiLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEiLCJyYXdPcHRpb25zIiwiY29udmVydFJlYWRlck9wdGlvbnMiLCJwaXBlVGhyb3VnaCIsInJhd1RyYW5zZm9ybSIsInRyYW5zZm9ybSIsInJlYWRhYmxlIiwiY29udmVydFJlYWRhYmxlV3JpdGFibGVQYWlyIiwicGlwZVRvIiwiZGVzdGluYXRpb24iLCJ0ZWUiLCJpbXBsIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciIsImNvbnZlcnRJdGVyYXRvck9wdGlvbnMiLCJjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdCIsImFzeW5jSXRlcmF0b3IiLCJieXRlTGVuZ3RoU2l6ZUZ1bmN0aW9uIiwiQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSIsIl9ieXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyayIsIklzQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneSIsImJ5dGVMZW5ndGhCcmFuZENoZWNrRXhjZXB0aW9uIiwiY291bnRTaXplRnVuY3Rpb24iLCJDb3VudFF1ZXVpbmdTdHJhdGVneSIsIl9jb3VudFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsiLCJJc0NvdW50UXVldWluZ1N0cmF0ZWd5IiwiY291bnRCcmFuZENoZWNrRXhjZXB0aW9uIiwiY29udmVydFRyYW5zZm9ybWVyRmx1c2hDYWxsYmFjayIsImNvbnZlcnRUcmFuc2Zvcm1lclN0YXJ0Q2FsbGJhY2siLCJjb252ZXJ0VHJhbnNmb3JtZXJUcmFuc2Zvcm1DYWxsYmFjayIsIlRyYW5zZm9ybVN0cmVhbSIsInJhd1RyYW5zZm9ybWVyIiwicmF3V3JpdGFibGVTdHJhdGVneSIsInJhd1JlYWRhYmxlU3RyYXRlZ3kiLCJ3cml0YWJsZVN0cmF0ZWd5IiwicmVhZGFibGVTdHJhdGVneSIsInRyYW5zZm9ybWVyIiwicmVhZGFibGVUeXBlIiwid3JpdGFibGVUeXBlIiwiY29udmVydFRyYW5zZm9ybWVyIiwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIiwicmVhZGFibGVTaXplQWxnb3JpdGhtIiwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIiwid3JpdGFibGVTaXplQWxnb3JpdGhtIiwic3RhcnRQcm9taXNlX3Jlc29sdmUiLCJzdGFydFByb21pc2UiLCJfdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlciIsIl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlIiwiX3dyaXRhYmxlIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbUVycm9yIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobSIsIl9yZWFkYWJsZSIsImZsdXNoUHJvbWlzZSIsIl9mbHVzaEFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2VQdWxsQWxnb3JpdGhtIiwiVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZSIsIkNyZWF0ZVdyaXRhYmxlU3RyZWFtIiwiX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSIsIkluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsInRyYW5zZm9ybUFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSIsInRyYW5zZm9ybVJlc3VsdEUiLCJmbHVzaEFsZ29yaXRobSIsIl9jb250cm9sbGVkVHJhbnNmb3JtU3RyZWFtIiwiX3RyYW5zZm9ybUFsZ29yaXRobSIsIlNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVRyYW5zZm9ybWVyIiwiSXNUcmFuc2Zvcm1TdHJlYW0iLCJzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uIiwiSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlciIsImRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsInRlcm1pbmF0ZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyVGVybWluYXRlIiwicmVhZGFibGVDb250cm9sbGVyIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckhhc0JhY2twcmVzc3VyZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsImxvYWRlZCIsIl9fd2VicGFja19tb2R1bGVzX18iLCJvIiwicHJvcCIsIm5tZCIsInBhdGhzIiwiY2hpbGRyZW4iLCJfX3dlYnBhY2tfZXhwb3J0c19fIl0sInNvdXJjZVJvb3QiOiIifQ==
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mailgun=t():e.mailgun=t()}(this,(function(){return(()=>{var e={271:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(185);class AbortSignal extends n.EventTarget{constructor(){throw super(),new TypeError("AbortSignal cannot be constructed directly")}get aborted(){const e=o.get(this);if("boolean"!=typeof e)throw new TypeError("Expected 'this' to be an 'AbortSignal' object, but got "+(null===this?"null":typeof this));return e}}n.defineEventAttribute(AbortSignal.prototype,"abort");const o=new WeakMap;Object.defineProperties(AbortSignal.prototype,{aborted:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortSignal.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class AbortController{constructor(){s.set(this,function(){const e=Object.create(AbortSignal.prototype);return n.EventTarget.call(e),o.set(e,!1),e}())}get signal(){return i(this)}abort(){var e;e=i(this),!1===o.get(e)&&(o.set(e,!0),e.dispatchEvent({type:"abort"}))}}const s=new WeakMap;function i(e){const t=s.get(e);if(null==t)throw new TypeError("Expected 'this' to be an 'AbortController' object, but got "+(null===e?"null":typeof e));return t}Object.defineProperties(AbortController.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),"function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag&&Object.defineProperty(AbortController.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"}),t.AbortController=AbortController,t.AbortSignal=AbortSignal,t.default=AbortController,e.exports=AbortController,e.exports.AbortController=e.exports.default=AbortController,e.exports.AbortSignal=AbortSignal},475:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(438)),i=o(r(373)),a=o(r(22)),u=o(r(747)),l=o(r(778)),c=o(r(750)),d=o(r(197)),f=o(r(277)),p=o(r(839)),h=o(r(345)),b=o(r(602)),y=o(r(126)),m=o(r(135)),g=o(r(60)),_=o(r(587)),v=o(r(955)),w=o(r(75)),S=function(e,t){var r=n({},e);if(r.url||(r.url="https://api.mailgun.net"),!r.username)throw new Error('Parameter "username" is required');if(!r.key)throw new Error('Parameter "key" is required');this.request=new s.default(r,t);var o=new m.default(this.request),S=new g.default(this.request),R=new v.default(this.request),T=new w.default(this.request),q=new _.default(this.request);this.domains=new i.default(this.request,S,R,T),this.webhooks=new c.default(this.request),this.events=new a.default(this.request),this.stats=new u.default(this.request),this.suppressions=new l.default(this.request),this.messages=new d.default(this.request),this.routes=new f.default(this.request),this.ips=new h.default(this.request),this.ip_pools=new b.default(this.request),this.lists=new y.default(this.request,o),this.validate=new p.default(this.request,q)};t.default=S},373:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Domain=void 0;var s=o(r(78)),i=o(r(142)),a=function(e,t,r){this.name=e.name,this.require_tls=e.require_tls,this.skip_verification=e.skip_verification,this.state=e.state,this.wildcard=e.wildcard,this.spam_action=e.spam_action,this.created_at=e.created_at,this.smtp_password=e.smtp_password,this.smtp_login=e.smtp_login,this.type=e.type,this.receiving_dns_records=t||null,this.sending_dns_records=r||null};t.Domain=a;var u=function(){function e(e,t,r,n){this.request=e,this.domainCredentials=t,this.domainTemplates=r,this.domainTags=n}return e.prototype._parseMessage=function(e){return e.body},e.prototype._parseDomainList=function(e){return e.body.items.map((function(e){return new a(e)}))},e.prototype._parseDomain=function(e){return new a(e.body.domain,e.body.receiving_dns_records,e.body.sending_dns_records)},e.prototype._parseTrackingSettings=function(e){return e.body.tracking},e.prototype._parseTrackingUpdate=function(e){return e.body},e.prototype.list=function(e){var t=this;return this.request.get("/v3/domains",e).then((function(e){return t._parseDomainList(e)}))},e.prototype.get=function(e){var t=this;return this.request.get("/v3/domains/".concat(e)).then((function(e){return t._parseDomain(e)}))},e.prototype.create=function(e){var t=this,r=n({},e);return"force_dkim_authority"in r&&"boolean"==typeof r.force_dkim_authority&&(r.force_dkim_authority="true"===r.toString()?"true":"false"),this.request.postWithFD("/v3/domains",r).then((function(e){return t._parseDomain(e)}))},e.prototype.verify=function(e){var t=this;return this.request.put("/v3/domains/".concat(e,"/verify")).then((function(e){return t._parseDomain(e)}))},e.prototype.destroy=function(e){var t=this;return this.request.delete("/v3/domains/".concat(e)).then((function(e){return t._parseMessage(e)}))},e.prototype.getConnection=function(e){return this.request.get("/v3/domains/".concat(e,"/connection")).then((function(e){return e})).then((function(e){return e.body.connection}))},e.prototype.updateConnection=function(e,t){return this.request.put("/v3/domains/".concat(e,"/connection"),t).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.getTracking=function(e){return this.request.get((0,s.default)("/v3/domains",e,"tracking")).then(this._parseTrackingSettings)},e.prototype.updateTracking=function(e,t,r){var n=this;if("boolean"==typeof(null==r?void 0:r.active))throw new i.default({status:400,statusText:"Received boolean value for active property",body:{message:'Property "active" must contain string value.'}});return this.request.putWithFD((0,s.default)("/v3/domains",e,"tracking",t),r).then((function(e){return n._parseTrackingUpdate(e)}))},e.prototype.getIps=function(e){return this.request.get((0,s.default)("/v3/domains",e,"ips")).then((function(e){var t;return null===(t=null==e?void 0:e.body)||void 0===t?void 0:t.items}))},e.prototype.assignIp=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{ip:t})},e.prototype.deleteIp=function(e,t){return this.request.delete((0,s.default)("/v3/domains",e,"ips",t))},e.prototype.linkIpPool=function(e,t){return this.request.postWithFD((0,s.default)("/v3/domains",e,"ips"),{pool_id:t})},e.prototype.unlinkIpPoll=function(e,t){var r="";if(t.pool_id&&t.ip)throw new i.default({status:400,statusText:"Too much data for replacement",body:{message:"Please specify either pool_id or ip (not both)"}});return t.pool_id?r="?pool_id=".concat(t.pool_id):t.ip&&(r="?ip=".concat(t.ip)),this.request.delete((0,s.default)("/v3/domains",e,"ips","ip_pool",r))},e.prototype.updateDKIMAuthority=function(e,t){return this.request.put("/v3/domains/".concat(e,"/dkim_authority"),{},{query:"self=".concat(t.self)}).then((function(e){return e})).then((function(e){return e.body}))},e.prototype.updateDKIMSelector=function(e,t){return this.request.put("/v3/domains/".concat(e,"/dkim_selector"),{},{query:"dkim_selector=".concat(t.dkimSelector)}).then((function(e){return e}))},e.prototype.updateWebPrefix=function(e,t){return this.request.put("/v3/domains/".concat(e,"/web_prefix"),{},{query:"web_prefix=".concat(t.webPrefix)}).then((function(e){return e}))},e}();t.default=u},60:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(78)),s=function(){function e(e){this.request=e,this.baseRoute="/v3/domains/"}return e.prototype._parseDomainCredentialsList=function(e){return{items:e.body.items,totalCount:e.body.total_count}},e.prototype._parseMessageResponse=function(e){return{status:e.status,message:e.body.message}},e.prototype._parseDeletedResponse=function(e){return{status:e.status,message:e.body.message,spec:e.body.spec}},e.prototype.list=function(e,t){var r=this;return this.request.get((0,o.default)(this.baseRoute,e,"/credentials"),t).then((function(e){return r._parseDomainCredentialsList(e)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD("".concat(this.baseRoute).concat(e,"/credentials"),t).then((function(e){return r._parseMessageResponse(e)}))},e.prototype.update=function(e,t,r){var n=this;return this.request.putWithFD("".concat(this.baseRoute).concat(e,"/credentials/").concat(t),r).then((function(e){return n._parseMessageResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete("".concat(this.baseRoute).concat(e,"/credentials/").concat(t)).then((function(e){return r._parseDeletedResponse(e)}))},e}();t.default=s},75:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTagStatistic=t.DomainTag=void 0;var s=o(r(78)),i=function(e){this.tag=e.tag,this.description=e.description,this["first-seen"]=new Date(e["first-seen"]),this["last-seen"]=new Date(e["last-seen"])};t.DomainTag=i;var a=function(e){this.tag=e.body.tag,this.description=e.body.description,this.start=new Date(e.body.start),this.end=new Date(e.body.end),this.resolution=e.body.resolution,this.stats=e.body.stats.map((function(e){return n(n({},e),{time:new Date(e.time)})}))};t.DomainTagStatistic=a;var u=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype._parsePageLinks=function(e){return Object.entries(e.body.paging).reduce((function(e,t){var r=t[0],n=t[1];return e[r]={id:r,url:n},e}),{})},e.prototype._parseDomainTagsList=function(e){return{items:e.body.items.map((function(e){return new i(e)})),pages:this._parsePageLinks(e)}},e.prototype._parseTagStatistic=function(e){return new a(e)},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/tags"),t).then((function(e){return r._parseDomainTagsList(e)}))},e.prototype.get=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t)).then((function(e){return new i(e.body)}))},e.prototype.update=function(e,t,r){return this.request.put((0,s.default)(this.baseRoute,e,"/tags",t),r).then((function(e){return e.body}))},e.prototype.destroy=function(e,t){return this.request.delete("".concat(this.baseRoute).concat(e,"/tags/").concat(t)).then((function(e){return{message:e.body.message,status:e.status}}))},e.prototype.statistic=function(e,t,r){var n=this;return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats"),r).then((function(e){return n._parseTagStatistic(e)}))},e.prototype.countries=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/countries")).then((function(e){return e.body}))},e.prototype.providers=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/providers")).then((function(e){return e.body}))},e.prototype.devices=function(e,t){return this.request.get((0,s.default)(this.baseRoute,e,"/tags",t,"stats/aggregates/devices")).then((function(e){return e.body}))},e}();t.default=u},955:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomainTemplateItem=void 0;var s=o(r(78)),i=function(e){this.name=e.name,this.description=e.description,this.createdAt=e.createdAt?new Date(e.createdAt):"",this.createdBy=e.createdBy,this.id=e.id,e.version&&(this.version=e.version,e.version.createdAt&&(this.version.createdAt=new Date(e.version.createdAt))),e.versions&&e.versions.length&&(this.versions=e.versions.map((function(e){var t=n({},e);return t.createdAt=new Date(e.createdAt),t})))};t.DomainTemplateItem=i;var a=function(){function e(e){this.request=e,this.baseRoute="/v3/"}return e.prototype.parseCreationResponse=function(e){return new i(e.body.template)},e.prototype.parseCreationVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.template=new i(e.body.template)),t},e.prototype.parseMutationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body&&e.body.template&&(t.templateName=e.body.template.name),t},e.prototype.parseNotificationResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,t},e.prototype.parseMutateTemplateVersionResponse=function(e){var t={};return t.status=e.status,t.message=e.body.message,e.body.template&&(t.templateName=e.body.template.name,t.templateVersion={tag:e.body.template.version.tag}),t},e.prototype.parseList=function(e){var t={};return t.items=e.body.items.map((function(e){return new i(e)})),t.pages=e.body.paging,t},e.prototype.parseListTemplateVersions=function(e){var t={};return t.template=new i(e.body.template),t.pages=e.body.paging,t},e.prototype.list=function(e,t){var r=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseList(e)}))},e.prototype.get=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return new i(e.body.template)}))},e.prototype.create=function(e,t){var r=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates"),t).then((function(e){return r.parseCreationResponse(e)}))},e.prototype.update=function(e,t,r){var n=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t),r).then((function(e){return n.parseMutationResponse(e)}))},e.prototype.destroy=function(e,t){var r=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t)).then((function(e){return r.parseMutationResponse(e)}))},e.prototype.destroyAll=function(e){var t=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates")).then((function(e){return t.parseNotificationResponse(e)}))},e.prototype.createVersion=function(e,t,r){var n=this;return this.request.postWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions"),r).then((function(e){return n.parseCreationVersionResponse(e)}))},e.prototype.getVersion=function(e,t,r){return this.request.get((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return new i(e.body.template)}))},e.prototype.updateVersion=function(e,t,r,n){var o=this;return this.request.putWithFD((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r),n).then((function(e){return o.parseMutateTemplateVersionResponse(e)}))},e.prototype.destroyVersion=function(e,t,r){var n=this;return this.request.delete((0,s.default)(this.baseRoute,e,"/templates/",t,"/versions/",r)).then((function(e){return n.parseMutateTemplateVersionResponse(e)}))},e.prototype.listVersions=function(e,t,r){var n=this;return this.request.get((0,s.default)(this.baseRoute,e,"/templates",t,"/versions"),r).then((function(e){return n.parseListTemplateVersions(e)}))},e}();t.default=a},142:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=t.status,n=t.statusText,o=t.message,s=t.body,i=void 0===s?{}:s,a=this,u=i.message,l=i.error;return(a=e.call(this)||this).stack="",a.status=r,a.message=o||l||n,a.details=u,a}return n(t,e),t}(Error);t.default=o},22:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=o(r(78)),i=function(){function e(e){this.request=e}return e.prototype._parsePageNumber=function(e){return e.split("/").pop()||""},e.prototype._parsePage=function(e,t){return{id:e,number:this._parsePageNumber(t),url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var n=r[0],o=r[1];return e[n]=t._parsePage(n,o),e}),{})},e.prototype._parseEventList=function(e){return{items:e.body.items,pages:this._parsePageLinks(e)}},e.prototype.get=function(e,t){var r,o=this,i=n({},t);return i&&i.page?(r=(0,s.default)("/v3",e,"events",i.page),delete i.page):r=(0,s.default)("/v3",e,"events"),this.request.get(r,i).then((function(e){return o._parseEventList(e)}))},e}();t.default=i},150:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.FormDataConstructor=e}return e.prototype.createFormData=function(e){var t=this;if(!e)throw new Error("Please provide data object");return Object.keys(e).filter((function(t){return e[t]})).reduce((function(r,n){return["attachment","inline","file"].includes(n)?(t.addFilesToFD(n,e[n],r),r):"message"===n?(t.addMimeDataToFD(n,e[n],r),r):(t.addCommonPropertyToFD(n,e[n],r),r)}),new this.FormDataConstructor)},e.prototype.isNodeFormData=function(e){return void 0!==e.getHeaders},e.prototype.getAttachmentOptions=function(e){if("object"!=typeof e||this.isStream(e))return{};var t=e.filename,n=e.contentType,o=e.knownLength;return r(r(r({},t?{filename:t}:{filename:"file"}),n&&{contentType:n}),o&&{knownLength:o})},e.prototype.addMimeDataToFD=function(e,t,r){this.isNodeFormData(r)?Buffer.isBuffer(t)&&r.append(e,t,{filename:"MimeMessage"}):r.append(e,t,"MimeMessage")},e.prototype.addFilesToFD=function(e,t,r){var n=this,o=function(e,t,r){var o=n.isStream(t)?t:t.data,s=n.getAttachmentOptions(t);n.isNodeFormData(r)?r.append(e,o,s):r.append(e,o,s.filename)};Array.isArray(t)?t.forEach((function(t){o(e,t,r)})):o(e,t,r)},e.prototype.isStream=function(e){return"object"==typeof e&&"function"==typeof e.pipe},e.prototype.addCommonPropertyToFD=function(e,t,r){Array.isArray(t)?t.forEach((function(t){r.append(e,t)})):null!=t&&r.append(e,t)},e}();t.default=n},175:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(475)),s=function(){function e(e){this.formData=e}return Object.defineProperty(e,"default",{get:function(){return this},enumerable:!1,configurable:!0}),e.prototype.client=function(e){return new o.default(e,this.formData)},e}();t.default=s},990:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SuppressionModels=void 0,function(e){e.BOUNCES="bounces",e.COMPLAINTS="complaints",e.UNSUBSCRIBES="unsubscribes",e.WHITELISTS="whitelists"}(t.SuppressionModels||(t.SuppressionModels={}))},602:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)},n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,s){function i(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((n=n.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var r,n,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}};Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e){this.request=e}return e.prototype.list=function(){var e=this;return this.request.get("/v1/ip_pools").then((function(t){return e.parseIpPoolsResponse(t)}))},e.prototype.create=function(e){return n(this,void 0,void 0,(function(){var t;return o(this,(function(n){switch(n.label){case 0:return[4,this.request.postWithFD("/v1/ip_pools",e)];case 1:return t=n.sent(),[2,r({status:t.status},t.body)]}}))}))},e.prototype.update=function(e,t){return n(this,void 0,void 0,(function(){var n;return o(this,(function(o){switch(o.label){case 0:return[4,this.request.patchWithFD("/v1/ip_pools/".concat(e),t)];case 1:return n=o.sent(),[2,r({status:n.status},n.body)]}}))}))},e.prototype.delete=function(e,t){return n(this,void 0,void 0,(function(){var n;return o(this,(function(o){switch(o.label){case 0:return[4,this.request.delete("/v1/ip_pools/".concat(e),t)];case 1:return n=o.sent(),[2,r({status:n.status},n.body)]}}))}))},e.prototype.parseIpPoolsResponse=function(e){return r({status:e.status},e.body)},e}();t.default=s},345:function(e,t){"use strict";var r=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,s){function i(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((n=n.apply(e,t||[])).next())}))},n=this&&this.__generator||function(e,t){var r,n,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}};Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e){this.request=e}return e.prototype.list=function(e){return r(this,void 0,void 0,(function(){var t;return n(this,(function(r){switch(r.label){case 0:return[4,this.request.get("/v3/ips",e)];case 1:return t=r.sent(),[2,this.parseIpsResponse(t)]}}))}))},e.prototype.get=function(e){return r(this,void 0,void 0,(function(){var t;return n(this,(function(r){switch(r.label){case 0:return[4,this.request.get("/v3/ips/".concat(e))];case 1:return t=r.sent(),[2,this.parseIpsResponse(t)]}}))}))},e.prototype.parseIpsResponse=function(e){return e.body},e}();t.default=o},126:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){this.request=e,this.baseRoute="/v3/lists",this.members=t}return e.prototype.parseValidationResult=function(e,t){return{status:e,validationResult:r(r({},t),{created_at:new Date(1e3*t.created_at)})}},e.prototype.list=function(e){return this.request.get("".concat(this.baseRoute,"/pages"),e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get("".concat(this.baseRoute,"/").concat(e)).then((function(e){return e.body.list}))},e.prototype.create=function(e){return this.request.postWithFD(this.baseRoute,e).then((function(e){return e.body.list}))},e.prototype.update=function(e,t){return this.request.putWithFD("".concat(this.baseRoute,"/").concat(e),t).then((function(e){return e.body.list}))},e.prototype.destroy=function(e){return this.request.delete("".concat(this.baseRoute,"/").concat(e)).then((function(e){return e.body}))},e.prototype.validate=function(e){return this.request.post("".concat(this.baseRoute,"/").concat(e,"/validate"),{}).then((function(e){return r({status:e.status},e.body)}))},e.prototype.validationResult=function(e){var t=this;return this.request.get("".concat(this.baseRoute,"/").concat(e,"/validate")).then((function(e){return t.parseValidationResult(e.status,e.body)}))},e.prototype.cancelValidation=function(e){return this.request.delete("".concat(this.baseRoute,"/").concat(e,"/validate")).then((function(e){return{status:e.status,message:e.body.message}}))},e}();t.default=n},135:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.request=e,this.baseRoute="/v3/lists"}return e.prototype.checkAndUpdateData=function(e){var t=r({},e);return"object"==typeof e.vars&&(t.vars=JSON.stringify(t.vars)),"boolean"==typeof e.subscribed&&(t.subscribed=e.subscribed?"yes":"no"),t},e.prototype.listMembers=function(e,t){return this.request.get("".concat(this.baseRoute,"/").concat(e,"/members/pages"),t).then((function(e){return e.body.items}))},e.prototype.getMember=function(e,t){return this.request.get("".concat(this.baseRoute,"/").concat(e,"/members/").concat(t)).then((function(e){return e.body.member}))},e.prototype.createMember=function(e,t){var r=this.checkAndUpdateData(t);return this.request.postWithFD("".concat(this.baseRoute,"/").concat(e,"/members"),r).then((function(e){return e.body.member}))},e.prototype.createMembers=function(e,t){var r={members:Array.isArray(t.members)?JSON.stringify(t.members):t.members,upsert:t.upsert};return this.request.postWithFD("".concat(this.baseRoute,"/").concat(e,"/members.json"),r).then((function(e){return e.body}))},e.prototype.updateMember=function(e,t,r){var n=this.checkAndUpdateData(r);return this.request.putWithFD("".concat(this.baseRoute,"/").concat(e,"/members/").concat(t),n).then((function(e){return e.body.member}))},e.prototype.destroyMember=function(e,t){return this.request.delete("".concat(this.baseRoute,"/").concat(e,"/members/").concat(t)).then((function(e){return e.body}))},e}();t.default=n},197:function(e,t){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e){this.request=e}return e.prototype._parseResponse=function(e){return r({status:e.status},e.body)},e.prototype.create=function(e,t){return t.message?this.request.postWithFD("/v3/".concat(e,"/messages.mime"),t).then(this._parseResponse):this.request.postWithFD("/v3/".concat(e,"/messages"),t).then(this._parseResponse)},e}();t.default=n},587:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(){return this.request.get("/v4/address/validate/bulk").then((function(e){return e.body}))},e.prototype.get=function(e){return this.request.get("/v4/address/validate/bulk/".concat(e)).then((function(e){return e.body}))},e.prototype.create=function(e,t){return this.request.postWithFD("/v4/address/validate/bulk/".concat(e),t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v4/address/validate/bulk/".concat(e)).then((function(e){return e}))},e}();t.default=r},438:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&o(t,e,r);return s(t,e),t},a=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,s){function i(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((n=n.apply(e,t||[])).next())}))},u=this&&this.__generator||function(e,t){var r,n,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var c=i(r(501)),d=l(r(78)),f=l(r(556)),p=l(r(142)),h=l(r(150)),b=function(){function e(e,t){this.username=e.username,this.key=e.key,this.url=e.url,this.timeout=e.timeout,this.headers=e.headers||{},this.formDataBuilder=new h.default(t)}return e.prototype.request=function(e,t,r){return a(this,void 0,void 0,(function(){var o,s,i,a,l,h,b;return u(this,(function(u){switch(u.label){case 0:return o=n({},r),s=c.encode("".concat(this.username,":").concat(this.key)),i=o.headers?o.headers:{},a=n(n({Authorization:"Basic ".concat(s)},this.headers),i),null==o||delete o.headers,l=n({},o),(null==o?void 0:o.query)&&Object.getOwnPropertyNames(null==o?void 0:o.query).length>0&&(l.searchParams=o.query,delete l.query),[4,(0,f.default)((0,d.default)(this.url,t),n({method:e.toLocaleUpperCase(),headers:a,throwHttpErrors:!1,timeout:this.timeout},l))];case 1:return(null==(h=u.sent())?void 0:h.ok)?[3,3]:[4,this.getResponseBody(h)];case 2:throw b=u.sent(),new p.default({status:null==h?void 0:h.status,statusText:null==h?void 0:h.statusText,body:b.body});case 3:return[4,this.getResponseBody(h)];case 4:return[2,u.sent()]}}))}))},e.prototype.getResponseBody=function(e){return a(this,void 0,void 0,(function(){var t,r,n;return u(this,(function(o){switch(o.label){case 0:t={body:{},status:null==e?void 0:e.status},r="",o.label=1;case 1:return o.trys.push([1,3,,4]),[4,e.text()];case 2:return r=o.sent(),n=JSON.parse(r),t.body=n,[2,t];case 3:return o.sent(),t.status=400,t.body={message:r},[2,t];case 4:return[2]}}))}))},e.prototype.query=function(e,t,r,o){return this.request(e,t,n({query:r},o))},e.prototype.command=function(e,t,r,o,s){void 0===s&&(s=!0);var i={};s&&(i={"Content-Type":"application/x-www-form-urlencoded"});var a=n(n(n({},i),{body:r}),o);return this.request(e,t,a)},e.prototype.get=function(e,t,r){return this.query("get",e,t,r)},e.prototype.post=function(e,t,r){return this.command("post",e,t,r)},e.prototype.postWithFD=function(e,t){var r=this.formDataBuilder.createFormData(t);return this.command("post",e,r,{},!1)},e.prototype.putWithFD=function(e,t){var r=this.formDataBuilder.createFormData(t);return this.command("put",e,r,{},!1)},e.prototype.patchWithFD=function(e,t){var r=this.formDataBuilder.createFormData(t);return this.command("patch",e,r,{},!1)},e.prototype.put=function(e,t,r){return this.command("put",e,t,r)},e.prototype.delete=function(e,t){return this.command("delete",e,t)},e}();t.default=b},277:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.request=e}return e.prototype.list=function(e){return this.request.get("/v3/routes",e).then((function(e){return e.body.items}))},e.prototype.get=function(e){return this.request.get("/v3/routes/".concat(e)).then((function(e){return e.body.route}))},e.prototype.create=function(e){return this.request.postWithFD("/v3/routes",e).then((function(e){return e.body.route}))},e.prototype.update=function(e,t){return this.request.putWithFD("/v3/routes/".concat(e),t).then((function(e){return e.body}))},e.prototype.destroy=function(e){return this.request.delete("/v3/routes/".concat(e)).then((function(e){return e.body}))},e}();t.default=r},747:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)},o=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var i=s(r(78)),a=function(e){this.start=new Date(e.start),this.end=new Date(e.end),this.resolution=e.resolution,this.stats=e.stats.map((function(e){var t=n({},e);return t.time=new Date(e.time),t}))},u=function(){function e(e){this.request=e}return e.prototype.prepareSearchParams=function(e){var t=[];return"object"==typeof e&&Object.keys(e).length&&(t=Object.entries(e).reduce((function(e,t){var r=t[0],n=t[1];if(Array.isArray(n)&&n.length){var s=n.map((function(e){return[r,e]}));return o(o([],e,!0),s,!0)}return e.push([r,n]),e}),[])),t},e.prototype._parseStats=function(e){return new a(e.body)},e.prototype.getDomain=function(e,t){var r=this.prepareSearchParams(t);return this.request.get((0,i.default)("/v3",e,"stats/total"),r).then(this._parseStats)},e.prototype.getAccount=function(e){var t=this.prepareSearchParams(e);return this.request.get("/v3/stats/total",t).then(this._parseStats)},e}();t.default=u},778:function(e,t,r){"use strict";var n,o=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)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,s=t.length;o<s;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.WhiteList=t.Unsubscribe=t.Complaint=t.Bounce=t.Suppression=void 0;var a=i(r(78)),u=r(990),l=i(r(142)),c={headers:{"Content-Type":"application/json"}},d=function(e){this.type=e};t.Suppression=d;var f=function(e){function t(t){var r=e.call(this,u.SuppressionModels.BOUNCES)||this;return r.address=t.address,r.code=+t.code,r.error=t.error,r.created_at=new Date(t.created_at),r}return o(t,e),t}(d);t.Bounce=f;var p=function(e){function t(t){var r=e.call(this,u.SuppressionModels.COMPLAINTS)||this;return r.address=t.address,r.created_at=new Date(t.created_at),r}return o(t,e),t}(d);t.Complaint=p;var h=function(e){function t(t){var r=e.call(this,u.SuppressionModels.UNSUBSCRIBES)||this;return r.address=t.address,r.tags=t.tags,r.created_at=new Date(t.created_at),r}return o(t,e),t}(d);t.Unsubscribe=h;var b=function(e){function t(t){var r=e.call(this,u.SuppressionModels.WHITELISTS)||this;return r.value=t.value,r.reason=t.reason,r.createdAt=new Date(t.createdAt),r}return o(t,e),t}(d);t.WhiteList=b;var y=function(){function e(e){this.request=e,this.models=new Map,this.models.set("bounces",f),this.models.set("complaints",p),this.models.set("unsubscribes",h),this.models.set("whitelists",b)}return e.prototype._parsePage=function(e,t){var r=new URL(t).searchParams;return{id:e,page:r.has("page")?r.get("page"):void 0,address:r.has("address")?r.get("address"):void 0,url:t}},e.prototype._parsePageLinks=function(e){var t=this;return Object.entries(e.body.paging).reduce((function(e,r){var n=r[0],o=r[1];return e[n]=t._parsePage(n,o),e}),{})},e.prototype._parseList=function(e,t){var r={};return r.items=e.body.items.map((function(e){return new t(e)})),r.pages=this._parsePageLinks(e),r},e.prototype._parseItem=function(e,t){return new t(e)},e.prototype.createWhiteList=function(e,t){if(Array.isArray(t))throw new l.default({status:400,statusText:"Data property should be an object",body:{message:"Whitelist's creation process does not support multiple creations. Data property should be an object"}});return this.request.postWithFD((0,a.default)("v3",e,"whitelists"),t).then(this.prepareResponse)},e.prototype.checkType=function(e){if(!this.models.has(e))throw new l.default({status:400,statusText:"Unknown type value",body:{message:"Type may be only one of [bounces, complaints, unsubscribes, whitelists]"}})},e.prototype.prepareResponse=function(e){return{message:e.body.message,type:e.body.type||"",value:e.body.value||"",status:e.status}},e.prototype.list=function(e,t,r){var n=this;this.checkType(t);var o=this.models.get(t);return this.request.get((0,a.default)("v3",e,t),r).then((function(e){return n._parseList(e,o)}))},e.prototype.get=function(e,t,r){var n=this;this.checkType(t);var o=this.models.get(t);return this.request.get((0,a.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return n._parseItem(e.body,o)}))},e.prototype.create=function(e,t,r){var n;return this.checkType(t),"whitelists"===t?this.createWhiteList(e,r):(n=Array.isArray(r)?s([],r,!0):[r],this.request.post((0,a.default)("v3",e,t),JSON.stringify(n),c).then(this.prepareResponse))},e.prototype.destroy=function(e,t,r){return this.checkType(t),this.request.delete((0,a.default)("v3",e,t,encodeURIComponent(r))).then((function(e){return{message:e.body.message,value:e.body.value||"",address:e.body.address||"",status:e.status}}))},e}();t.default=y,e.exports=y},839:function(e,t){"use strict";var r=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,s){function i(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}u((n=n.apply(e,t||[])).next())}))},n=this&&this.__generator||function(e,t){var r,n,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}};Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){this.request=e,this.multipleValidation=t}return e.prototype.get=function(e){return r(this,void 0,void 0,(function(){var t;return n(this,(function(r){switch(r.label){case 0:return t={address:e},[4,this.request.get("/v4/address/validate",t)];case 1:return[2,r.sent().body]}}))}))},e}();t.default=o},750:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=n(r(78)),s=function(e,t){this.id=e,this.url=t},i=function(){function e(e){this.request=e}return e.prototype._parseWebhookList=function(e){return e.body.webhooks},e.prototype._parseWebhookWithID=function(e){return function(t){var r,n=null===(r=null==t?void 0:t.body)||void 0===r?void 0:r.webhook,o=null==n?void 0:n.url;return o||(o=(null==n?void 0:n.urls)&&n.urls.length?n.urls[0]:void 0),new s(e,o)}},e.prototype._parseWebhookTest=function(e){return{code:e.body.code,message:e.body.message}},e.prototype.list=function(e,t){return this.request.get((0,o.default)("/v3/domains",e,"webhooks"),t).then(this._parseWebhookList)},e.prototype.get=function(e,t){return this.request.get((0,o.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e.prototype.create=function(e,t,r,n){return void 0===n&&(n=!1),n?this.request.putWithFD((0,o.default)("/v3/domains",e,"webhooks",t,"test"),{url:r}).then(this._parseWebhookTest):this.request.postWithFD((0,o.default)("/v3/domains",e,"webhooks"),{id:t,url:r}).then(this._parseWebhookWithID(t))},e.prototype.update=function(e,t,r){return this.request.putWithFD((0,o.default)("/v3/domains",e,"webhooks",t),{url:r}).then(this._parseWebhookWithID(t))},e.prototype.destroy=function(e,t){return this.request.delete((0,o.default)("/v3/domains",e,"webhooks",t)).then(this._parseWebhookWithID(t))},e}();t.default=i},501:function(e,t,r){var n;e=r.nmd(e),function(o){var s=t,i=(e&&e.exports,"object"==typeof global&&global);i.global!==i&&i.window;var a=function(e){this.message=e};(a.prototype=new Error).name="InvalidCharacterError";var u=function(e){throw new a(e)},l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=/[\t\n\f\r ]/g,d={encode:function(e){e=String(e),/[^\0-\xFF]/.test(e)&&u("The string to be encoded contains characters outside of the Latin1 range.");for(var t,r,n,o,s=e.length%3,i="",a=-1,c=e.length-s;++a<c;)t=e.charCodeAt(a)<<16,r=e.charCodeAt(++a)<<8,n=e.charCodeAt(++a),i+=l.charAt((o=t+r+n)>>18&63)+l.charAt(o>>12&63)+l.charAt(o>>6&63)+l.charAt(63&o);return 2==s?(t=e.charCodeAt(a)<<8,r=e.charCodeAt(++a),i+=l.charAt((o=t+r)>>10)+l.charAt(o>>4&63)+l.charAt(o<<2&63)+"="):1==s&&(o=e.charCodeAt(a),i+=l.charAt(o>>2)+l.charAt(o<<4&63)+"=="),i},decode:function(e){var t=(e=String(e).replace(c,"")).length;t%4==0&&(t=(e=e.replace(/==?$/,"")).length),(t%4==1||/[^+a-zA-Z0-9/]/.test(e))&&u("Invalid character: the string to be decoded is not correctly encoded.");for(var r,n,o=0,s="",i=-1;++i<t;)n=l.indexOf(e.charAt(i)),r=o%4?64*r+n:n,o++%4&&(s+=String.fromCharCode(255&r>>(-2*o&6)));return s},version:"1.0.0"};void 0===(n=function(){return d}.call(t,r,t,e))||(e.exports=n)}()},94:e=>{"use strict";e.exports=function(e){if(!/^data:/i.test(e))throw new TypeError('`uri` does not appear to be a Data URI (must begin with "data:")');const t=(e=e.replace(/\r?\n/g,"")).indexOf(",");if(-1===t||t<=4)throw new TypeError("malformed data: URI");const r=e.substring(5,t).split(";");let n="",o=!1;const s=r[0]||"text/plain";let i=s;for(let e=1;e<r.length;e++)"base64"===r[e]?o=!0:(i+=`;${r[e]}`,0===r[e].indexOf("charset=")&&(n=r[e].substring(8)));r[0]||n.length||(i+=";charset=US-ASCII",n="US-ASCII");const a=o?"base64":"ascii",u=unescape(e.substring(t+1)),l=Buffer.from(u,a);return l.type=s,l.typeFull=i,l.charset=n,l}},185:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=new WeakMap,n=new WeakMap;function o(e){const t=r.get(e);return console.assert(null!=t,"'this' is expected an Event object, but got",e),t}function s(e){null==e.passiveListener?e.event.cancelable&&(e.canceled=!0,"function"==typeof e.event.preventDefault&&e.event.preventDefault()):"undefined"!=typeof console&&"function"==typeof console.error&&console.error("Unable to preventDefault inside passive event listener invocation.",e.passiveListener)}function i(e,t){r.set(this,{eventTarget:e,event:t,eventPhase:2,currentTarget:e,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:t.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});const n=Object.keys(t);for(let e=0;e<n.length;++e){const t=n[e];t in this||Object.defineProperty(this,t,a(t))}}function a(e){return{get(){return o(this).event[e]},set(t){o(this).event[e]=t},configurable:!0,enumerable:!0}}function u(e){return{value(){const t=o(this).event;return t[e].apply(t,arguments)},configurable:!0,enumerable:!0}}function l(e){if(null==e||e===Object.prototype)return i;let t=n.get(e);return null==t&&(t=function(e,t){const r=Object.keys(t);if(0===r.length)return e;function n(t,r){e.call(this,t,r)}n.prototype=Object.create(e.prototype,{constructor:{value:n,configurable:!0,writable:!0}});for(let o=0;o<r.length;++o){const s=r[o];if(!(s in e.prototype)){const e="function"==typeof Object.getOwnPropertyDescriptor(t,s).value;Object.defineProperty(n.prototype,s,e?u(s):a(s))}}return n}(l(Object.getPrototypeOf(e)),e),n.set(e,t)),t}function c(e){return o(e).immediateStopped}function d(e,t){o(e).passiveListener=t}i.prototype={get type(){return o(this).event.type},get target(){return o(this).eventTarget},get currentTarget(){return o(this).currentTarget},composedPath(){const e=o(this).currentTarget;return null==e?[]:[e]},get NONE(){return 0},get CAPTURING_PHASE(){return 1},get AT_TARGET(){return 2},get BUBBLING_PHASE(){return 3},get eventPhase(){return o(this).eventPhase},stopPropagation(){const e=o(this);e.stopped=!0,"function"==typeof e.event.stopPropagation&&e.event.stopPropagation()},stopImmediatePropagation(){const e=o(this);e.stopped=!0,e.immediateStopped=!0,"function"==typeof e.event.stopImmediatePropagation&&e.event.stopImmediatePropagation()},get bubbles(){return Boolean(o(this).event.bubbles)},get cancelable(){return Boolean(o(this).event.cancelable)},preventDefault(){s(o(this))},get defaultPrevented(){return o(this).canceled},get composed(){return Boolean(o(this).event.composed)},get timeStamp(){return o(this).timeStamp},get srcElement(){return o(this).eventTarget},get cancelBubble(){return o(this).stopped},set cancelBubble(e){if(!e)return;const t=o(this);t.stopped=!0,"boolean"==typeof t.event.cancelBubble&&(t.event.cancelBubble=!0)},get returnValue(){return!o(this).canceled},set returnValue(e){e||s(o(this))},initEvent(){}},Object.defineProperty(i.prototype,"constructor",{value:i,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.Event&&(Object.setPrototypeOf(i.prototype,window.Event.prototype),n.set(window.Event.prototype,i));const f=new WeakMap;function p(e){return null!==e&&"object"==typeof e}function h(e){const t=f.get(e);if(null==t)throw new TypeError("'this' is expected an EventTarget object, but got another value.");return t}function b(e,t){Object.defineProperty(e,`on${t}`,function(e){return{get(){let t=h(this).get(e);for(;null!=t;){if(3===t.listenerType)return t.listener;t=t.next}return null},set(t){"function"==typeof t||p(t)||(t=null);const r=h(this);let n=null,o=r.get(e);for(;null!=o;)3===o.listenerType?null!==n?n.next=o.next:null!==o.next?r.set(e,o.next):r.delete(e):n=o,o=o.next;if(null!==t){const o={listener:t,listenerType:3,passive:!1,once:!1,next:null};null===n?r.set(e,o):n.next=o}},configurable:!0,enumerable:!0}}(t))}function y(e){function t(){m.call(this)}t.prototype=Object.create(m.prototype,{constructor:{value:t,configurable:!0,writable:!0}});for(let r=0;r<e.length;++r)b(t.prototype,e[r]);return t}function m(){if(!(this instanceof m)){if(1===arguments.length&&Array.isArray(arguments[0]))return y(arguments[0]);if(arguments.length>0){const e=new Array(arguments.length);for(let t=0;t<arguments.length;++t)e[t]=arguments[t];return y(e)}throw new TypeError("Cannot call a class as a function")}f.set(this,new Map)}m.prototype={addEventListener(e,t,r){if(null==t)return;if("function"!=typeof t&&!p(t))throw new TypeError("'listener' should be a function or an object.");const n=h(this),o=p(r),s=(o?Boolean(r.capture):Boolean(r))?1:2,i={listener:t,listenerType:s,passive:o&&Boolean(r.passive),once:o&&Boolean(r.once),next:null};let a=n.get(e);if(void 0===a)return void n.set(e,i);let u=null;for(;null!=a;){if(a.listener===t&&a.listenerType===s)return;u=a,a=a.next}u.next=i},removeEventListener(e,t,r){if(null==t)return;const n=h(this),o=(p(r)?Boolean(r.capture):Boolean(r))?1:2;let s=null,i=n.get(e);for(;null!=i;){if(i.listener===t&&i.listenerType===o)return void(null!==s?s.next=i.next:null!==i.next?n.set(e,i.next):n.delete(e));s=i,i=i.next}},dispatchEvent(e){if(null==e||"string"!=typeof e.type)throw new TypeError('"event.type" should be a string.');const t=h(this),r=e.type;let n=t.get(r);if(null==n)return!0;const s=function(e,t){return new(l(Object.getPrototypeOf(t)))(e,t)}(this,e);let i=null;for(;null!=n;){if(n.once?null!==i?i.next=n.next:null!==n.next?t.set(r,n.next):t.delete(r):i=n,d(s,n.passive?n.listener:null),"function"==typeof n.listener)try{n.listener.call(this,s)}catch(e){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(e)}else 3!==n.listenerType&&"function"==typeof n.listener.handleEvent&&n.listener.handleEvent(s);if(c(s))break;n=n.next}return d(s,null),function(e,t){o(e).eventPhase=t}(s,0),function(e,t){o(e).currentTarget=t}(s,null),!s.defaultPrevented}},Object.defineProperty(m.prototype,"constructor",{value:m,configurable:!0,writable:!0}),"undefined"!=typeof window&&void 0!==window.EventTarget&&Object.setPrototypeOf(m.prototype,window.EventTarget.prototype),t.defineEventAttribute=b,t.EventTarget=m,t.default=m,e.exports=m,e.exports.EventTarget=e.exports.default=m,e.exports.defineEventAttribute=b},30:(e,t,r)=>{const{Readable:n}=r(781),o=new WeakMap;class Blob{constructor(e=[],t={}){let r=0;const n=e.map((e=>{let t;return t=e instanceof Buffer?e:ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer?Buffer.from(e):e instanceof Blob?e:Buffer.from("string"==typeof e?e:String(e)),r+=t.length||t.size||0,t})),s=void 0===t.type?"":String(t.type).toLowerCase();o.set(this,{type:/[^\u0020-\u007E]/.test(s)?"":s,size:r,parts:n})}get size(){return o.get(this).size}get type(){return o.get(this).type}async text(){return Buffer.from(await this.arrayBuffer()).toString()}async arrayBuffer(){const e=new Uint8Array(this.size);let t=0;for await(const r of this.stream())e.set(r,t),t+=r.length;return e.buffer}stream(){return n.from(async function*(e){for(const t of e)"stream"in t?yield*t.stream():yield t}(o.get(this).parts))}slice(e=0,t=this.size,r=""){const{size:n}=this;let s=e<0?Math.max(n+e,0):Math.min(e,n),i=t<0?Math.max(n+t,0):Math.min(t,n);const a=Math.max(i-s,0),u=o.get(this).parts.values(),l=[];let c=0;for(const e of u){const t=ArrayBuffer.isView(e)?e.byteLength:e.size;if(s&&t<=s)s-=t,i-=t;else{const r=e.slice(s,Math.min(t,i));if(l.push(r),c+=ArrayBuffer.isView(r)?r.byteLength:r.size,s=0,c>=a)break}}const d=new Blob([],{type:String(r).toLowerCase()});return Object.assign(o.get(d),{size:a,parts:l}),d}get[Symbol.toStringTag](){return"Blob"}static[Symbol.hasInstance](e){return e&&"object"==typeof e&&"function"==typeof e.stream&&0===e.stream.length&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[Symbol.toStringTag])}}Object.defineProperties(Blob.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}}),e.exports=Blob},556:(e,t,r)=>{"use strict";const n=r(594),o=r(271);if(global.fetch||(global.fetch=(e,t)=>n(e,{highWaterMark:1e7,...t})),global.Headers||(global.Headers=n.Headers),global.Request||(global.Request=n.Request),global.Response||(global.Response=n.Response),global.AbortController||(global.AbortController=o),!global.ReadableStream)try{global.ReadableStream=r(902)}catch(e){}e.exports=r(721)},721:function(e){var t;t=function(){"use strict";const e={},t=e=>"undefined"!=typeof self&&self&&e in self?self:"undefined"!=typeof window&&window&&e in window?window:"undefined"!=typeof global&&global&&e in global?global:"undefined"!=typeof globalThis&&globalThis?globalThis:void 0,r=["Headers","Request","Response","ReadableStream","fetch","AbortController","FormData"];for(const n of r)Object.defineProperty(e,n,{get(){const e=t(n),r=e&&e[n];return"function"==typeof r?r.bind(e):r}});const n=e=>null!==e&&"object"==typeof e,o="function"==typeof e.AbortController,s="function"==typeof e.ReadableStream,i="function"==typeof e.FormData,a=(t,r)=>{const n=new e.Headers(t||{}),o=r instanceof e.Headers,s=new e.Headers(r||{});for(const[e,t]of s)o&&"undefined"===t||void 0===t?n.delete(e):n.set(e,t);return n},u=(...e)=>{let t={},r={};for(const o of e){if(Array.isArray(o))Array.isArray(t)||(t=[]),t=[...t,...o];else if(n(o)){for(let[e,r]of Object.entries(o))n(r)&&e in t&&(r=u(t[e],r)),t={...t,[e]:r};n(o.headers)&&(r=a(r,o.headers))}t.headers=r}return t},l=["get","post","put","patch","head","delete"],c={json:"application/json",text:"text/*",formData:"multipart/form-data",arrayBuffer:"*/*",blob:"*/*"},d=[413,429,503],f=Symbol("stop");class HTTPError extends Error{constructor(e){super(e.statusText||String(0===e.status||e.status?e.status:"Unknown response error")),this.name="HTTPError",this.response=e}}class TimeoutError extends Error{constructor(e){super("Request timed out"),this.name="TimeoutError",this.request=e}}const p=e=>new Promise((t=>setTimeout(t,e))),h=e=>l.includes(e)?e.toUpperCase():e,b={limit:2,methods:["get","put","head","delete","options","trace"],statusCodes:[408,413,429,500,502,503,504],afterStatusCodes:d},y=(e={})=>{if("number"==typeof e)return{...b,limit:e};if(e.methods&&!Array.isArray(e.methods))throw new Error("retry.methods must be an array");if(e.statusCodes&&!Array.isArray(e.statusCodes))throw new Error("retry.statusCodes must be an array");return{...b,...e,afterStatusCodes:d}},m=2147483647;class Ky{constructor(t,r={}){if(this._retryCount=0,this._input=t,this._options={credentials:this._input.credentials||"same-origin",...r,headers:a(this._input.headers,r.headers),hooks:u({beforeRequest:[],beforeRetry:[],afterResponse:[]},r.hooks),method:h(r.method||this._input.method),prefixUrl:String(r.prefixUrl||""),retry:y(r.retry),throwHttpErrors:!1!==r.throwHttpErrors,timeout:void 0===r.timeout?1e4:r.timeout,fetch:r.fetch||e.fetch},"string"!=typeof this._input&&!(this._input instanceof URL||this._input instanceof e.Request))throw new TypeError("`input` must be a string, URL, or Request");if(this._options.prefixUrl&&"string"==typeof this._input){if(this._input.startsWith("/"))throw new Error("`input` must not begin with a slash when using `prefixUrl`");this._options.prefixUrl.endsWith("/")||(this._options.prefixUrl+="/"),this._input=this._options.prefixUrl+this._input}if(o&&(this.abortController=new e.AbortController,this._options.signal&&this._options.signal.addEventListener("abort",(()=>{this.abortController.abort()})),this._options.signal=this.abortController.signal),this.request=new e.Request(this._input,this._options),this._options.searchParams){const t="?"+new URLSearchParams(this._options.searchParams).toString(),r=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,t);!(i&&this._options.body instanceof e.FormData||this._options.body instanceof URLSearchParams)||this._options.headers&&this._options.headers["content-type"]||this.request.headers.delete("content-type"),this.request=new e.Request(new e.Request(r,this.request),this._options)}void 0!==this._options.json&&(this._options.body=JSON.stringify(this._options.json),this.request.headers.set("content-type","application/json"),this.request=new e.Request(this.request,{body:this._options.body}));const n=async()=>{if(this._options.timeout>m)throw new RangeError("The `timeout` option cannot be greater than 2147483647");await p(1);let t=await this._fetch();for(const r of this._options.hooks.afterResponse){const n=await r(this.request,this._options,this._decorateResponse(t.clone()));n instanceof e.Response&&(t=n)}if(this._decorateResponse(t),!t.ok&&this._options.throwHttpErrors)throw new HTTPError(t);if(this._options.onDownloadProgress){if("function"!=typeof this._options.onDownloadProgress)throw new TypeError("The `onDownloadProgress` option must be a function");if(!s)throw new Error("Streams are not supported in your environment. `ReadableStream` is missing.");return this._stream(t.clone(),this._options.onDownloadProgress)}return t},l=this._options.retry.methods.includes(this.request.method.toLowerCase())?this._retry(n):n();for(const[e,t]of Object.entries(c))l[e]=async()=>{this.request.headers.set("accept",this.request.headers.get("accept")||t);const n=(await l).clone();if("json"===e){if(204===n.status)return"";if(r.parseJson)return r.parseJson(await n.text())}return n[e]()};return l}_calculateRetryDelay(e){if(this._retryCount++,this._retryCount<this._options.retry.limit&&!(e instanceof TimeoutError)){if(e instanceof HTTPError){if(!this._options.retry.statusCodes.includes(e.response.status))return 0;const t=e.response.headers.get("Retry-After");if(t&&this._options.retry.afterStatusCodes.includes(e.response.status)){let e=Number(t);return Number.isNaN(e)?e=Date.parse(t)-Date.now():e*=1e3,void 0!==this._options.retry.maxRetryAfter&&e>this._options.retry.maxRetryAfter?0:e}if(413===e.response.status)return 0}return.3*2**(this._retryCount-1)*1e3}return 0}_decorateResponse(e){return this._options.parseJson&&(e.json=async()=>this._options.parseJson(await e.text())),e}async _retry(e){try{return await e()}catch(t){const r=Math.min(this._calculateRetryDelay(t),m);if(0!==r&&this._retryCount>0){await p(r);for(const e of this._options.hooks.beforeRetry)if(await e({request:this.request,options:this._options,error:t,retryCount:this._retryCount})===f)return;return this._retry(e)}if(this._options.throwHttpErrors)throw t}}async _fetch(){for(const e of this._options.hooks.beforeRequest){const t=await e(this.request,this._options);if(t instanceof Request){this.request=t;break}if(t instanceof Response)return t}return!1===this._options.timeout?this._options.fetch(this.request.clone()):(e=this.request.clone(),t=this.abortController,r=this._options,new Promise(((n,o)=>{const s=setTimeout((()=>{t&&t.abort(),o(new TimeoutError(e))}),r.timeout);r.fetch(e).then(n).catch(o).then((()=>{clearTimeout(s)}))})));var e,t,r}_stream(t,r){const n=Number(t.headers.get("content-length"))||0;let o=0;return new e.Response(new e.ReadableStream({start(e){const s=t.body.getReader();r&&r({percent:0,transferredBytes:0,totalBytes:n},new Uint8Array),async function t(){const{done:i,value:a}=await s.read();i?e.close():(r&&(o+=a.byteLength,r({percent:0===n?0:o/n,transferredBytes:o,totalBytes:n},a)),e.enqueue(a),t())}()}}))}}const g=(...e)=>{for(const t of e)if((!n(t)||Array.isArray(t))&&void 0!==t)throw new TypeError("The `options` argument must be an object");return u({},...e)},_=e=>{const t=(t,r)=>new Ky(t,g(e,r));for(const r of l)t[r]=(t,n)=>new Ky(t,g(e,n,{method:r}));return t.HTTPError=HTTPError,t.TimeoutError=TimeoutError,t.create=e=>_(g(e)),t.extend=t=>_(g(e,t)),t.stop=f,t};return _()},e.exports=t()},78:function(e,t,r){var n,o,s;s=function(){function e(e){var t=[];if(0===e.length)return"";if("string"!=typeof e[0])throw new TypeError("Url must be a string. Received "+e[0]);if(e[0].match(/^[^/:]+:\/*$/)&&e.length>1){var r=e.shift();e[0]=r+e[0]}e[0].match(/^file:\/\/\//)?e[0]=e[0].replace(/^([^/:]+):\/*/,"$1:///"):e[0]=e[0].replace(/^([^/:]+):\/*/,"$1://");for(var n=0;n<e.length;n++){var o=e[n];if("string"!=typeof o)throw new TypeError("Url must be a string. Received "+o);""!==o&&(n>0&&(o=o.replace(/^[\/]+/,"")),o=n<e.length-1?o.replace(/[\/]+$/,""):o.replace(/[\/]+$/,"/"),t.push(o))}var s=t.join("/"),i=(s=s.replace(/\/(\?|&|#[^!])/g,"$1")).split("?");return s=i.shift()+(i.length>0?"?":"")+i.join("&")}return function(){return e("object"==typeof arguments[0]?arguments[0]:[].slice.call(arguments))}},e.exports?e.exports=s():void 0===(o="function"==typeof(n=s)?n.call(t,r,t,e):n)||(e.exports=o)},113:e=>{"use strict";e.exports=require("crypto")},685:e=>{"use strict";e.exports=require("http")},687:e=>{"use strict";e.exports=require("https")},781:e=>{"use strict";e.exports=require("stream")},310:e=>{"use strict";e.exports=require("url")},837:e=>{"use strict";e.exports=require("util")},796:e=>{"use strict";e.exports=require("zlib")},594:(e,t,r)=>{"use strict";t=e.exports=D;const n=r(685),o=r(687),s=r(796),i=r(781),a=r(94),u=r(837),l=r(30),c=r(113),d=r(310);class FetchBaseError extends Error{constructor(e,t){super(e),Error.captureStackTrace(this,this.constructor),this.type=t}get name(){return this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}}class FetchError extends FetchBaseError{constructor(e,t,r){super(e,t),r&&(this.code=this.errno=r.code,this.erroredSysCall=r.syscall)}}const f=Symbol.toStringTag,p=e=>"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.delete&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.has&&"function"==typeof e.set&&"function"==typeof e.sort&&"URLSearchParams"===e[f],h=e=>"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&"function"==typeof e.constructor&&/^(Blob|File)$/.test(e[f]);function b(e){return"object"==typeof e&&"function"==typeof e.append&&"function"==typeof e.set&&"function"==typeof e.get&&"function"==typeof e.getAll&&"function"==typeof e.delete&&"function"==typeof e.keys&&"function"==typeof e.values&&"function"==typeof e.entries&&"function"==typeof e.constructor&&"FormData"===e[f]}const y="\r\n",m="-".repeat(2),g=Buffer.byteLength(y),_=e=>`${m}${e}${m}${y.repeat(2)}`;function v(e,t,r){let n="";return n+=`${m}${e}\r\n`,n+=`Content-Disposition: form-data; name="${t}"`,h(r)&&(n+=`; filename="${r.name}"\r\n`,n+=`Content-Type: ${r.type||"application/octet-stream"}`),`${n}${y.repeat(2)}`}const w=Symbol("Body internals");class Body{constructor(e,{size:t=0}={}){let r=null;null===e?e=null:p(e)?e=Buffer.from(e.toString()):h(e)||Buffer.isBuffer(e)||(u.types.isAnyArrayBuffer(e)?e=Buffer.from(e):ArrayBuffer.isView(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof i||(b(e)?(r=`NodeFetchFormDataBoundary${c.randomBytes(8).toString("hex")}`,e=i.Readable.from(async function*(e,t){for(const[r,n]of e)yield v(t,r,n),h(n)?yield*n.stream():yield n,yield y;yield _(t)}(e,r))):e=Buffer.from(String(e)))),this[w]={body:e,boundary:r,disturbed:!1,error:null},this.size=t,e instanceof i&&e.on("error",(e=>{const t=e instanceof FetchBaseError?e:new FetchError(`Invalid response body while trying to fetch ${this.url}: ${e.message}`,"system",e);this[w].error=t}))}get body(){return this[w].body}get bodyUsed(){return this[w].disturbed}async arrayBuffer(){const{buffer:e,byteOffset:t,byteLength:r}=await S(this);return e.slice(t,t+r)}async blob(){const e=this.headers&&this.headers.get("content-type")||this[w].body&&this[w].body.type||"",t=await this.buffer();return new l([t],{type:e})}async json(){const e=await S(this);return JSON.parse(e.toString())}async text(){return(await S(this)).toString()}buffer(){return S(this)}}async function S(e){if(e[w].disturbed)throw new TypeError(`body used already for: ${e.url}`);if(e[w].disturbed=!0,e[w].error)throw e[w].error;let{body:t}=e;if(null===t)return Buffer.alloc(0);if(h(t)&&(t=t.stream()),Buffer.isBuffer(t))return t;if(!(t instanceof i))return Buffer.alloc(0);const r=[];let n=0;try{for await(const o of t){if(e.size>0&&n+o.length>e.size){const r=new FetchError(`content size at ${e.url} over limit: ${e.size}`,"max-size");throw t.destroy(r),r}n+=o.length,r.push(o)}}catch(t){throw t instanceof FetchBaseError?t:new FetchError(`Invalid response body while trying to fetch ${e.url}: ${t.message}`,"system",t)}if(!0!==t.readableEnded&&!0!==t._readableState.ended)throw new FetchError(`Premature close of server response while trying to fetch ${e.url}`);try{return r.every((e=>"string"==typeof e))?Buffer.from(r.join("")):Buffer.concat(r,n)}catch(t){throw new FetchError(`Could not create Buffer from response body for ${e.url}: ${t.message}`,"system",t)}}Object.defineProperties(Body.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}});const R=(e,t)=>{let r,n,{body:o}=e;if(e.bodyUsed)throw new Error("cannot clone body after it is used");return o instanceof i&&"function"!=typeof o.getBoundary&&(r=new i.PassThrough({highWaterMark:t}),n=new i.PassThrough({highWaterMark:t}),o.pipe(r),o.pipe(n),e[w].body=r,o=n),o},T=(e,t)=>null===e?null:"string"==typeof e?"text/plain;charset=UTF-8":p(e)?"application/x-www-form-urlencoded;charset=UTF-8":h(e)?e.type||null:Buffer.isBuffer(e)||u.types.isAnyArrayBuffer(e)||ArrayBuffer.isView(e)?null:e&&"function"==typeof e.getBoundary?`multipart/form-data;boundary=${e.getBoundary()}`:b(e)?`multipart/form-data; boundary=${t[w].boundary}`:e instanceof i?null:"text/plain;charset=UTF-8",q=e=>{const{body:t}=e;return null===t?0:h(t)?t.size:Buffer.isBuffer(t)?t.length:t&&"function"==typeof t.getLengthSync?t.hasKnownLength&&t.hasKnownLength()?t.getLengthSync():null:b(t)?function(e,t){let r=0;for(const[n,o]of e)r+=Buffer.byteLength(v(t,n,o)),h(o)?r+=o.size:r+=Buffer.byteLength(String(o)),r+=g;return r+=Buffer.byteLength(_(t)),r}(e[w].boundary):null},P="function"==typeof n.validateHeaderName?n.validateHeaderName:e=>{if(!/^[\^`\-\w!#$%&'*+.|~]+$/.test(e)){const t=new TypeError(`Header name must be a valid HTTP token [${e}]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_HTTP_TOKEN"}),t}},C="function"==typeof n.validateHeaderValue?n.validateHeaderValue:(e,t)=>{if(/[^\t\u0020-\u007E\u0080-\u00FF]/.test(t)){const t=new TypeError(`Invalid character in header content ["${e}"]`);throw Object.defineProperty(t,"code",{value:"ERR_INVALID_CHAR"}),t}};class Headers extends URLSearchParams{constructor(e){let t=[];if(e instanceof Headers){const r=e.raw();for(const[e,n]of Object.entries(r))t.push(...n.map((t=>[e,t])))}else if(null==e);else{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Failed to construct 'Headers': The provided value is not of type '(sequence<sequence<ByteString>> or record<ByteString, ByteString>)");{const r=e[Symbol.iterator];if(null==r)t.push(...Object.entries(e));else{if("function"!=typeof r)throw new TypeError("Header pairs must be iterable");t=[...e].map((e=>{if("object"!=typeof e||u.types.isBoxedPrimitive(e))throw new TypeError("Each header pair must be an iterable object");return[...e]})).map((e=>{if(2!==e.length)throw new TypeError("Each header pair must be a name/value tuple");return[...e]}))}}}return t=t.length>0?t.map((([e,t])=>(P(e),C(e,String(t)),[String(e).toLowerCase(),String(t)]))):void 0,super(t),new Proxy(this,{get(e,t,r){switch(t){case"append":case"set":return(e,n)=>(P(e),C(e,String(n)),URLSearchParams.prototype[t].call(r,String(e).toLowerCase(),String(n)));case"delete":case"has":case"getAll":return e=>(P(e),URLSearchParams.prototype[t].call(r,String(e).toLowerCase()));case"keys":return()=>(e.sort(),new Set(URLSearchParams.prototype.keys.call(e)).keys());default:return Reflect.get(e,t,r)}}})}get[Symbol.toStringTag](){return this.constructor.name}toString(){return Object.prototype.toString.call(this)}get(e){const t=this.getAll(e);if(0===t.length)return null;let r=t.join(", ");return/^content-encoding$/i.test(e)&&(r=r.toLowerCase()),r}forEach(e){for(const t of this.keys())e(this.get(t),t)}*values(){for(const e of this.keys())yield this.get(e)}*entries(){for(const e of this.keys())yield[e,this.get(e)]}[Symbol.iterator](){return this.entries()}raw(){return[...this.keys()].reduce(((e,t)=>(e[t]=this.getAll(t),e)),{})}[Symbol.for("nodejs.util.inspect.custom")](){return[...this.keys()].reduce(((e,t)=>{const r=this.getAll(t);return e[t]="host"===t?r[0]:r.length>1?r:r[0],e}),{})}}Object.defineProperties(Headers.prototype,["get","entries","forEach","values"].reduce(((e,t)=>(e[t]={enumerable:!0},e)),{}));const E=new Set([301,302,303,307,308]),O=e=>E.has(e),j=Symbol("Response internals");class Response extends Body{constructor(e=null,t={}){super(e,t);const r=t.status||200,n=new Headers(t.headers);if(null!==e&&!n.has("Content-Type")){const t=T(e);t&&n.append("Content-Type",t)}this[j]={url:t.url,status:r,statusText:t.statusText||"",headers:n,counter:t.counter,highWaterMark:t.highWaterMark}}get url(){return this[j].url||""}get status(){return this[j].status}get ok(){return this[j].status>=200&&this[j].status<300}get redirected(){return this[j].counter>0}get statusText(){return this[j].statusText}get headers(){return this[j].headers}get highWaterMark(){return this[j].highWaterMark}clone(){return new Response(R(this,this.highWaterMark),{url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected,size:this.size})}static redirect(e,t=302){if(!O(t))throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');return new Response(null,{headers:{location:new URL(e).toString()},status:t})}get[Symbol.toStringTag](){return"Response"}}Object.defineProperties(Response.prototype,{url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}});const A=Symbol("Request internals"),k=e=>"object"==typeof e&&"object"==typeof e[A];class Request extends Body{constructor(e,t={}){let r;k(e)?r=new URL(e.url):(r=new URL(e),e={});let n=t.method||e.method||"GET";if(n=n.toUpperCase(),(null!=t.body||k(e))&&null!==e.body&&("GET"===n||"HEAD"===n))throw new TypeError("Request with GET/HEAD method cannot have body");const o=t.body?t.body:k(e)&&null!==e.body?R(e):null;super(o,{size:t.size||e.size||0});const s=new Headers(t.headers||e.headers||{});if(null!==o&&!s.has("Content-Type")){const e=T(o,this);e&&s.append("Content-Type",e)}let i=k(e)?e.signal:null;if("signal"in t&&(i=t.signal),null!==i&&("object"!=typeof(a=i)||"AbortSignal"!==a[f]))throw new TypeError("Expected signal to be an instanceof AbortSignal");var a;this[A]={method:n,redirect:t.redirect||e.redirect||"follow",headers:s,parsedURL:r,signal:i},this.follow=void 0===t.follow?void 0===e.follow?20:e.follow:t.follow,this.compress=void 0===t.compress?void 0===e.compress||e.compress:t.compress,this.counter=t.counter||e.counter||0,this.agent=t.agent||e.agent,this.highWaterMark=t.highWaterMark||e.highWaterMark||16384,this.insecureHTTPParser=t.insecureHTTPParser||e.insecureHTTPParser||!1}get method(){return this[A].method}get url(){return d.format(this[A].parsedURL)}get headers(){return this[A].headers}get redirect(){return this[A].redirect}get signal(){return this[A].signal}clone(){return new Request(this)}get[Symbol.toStringTag](){return"Request"}}Object.defineProperties(Request.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}});class AbortError extends FetchBaseError{constructor(e,t="aborted"){super(e,t)}}const B=new Set(["data:","http:","https:"]);async function D(e,t){return new Promise(((r,u)=>{const l=new Request(e,t),c=(e=>{const{parsedURL:t}=e[A],r=new Headers(e[A].headers);r.has("Accept")||r.set("Accept","*/*");let n=null;if(null===e.body&&/^(post|put)$/i.test(e.method)&&(n="0"),null!==e.body){const t=q(e);"number"!=typeof t||Number.isNaN(t)||(n=String(t))}n&&r.set("Content-Length",n),r.has("User-Agent")||r.set("User-Agent","node-fetch"),e.compress&&!r.has("Accept-Encoding")&&r.set("Accept-Encoding","gzip,deflate,br");let{agent:o}=e;"function"==typeof o&&(o=o(t)),r.has("Connection")||o||r.set("Connection","close");const s=(e=>{if(e.search)return e.search;const t=e.href.length-1,r=e.hash||("#"===e.href[t]?"#":"");return"?"===e.href[t-r.length]?"?":""})(t);return{path:t.pathname+s,pathname:t.pathname,hostname:t.hostname,protocol:t.protocol,port:t.port,hash:t.hash,search:t.search,query:t.query,href:t.href,method:e.method,headers:r[Symbol.for("nodejs.util.inspect.custom")](),insecureHTTPParser:e.insecureHTTPParser,agent:o}})(l);if(!B.has(c.protocol))throw new TypeError(`node-fetch cannot load ${e}. URL scheme "${c.protocol.replace(/:$/,"")}" is not supported.`);if("data:"===c.protocol){const e=a(l.url),t=new Response(e,{headers:{"Content-Type":e.typeFull}});return void r(t)}const d=("https:"===c.protocol?o:n).request,{signal:f}=l;let p=null;const b=()=>{const e=new AbortError("The operation was aborted.");u(e),l.body&&l.body instanceof i.Readable&&l.body.destroy(e),p&&p.body&&p.body.emit("error",e)};if(f&&f.aborted)return void b();const y=()=>{b(),g()},m=d(c);f&&f.addEventListener("abort",y);const g=()=>{m.abort(),f&&f.removeEventListener("abort",y)};m.on("error",(e=>{u(new FetchError(`request to ${l.url} failed, reason: ${e.message}`,"system",e)),g()})),m.on("response",(e=>{m.setTimeout(0);const n=function(e=[]){return new Headers(e.reduce(((e,t,r,n)=>(r%2==0&&e.push(n.slice(r,r+2)),e)),[]).filter((([e,t])=>{try{return P(e),C(e,String(t)),!0}catch{return!1}})))}(e.rawHeaders);if(O(e.statusCode)){const o=n.get("Location"),s=null===o?null:new URL(o,l.url);switch(l.redirect){case"error":return u(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${l.url}`,"no-redirect")),void g();case"manual":if(null!==s)try{n.set("Location",s)}catch(e){u(e)}break;case"follow":{if(null===s)break;if(l.counter>=l.follow)return u(new FetchError(`maximum redirect reached at: ${l.url}`,"max-redirect")),void g();const n={headers:new Headers(l.headers),follow:l.follow,counter:l.counter+1,agent:l.agent,compress:l.compress,method:l.method,body:l.body,signal:l.signal,size:l.size};return 303!==e.statusCode&&l.body&&t.body instanceof i.Readable?(u(new FetchError("Cannot follow redirect with body being a readable stream","unsupported-redirect")),void g()):(303!==e.statusCode&&(301!==e.statusCode&&302!==e.statusCode||"POST"!==l.method)||(n.method="GET",n.body=void 0,n.headers.delete("content-length")),r(D(new Request(s,n))),void g())}}}e.once("end",(()=>{f&&f.removeEventListener("abort",y)}));let o=i.pipeline(e,new i.PassThrough,(e=>{u(e)}));process.version<"v12.10"&&e.on("aborted",y);const a={url:l.url,status:e.statusCode,statusText:e.statusMessage,headers:n,size:l.size,counter:l.counter,highWaterMark:l.highWaterMark},c=n.get("Content-Encoding");if(!l.compress||"HEAD"===l.method||null===c||204===e.statusCode||304===e.statusCode)return p=new Response(o,a),void r(p);const d={flush:s.Z_SYNC_FLUSH,finishFlush:s.Z_SYNC_FLUSH};if("gzip"===c||"x-gzip"===c)return o=i.pipeline(o,s.createGunzip(d),(e=>{u(e)})),p=new Response(o,a),void r(p);if("deflate"!==c&&"x-deflate"!==c){if("br"===c)return o=i.pipeline(o,s.createBrotliDecompress(),(e=>{u(e)})),p=new Response(o,a),void r(p);p=new Response(o,a),r(p)}else{i.pipeline(e,new i.PassThrough,(e=>{u(e)})).once("data",(e=>{o=8==(15&e[0])?i.pipeline(o,s.createInflate(),(e=>{u(e)})):i.pipeline(o,s.createInflateRaw(),(e=>{u(e)})),p=new Response(o,a),r(p)}))}})),((e,{body:t})=>{null===t?e.end():h(t)?t.stream().pipe(e):Buffer.isBuffer(t)?(e.write(t),e.end()):t.pipe(e)})(m,l)}))}t.AbortError=AbortError,t.FetchError=FetchError,t.Headers=Headers,t.Request=Request,t.Response=Response,t.default=D,t.isRedirect=O},902:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ByteLengthQueuingStrategy:()=>ByteLengthQueuingStrategy,CountQueuingStrategy:()=>CountQueuingStrategy,ReadableByteStreamController:()=>ReadableByteStreamController,ReadableStream:()=>ReadableStream,ReadableStreamBYOBReader:()=>ReadableStreamBYOBReader,ReadableStreamBYOBRequest:()=>ReadableStreamBYOBRequest,ReadableStreamDefaultController:()=>ReadableStreamDefaultController,ReadableStreamDefaultReader:()=>ReadableStreamDefaultReader,TransformStream:()=>TransformStream,TransformStreamDefaultController:()=>TransformStreamDefaultController,WritableStream:()=>WritableStream,WritableStreamDefaultController:()=>WritableStreamDefaultController,WritableStreamDefaultWriter:()=>WritableStreamDefaultWriter});const n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function o(){}const s="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0;function i(e){return"object"==typeof e&&null!==e||"function"==typeof e}const a=o,u=Promise,l=Promise.prototype.then,c=Promise.resolve.bind(u),d=Promise.reject.bind(u);function f(e){return new u(e)}function p(e){return c(e)}function h(e){return d(e)}function b(e,t,r){return l.call(e,t,r)}function y(e,t,r){b(b(e,t,r),void 0,a)}function m(e,t){y(e,t)}function g(e,t){y(e,void 0,t)}function _(e,t,r){return b(e,t,r)}function v(e){b(e,void 0,a)}const w=(()=>{const e=s&&s.queueMicrotask;if("function"==typeof e)return e;const t=p(void 0);return e=>b(t,e)})();function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function R(e,t,r){try{return p(S(e,t,r))}catch(e){return h(e)}}class SimpleQueue{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let n=r+1;const o=e._elements,s=o[r];return 16384===n&&(t=e._next,n=0),--this._size,this._cursor=n,e!==t&&(this._front=t),o[r]=void 0,s}forEach(e){let t=this._cursor,r=this._front,n=r._elements;for(;!(t===n.length&&void 0===r._next||t===n.length&&(r=r._next,n=r._elements,t=0,0===n.length));)e(n[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}function T(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?E(e):"closed"===t._state?function(e){E(e),A(e)}(e):O(e,t._storedError)}function q(e,t){return pr(e._ownerReadableStream,t)}function P(e){"readable"===e._ownerReadableStream._state?j(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){O(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function C(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function E(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function O(e,t){E(e),j(e,t)}function j(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function A(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const k=n("[[AbortSteps]]"),B=n("[[ErrorSteps]]"),D=n("[[CancelSteps]]"),W=n("[[PullSteps]]"),x=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},L=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function F(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function M(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function I(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function z(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function $(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function U(e){return Number(e)}function H(e){return 0===e?0:e}function N(e,t){const r=Number.MAX_SAFE_INTEGER;let n=Number(e);if(n=H(n),!x(n))throw new TypeError(`${t} is not a finite number`);if(n=function(e){return H(L(e))}(n),n<0||n>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return x(n)&&0!==n?n:0}function Q(e,t){if(!dr(e))throw new TypeError(`${t} is not a ReadableStream.`)}function V(e){return new ReadableStreamDefaultReader(e)}function Y(e,t){e._reader._readRequests.push(t)}function G(e,t,r){const n=e._reader._readRequests.shift();r?n._closeSteps():n._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(z(e,1,"ReadableStreamDefaultReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");T(this,e),this._readRequests=new SimpleQueue}get closed(){return Z(this)?this._closedPromise:h(ee("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(ee("cancel"))}read(){if(!Z(this))return h(ee("read"));if(void 0===this._ownerReadableStream)return h(C("read from"));let e,t;const r=f(((r,n)=>{e=r,t=n}));return X(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw ee("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function Z(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function X(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[W](t)}function ee(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,n.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});const te=Object.getPrototypeOf(Object.getPrototypeOf((async function*(){})).prototype);class ReadableStreamAsyncIteratorImpl{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?_(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?_(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;if(void 0===e._ownerReadableStream)return h(C("iterate"));let t,r;const n=f(((e,n)=>{t=e,r=n}));return X(e,{_chunkSteps:e=>{this._ongoingPromise=void 0,w((()=>t({value:e,done:!1})))},_closeSteps:()=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),t({value:void 0,done:!0})},_errorSteps:t=>{this._ongoingPromise=void 0,this._isFinished=!0,P(e),r(t)}}),n}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t._ownerReadableStream)return h(C("finish iterating"));if(!this._preventCancel){const r=q(t,e);return P(t),_(r,(()=>({value:e,done:!0})))}return P(t),p({value:e,done:!0})}}const re={next(){return ne(this)?this._asyncIteratorImpl.next():h(oe("next"))},return(e){return ne(this)?this._asyncIteratorImpl.return(e):h(oe("return"))}};function ne(e){if(!i(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof ReadableStreamAsyncIteratorImpl}catch(e){return!1}}function oe(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}void 0!==te&&Object.setPrototypeOf(re,te);const se=Number.isNaN||function(e){return e!=e};function ie(e){return e.slice()}function ae(e,t,r,n,o){new Uint8Array(e).set(new Uint8Array(r,n,o),t)}function ue(e,t,r){if(e.slice)return e.slice(t,r);const n=r-t,o=new ArrayBuffer(n);return ae(o,0,e,t,n),o}function le(e){const t=ue(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ce(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function de(e,t,r){if("number"!=typeof(n=r)||se(n)||n<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var n;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function fe(e){e._queue=new SimpleQueue,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!he(this))throw xe("view");return this._view}respond(e){if(!he(this))throw xe("respond");if(z(e,1,"respond"),e=N(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,Be(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!he(this))throw xe("respondWithNewView");if(z(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,De(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,n.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!pe(this))throw Le("byobRequest");return Ae(this)}get desiredSize(){if(!pe(this))throw Le("desiredSize");return ke(this)}close(){if(!pe(this))throw Le("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);Ee(this)}enqueue(e){if(!pe(this))throw Le("enqueue");if(z(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);Oe(this,e)}error(e){if(!pe(this))throw Le("error");je(this,e)}[D](e){ye(this),fe(this);const t=this._cancelAlgorithm(e);return Ce(this),t}[W](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0){const t=this._queue.shift();this._queueTotalSize-=t.byteLength,Se(this);const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);return void e._chunkSteps(r)}const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const n={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(n)}Y(t,e),be(this)}}function pe(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function he(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function be(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(ze(t)&&Ie(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,be(e))}),(t=>{je(e,t)}))}function ye(e){Re(e),e._pendingPullIntos=new SimpleQueue}function me(e,t){let r=!1;"closed"===e._state&&(r=!0);const n=ge(t);"default"===t.readerType?G(e,n,r):function(e,t,r){const n=e._reader._readIntoRequests.shift();r?n._closeSteps(t):n._chunkSteps(t)}(e,n,r)}function ge(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function _e(e,t,r,n){e._queue.push({buffer:t,byteOffset:r,byteLength:n}),e._queueTotalSize+=n}function ve(e,t){const r=t.elementSize,n=t.bytesFilled-t.bytesFilled%r,o=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),s=t.bytesFilled+o,i=s-s%r;let a=o,u=!1;i>n&&(a=i-t.bytesFilled,u=!0);const l=e._queue;for(;a>0;){const r=l.peek(),n=Math.min(a,r.byteLength),o=t.byteOffset+t.bytesFilled;ae(t.buffer,o,r.buffer,r.byteOffset,n),r.byteLength===n?l.shift():(r.byteOffset+=n,r.byteLength-=n),e._queueTotalSize-=n,we(e,n,t),a-=n}return u}function we(e,t,r){r.bytesFilled+=t}function Se(e){0===e._queueTotalSize&&e._closeRequested?(Ce(e),hr(e._controlledReadableByteStream)):be(e)}function Re(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function Te(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();ve(e,t)&&(Pe(e),me(e._controlledReadableByteStream,t))}}function qe(e,t){const r=e._pendingPullIntos.peek();Re(e);"closed"===e._controlledReadableByteStream._state?function(e,t){const r=e._controlledReadableByteStream;if(ze(r))for(;Ie(r)>0;)me(r,Pe(e))}(e):function(e,t,r){if(we(0,t,r),r.bytesFilled<r.elementSize)return;Pe(e);const n=r.bytesFilled%r.elementSize;if(n>0){const t=r.byteOffset+r.bytesFilled,o=ue(r.buffer,t-n,t);_e(e,o,0,o.byteLength)}r.bytesFilled-=n,me(e._controlledReadableByteStream,r),Te(e)}(e,t,r),be(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ce(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function Ee(e){const t=e._controlledReadableByteStream;if(!e._closeRequested&&"readable"===t._state)if(e._queueTotalSize>0)e._closeRequested=!0;else{if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw je(e,t),t}}Ce(e),hr(t)}}function Oe(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const n=t.buffer,o=t.byteOffset,s=t.byteLength,i=n;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,t.buffer=t.buffer}if(Re(e),K(r))if(0===J(r))_e(e,i,o,s);else{e._pendingPullIntos.length>0&&Pe(e);G(r,new Uint8Array(i,o,s),!1)}else ze(r)?(_e(e,i,o,s),Te(e)):_e(e,i,o,s);be(e)}function je(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(ye(e),fe(e),Ce(e),br(r,t))}function Ae(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),n=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(n,e,r),e._byobRequest=n}return e._byobRequest}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,qe(e,t)}function De(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");const n=t.byteLength;r.buffer=t.buffer,qe(e,n)}function We(e,t,r,n,o,s,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,fe(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=s,t._pullAlgorithm=n,t._cancelAlgorithm=o,t._autoAllocateChunkSize=i,t._pendingPullIntos=new SimpleQueue,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,be(t)}),(e=>{je(t,e)}))}function xe(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function Le(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function Fe(e){return new ReadableStreamBYOBReader(e)}function Me(e,t){e._reader._readIntoRequests.push(t)}function Ie(e){return e._reader._readIntoRequests.length}function ze(e){const t=e._reader;return void 0!==t&&!!$e(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,n.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(z(e,1,"ReadableStreamBYOBReader"),Q(e,"First parameter"),fr(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!pe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");T(this,e),this._readIntoRequests=new SimpleQueue}get closed(){return $e(this)?this._closedPromise:h(He("closed"))}cancel(e){return $e(this)?void 0===this._ownerReadableStream?h(C("cancel")):q(this,e):h(He("cancel"))}read(e){if(!$e(this))return h(He("read"));if(!ArrayBuffer.isView(e))return h(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return h(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return h(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return h(C("read from"));let t,r;const n=f(((e,n)=>{t=e,r=n}));return Ue(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),n}releaseLock(){if(!$e(this))throw He("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");P(this)}}}function $e(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function Ue(e,t,r){const n=e._ownerReadableStream;n._disturbed=!0,"errored"===n._state?r._errorSteps(n._storedError):function(e,t,r){const n=e._controlledReadableByteStream;let o=1;t.constructor!==DataView&&(o=t.constructor.BYTES_PER_ELEMENT);const s=t.constructor,i=t.buffer,a={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:o,viewConstructor:s,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(a),void Me(n,r);if("closed"!==n._state){if(e._queueTotalSize>0){if(ve(e,a)){const t=ge(a);return Se(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return je(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(a),Me(n,r),be(e)}else{const e=new s(a.buffer,a.byteOffset,0);r._closeSteps(e)}}(n._readableStreamController,t,r)}function He(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Ne(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(se(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Qe(e){const{size:t}=e;return t||(()=>1)}function Ve(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark,n=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:U(r),size:void 0===n?void 0:Ye(n,`${t} has member 'size' that`)}}function Ye(e,t){return M(e,t),t=>U(e(t))}function Ge(e,t,r){return M(e,r),r=>R(e,t,[r])}function Je(e,t,r){return M(e,r),()=>R(e,t,[])}function Ke(e,t,r){return M(e,r),r=>S(e,t,[r])}function Ze(e,t,r){return M(e,r),(r,n)=>R(e,t,[r,n])}function Xe(e,t){if(!nt(e))throw new TypeError(`${t} is not a WritableStream.`)}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,n.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const et="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:I(e,"First parameter");const r=Ve(t,"Second parameter"),n=function(e,t){F(e,t);const r=null==e?void 0:e.abort,n=null==e?void 0:e.close,o=null==e?void 0:e.start,s=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:Ge(r,e,`${t} has member 'abort' that`),close:void 0===n?void 0:Je(n,e,`${t} has member 'close' that`),start:void 0===o?void 0:Ke(o,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ze(i,e,`${t} has member 'write' that`),type:s}}(e,"First parameter");rt(this);if(void 0!==n.type)throw new RangeError("Invalid type is specified");const o=Qe(r);!function(e,t,r,n){const o=Object.create(WritableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0),u=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(o));void 0!==t.write&&(i=e=>t.write(e,o));void 0!==t.close&&(a=()=>t.close());void 0!==t.abort&&(u=e=>t.abort(e));wt(e,o,s,i,a,u,r,n)}(this,n,Ne(r,1),o)}get locked(){if(!nt(this))throw Et("locked");return ot(this)}abort(e){return nt(this)?ot(this)?h(new TypeError("Cannot abort a stream that already has a writer")):st(this,e):h(Et("abort"))}close(){return nt(this)?ot(this)?h(new TypeError("Cannot close a stream that already has a writer")):ct(this)?h(new TypeError("Cannot close an already-closing stream")):it(this):h(Et("close"))}getWriter(){if(!nt(this))throw Et("getWriter");return tt(this)}}function tt(e){return new WritableStreamDefaultWriter(e)}function rt(e){e._state="writable",e._storedError=void 0,e._writer=void 0,e._writableStreamController=void 0,e._writeRequests=new SimpleQueue,e._inFlightWriteRequest=void 0,e._closeRequest=void 0,e._inFlightCloseRequest=void 0,e._pendingAbortRequest=void 0,e._backpressure=!1}function nt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function ot(e){return void 0!==e._writer}function st(e,t){var r;if("closed"===e._state||"errored"===e._state)return p(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort();const n=e._state;if("closed"===n||"errored"===n)return p(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let o=!1;"erroring"===n&&(o=!0,t=void 0);const s=f(((r,n)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:n,_reason:t,_wasAlreadyErroring:o}}));return e._pendingAbortRequest._promise=s,o||ut(e,t),s}function it(e){const t=e._state;if("closed"===t||"errored"===t)return h(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=f(((t,r)=>{const n={_resolve:t,_reject:r};e._closeRequest=n})),n=e._writer;var o;return void 0!==n&&e._backpressure&&"writable"===t&&It(n),de(o=e._writableStreamController,_t,0),Tt(o),r}function at(e,t){"writable"!==e._state?lt(e):ut(e,t)}function ut(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const n=e._writer;void 0!==n&&yt(n,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&<(e)}function lt(e){e._state="errored",e._writableStreamController[B]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new SimpleQueue,void 0===e._pendingAbortRequest)return void dt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void dt(e);y(e._writableStreamController[k](r._reason),(()=>{r._resolve(),dt(e)}),(t=>{r._reject(t),dt(e)}))}function ct(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function dt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&Dt(t,e._storedError)}function ft(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){xt(e)}(r):It(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStream.prototype,n.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(z(e,1,"WritableStreamDefaultWriter"),Xe(e,"First parameter"),ot(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ct(e)&&e._backpressure?xt(this):Ft(this),kt(this);else if("erroring"===t)Lt(this,e._storedError),kt(this);else if("closed"===t)Ft(this),kt(r=this),Wt(r);else{const t=e._storedError;Lt(this,t),Bt(this,t)}var r}get closed(){return pt(this)?this._closedPromise:h(jt("closed"))}get desiredSize(){if(!pt(this))throw jt("desiredSize");if(void 0===this._ownerWritableStream)throw At("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return Rt(t._writableStreamController)}(this)}get ready(){return pt(this)?this._readyPromise:h(jt("ready"))}abort(e){return pt(this)?void 0===this._ownerWritableStream?h(At("abort")):function(e,t){return st(e._ownerWritableStream,t)}(this,e):h(jt("abort"))}close(){if(!pt(this))return h(jt("close"));const e=this._ownerWritableStream;return void 0===e?h(At("close")):ct(e)?h(new TypeError("Cannot close an already-closing stream")):ht(this)}releaseLock(){if(!pt(this))throw jt("releaseLock");void 0!==this._ownerWritableStream&&mt(this)}write(e){return pt(this)?void 0===this._ownerWritableStream?h(At("write to")):gt(this,e):h(jt("write"))}}function pt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function ht(e){return it(e._ownerWritableStream)}function bt(e,t){"pending"===e._closedPromiseState?Dt(e,t):function(e,t){Bt(e,t)}(e,t)}function yt(e,t){"pending"===e._readyPromiseState?Mt(e,t):function(e,t){Lt(e,t)}(e,t)}function mt(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");yt(e,r),bt(e,r),t._writer=void 0,e._ownerWritableStream=void 0}function gt(e,t){const r=e._ownerWritableStream,n=r._writableStreamController,o=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return qt(e,t),1}}(n,t);if(r!==e._ownerWritableStream)return h(At("write to"));const s=r._state;if("errored"===s)return h(r._storedError);if(ct(r)||"closed"===s)return h(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===s)return h(r._storedError);const i=function(e){return f(((t,r)=>{const n={_resolve:t,_reject:r};e._writeRequests.push(n)}))}(r);return function(e,t,r){try{de(e,t,r)}catch(t){return void qt(e,t)}const n=e._controlledWritableStream;if(!ct(n)&&"writable"===n._state){ft(n,Pt(e))}Tt(e)}(n,t,o),i}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,n.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const _t={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!vt(this))throw Ot("abortReason");return this._abortReason}get signal(){if(!vt(this))throw Ot("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!vt(this))throw Ot("error");"writable"===this._controlledWritableStream._state&&Ct(this,e)}[k](e){const t=this._abortAlgorithm(e);return St(this),t}[B](){fe(this)}}function vt(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function wt(e,t,r,n,o,s,i,a){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._abortReason=void 0,t._abortController=function(){if(et)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=a,t._strategyHWM=i,t._writeAlgorithm=n,t._closeAlgorithm=o,t._abortAlgorithm=s;const u=Pt(t);ft(e,u);y(p(r()),(()=>{t._started=!0,Tt(t)}),(r=>{t._started=!0,at(e,r)}))}function St(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Rt(e){return e._strategyHWM-e._queueTotalSize}function Tt(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void lt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===_t?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ce(e);const r=e._closeAlgorithm();St(e),y(r,(()=>{!function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Wt(t)}(t)}),(e=>{!function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),at(e,t)}(t,e)}))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);y(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ce(e),!ct(r)&&"writable"===t){const t=Pt(e);ft(r,t)}Tt(e)}),(t=>{"writable"===r._state&&St(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,at(e,t)}(r,t)}))}(e,r)}function qt(e,t){"writable"===e._controlledWritableStream._state&&Ct(e,t)}function Pt(e){return Rt(e)<=0}function Ct(e,t){const r=e._controlledWritableStream;St(e),ut(r,t)}function Et(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function Ot(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function jt(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function At(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function kt(e){e._closedPromise=f(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function Bt(e,t){kt(e),Dt(e,t)}function Dt(e,t){void 0!==e._closedPromise_reject&&(v(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Wt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function xt(e){e._readyPromise=f(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function Lt(e,t){xt(e),Mt(e,t)}function Ft(e){xt(e),It(e)}function Mt(e,t){void 0!==e._readyPromise_reject&&(v(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function It(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{abortReason:{enumerable:!0},signal:{enumerable:!0},error:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,n.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const zt="undefined"!=typeof DOMException?DOMException:void 0;const $t=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(zt)?zt:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function Ut(e,t,r,n,s,i){const a=V(e),u=tt(t);e._disturbed=!0;let l=!1,c=p(void 0);return f(((d,_)=>{let w;if(void 0!==i){if(w=()=>{const r=new $t("Aborted","AbortError"),o=[];n||o.push((()=>"writable"===t._state?st(t,r):p(void 0))),s||o.push((()=>"readable"===e._state?pr(e,r):p(void 0))),E((()=>Promise.all(o.map((e=>e())))),!0,r)},i.aborted)return void w();i.addEventListener("abort",w)}var S,R,T;if(C(e,a._closedPromise,(e=>{n?O(!0,e):E((()=>st(t,e)),!0,e)})),C(t,u._closedPromise,(t=>{s?O(!0,t):E((()=>pr(e,t)),!0,t)})),S=e,R=a._closedPromise,T=()=>{r?O():E((()=>function(e){const t=e._ownerWritableStream,r=t._state;return ct(t)||"closed"===r?p(void 0):"errored"===r?h(t._storedError):ht(e)}(u)))},"closed"===S._state?T():m(R,T),ct(t)||"closed"===t._state){const t=new TypeError("the destination writable stream closed before all data could be piped to it");s?O(!0,t):E((()=>pr(e,t)),!0,t)}function q(){const e=c;return b(c,(()=>e!==c?q():void 0))}function C(e,t,r){"errored"===e._state?r(e._storedError):g(t,r)}function E(e,r,n){function o(){y(e(),(()=>j(r,n)),(e=>j(!0,e)))}l||(l=!0,"writable"!==t._state||ct(t)?o():m(q(),o))}function O(e,r){l||(l=!0,"writable"!==t._state||ct(t)?j(e,r):m(q(),(()=>j(e,r))))}function j(e,t){mt(u),P(a),void 0!==i&&i.removeEventListener("abort",w),e?_(t):d(void 0)}v(f(((e,t)=>{!function r(n){n?e():b(l?p(!0):b(u._readyPromise,(()=>f(((e,t)=>{X(a,{_chunkSteps:t=>{c=b(gt(u,t),void 0,o),e(!1)},_closeSteps:()=>e(!0),_errorSteps:t})})))),r,t)}(!1)})))}))}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Ht(this))throw er("desiredSize");return Kt(this)}close(){if(!Ht(this))throw er("close");if(!Zt(this))throw new TypeError("The stream is not in a state that permits close");Yt(this)}enqueue(e){if(!Ht(this))throw er("enqueue");if(!Zt(this))throw new TypeError("The stream is not in a state that permits enqueue");return Gt(this,e)}error(e){if(!Ht(this))throw er("error");Jt(this,e)}[D](e){fe(this);const t=this._cancelAlgorithm(e);return Vt(this),t}[W](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ce(this);this._closeRequested&&0===this._queue.length?(Vt(this),hr(t)):Nt(this),e._chunkSteps(r)}else Y(t,e),Nt(this)}}function Ht(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function Nt(e){if(!Qt(e))return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;y(e._pullAlgorithm(),(()=>{e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,Nt(e))}),(t=>{Jt(e,t)}))}function Qt(e){const t=e._controlledReadableStream;if(!Zt(e))return!1;if(!e._started)return!1;if(fr(t)&&J(t)>0)return!0;return Kt(e)>0}function Vt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Yt(e){if(!Zt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(Vt(e),hr(t))}function Gt(e,t){if(!Zt(e))return;const r=e._controlledReadableStream;if(fr(r)&&J(r)>0)G(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Jt(e,t),t}try{de(e,t,r)}catch(t){throw Jt(e,t),t}}Nt(e)}function Jt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(fe(e),Vt(e),br(r,t))}function Kt(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Zt(e){const t=e._controlledReadableStream._state;return!e._closeRequested&&"readable"===t}function Xt(e,t,r,n,o,s,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,fe(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=s,t._pullAlgorithm=n,t._cancelAlgorithm=o,e._readableStreamController=t;y(p(r()),(()=>{t._started=!0,Nt(t)}),(e=>{Jt(t,e)}))}function er(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function tr(e,t){return pe(e._readableStreamController)?function(e){let t,r,n,o,s,i=V(e),a=!1,u=!1,l=!1,c=!1,d=!1;const h=f((e=>{s=e}));function b(e){g(e._closedPromise,(t=>{e===i&&(je(n._readableStreamController,t),je(o._readableStreamController,t),c&&d||s(void 0))}))}function y(){$e(i)&&(P(i),i=V(e),b(i));X(i,{_chunkSteps:t=>{w((()=>{u=!1,l=!1;const r=t;let i=t;if(!c&&!d)try{i=le(t)}catch(t){return je(n._readableStreamController,t),je(o._readableStreamController,t),void s(pr(e,t))}c||Oe(n._readableStreamController,r),d||Oe(o._readableStreamController,i),a=!1,u?_():l&&v()}))},_closeSteps:()=>{a=!1,c||Ee(n._readableStreamController),d||Ee(o._readableStreamController),n._readableStreamController._pendingPullIntos.length>0&&Be(n._readableStreamController,0),o._readableStreamController._pendingPullIntos.length>0&&Be(o._readableStreamController,0),c&&d||s(void 0)},_errorSteps:()=>{a=!1}})}function m(t,r){Z(i)&&(P(i),i=Fe(e),b(i));const f=r?o:n,p=r?n:o;Ue(i,t,{_chunkSteps:t=>{w((()=>{u=!1,l=!1;const n=r?d:c;if(r?c:d)n||De(f._readableStreamController,t);else{let r;try{r=le(t)}catch(t){return je(f._readableStreamController,t),je(p._readableStreamController,t),void s(pr(e,t))}n||De(f._readableStreamController,t),Oe(p._readableStreamController,r)}a=!1,u?_():l&&v()}))},_closeSteps:e=>{a=!1;const t=r?d:c,n=r?c:d;t||Ee(f._readableStreamController),n||Ee(p._readableStreamController),void 0!==e&&(t||De(f._readableStreamController,e),!n&&p._readableStreamController._pendingPullIntos.length>0&&Be(p._readableStreamController,0)),t&&n||s(void 0)},_errorSteps:()=>{a=!1}})}function _(){if(a)return u=!0,p(void 0);a=!0;const e=Ae(n._readableStreamController);return null===e?y():m(e._view,!1),p(void 0)}function v(){if(a)return l=!0,p(void 0);a=!0;const e=Ae(o._readableStreamController);return null===e?y():m(e._view,!0),p(void 0)}function S(n){if(c=!0,t=n,d){const n=ie([t,r]),o=pr(e,n);s(o)}return h}function R(n){if(d=!0,r=n,c){const n=ie([t,r]),o=pr(e,n);s(o)}return h}function T(){}return n=lr(T,_,S),o=lr(T,v,R),b(i),[n,o]}(e):function(e,t){const r=V(e);let n,o,s,i,a,u=!1,l=!1,c=!1,d=!1;const h=f((e=>{a=e}));function b(){if(u)return l=!0,p(void 0);u=!0;return X(r,{_chunkSteps:e=>{w((()=>{l=!1;const t=e,r=e;c||Gt(s._readableStreamController,t),d||Gt(i._readableStreamController,r),u=!1,l&&b()}))},_closeSteps:()=>{u=!1,c||Yt(s._readableStreamController),d||Yt(i._readableStreamController),c&&d||a(void 0)},_errorSteps:()=>{u=!1}}),p(void 0)}function y(t){if(c=!0,n=t,d){const t=ie([n,o]),r=pr(e,t);a(r)}return h}function m(t){if(d=!0,o=t,c){const t=ie([n,o]),r=pr(e,t);a(r)}return h}function _(){}return s=ur(_,b,y),i=ur(_,b,m),g(r._closedPromise,(e=>{Jt(s._readableStreamController,e),Jt(i._readableStreamController,e),c&&d||a(void 0)})),[s,i]}(e)}function rr(e,t,r){return M(e,r),r=>R(e,t,[r])}function nr(e,t,r){return M(e,r),r=>R(e,t,[r])}function or(e,t,r){return M(e,r),r=>S(e,t,[r])}function sr(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function ir(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function ar(e,t){F(e,t);const r=null==e?void 0:e.preventAbort,n=null==e?void 0:e.preventCancel,o=null==e?void 0:e.preventClose,s=null==e?void 0:e.signal;return void 0!==s&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(s,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(n),preventClose:Boolean(o),signal:s}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,n.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:I(e,"First parameter");const r=Ve(t,"Second parameter"),n=function(e,t){F(e,t);const r=e,n=null==r?void 0:r.autoAllocateChunkSize,o=null==r?void 0:r.cancel,s=null==r?void 0:r.pull,i=null==r?void 0:r.start,a=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===n?void 0:N(n,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===o?void 0:rr(o,r,`${t} has member 'cancel' that`),pull:void 0===s?void 0:nr(s,r,`${t} has member 'pull' that`),start:void 0===i?void 0:or(i,r,`${t} has member 'start' that`),type:void 0===a?void 0:sr(a,`${t} has member 'type' that`)}}(e,"First parameter");if(cr(this),"bytes"===n.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");!function(e,t,r){const n=Object.create(ReadableByteStreamController.prototype);let o=()=>{},s=()=>p(void 0),i=()=>p(void 0);void 0!==t.start&&(o=()=>t.start(n)),void 0!==t.pull&&(s=()=>t.pull(n)),void 0!==t.cancel&&(i=e=>t.cancel(e));const a=t.autoAllocateChunkSize;if(0===a)throw new TypeError("autoAllocateChunkSize must be greater than 0");We(e,n,o,s,i,r,a)}(this,n,Ne(r,0))}else{const e=Qe(r);!function(e,t,r,n){const o=Object.create(ReadableStreamDefaultController.prototype);let s=()=>{},i=()=>p(void 0),a=()=>p(void 0);void 0!==t.start&&(s=()=>t.start(o)),void 0!==t.pull&&(i=()=>t.pull(o)),void 0!==t.cancel&&(a=e=>t.cancel(e)),Xt(e,o,s,i,a,r,n)}(this,n,Ne(r,1),e)}}get locked(){if(!dr(this))throw yr("locked");return fr(this)}cancel(e){return dr(this)?fr(this)?h(new TypeError("Cannot cancel a stream that already has a reader")):pr(this,e):h(yr("cancel"))}getReader(e){if(!dr(this))throw yr("getReader");return void 0===function(e,t){F(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:ir(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?V(this):Fe(this)}pipeThrough(e,t={}){if(!dr(this))throw yr("pipeThrough");z(e,1,"pipeThrough");const r=function(e,t){F(e,t);const r=null==e?void 0:e.readable;$(r,"readable","ReadableWritablePair"),Q(r,`${t} has member 'readable' that`);const n=null==e?void 0:e.writable;return $(n,"writable","ReadableWritablePair"),Xe(n,`${t} has member 'writable' that`),{readable:r,writable:n}}(e,"First parameter"),n=ar(t,"Second parameter");if(fr(this))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(ot(r.writable))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return v(Ut(this,r.writable,n.preventClose,n.preventAbort,n.preventCancel,n.signal)),r.readable}pipeTo(e,t={}){if(!dr(this))return h(yr("pipeTo"));if(void 0===e)return h("Parameter 1 is required in 'pipeTo'.");if(!nt(e))return h(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=ar(t,"Second parameter")}catch(e){return h(e)}return fr(this)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):ot(e)?h(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):Ut(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!dr(this))throw yr("tee");return ie(tr(this))}values(e){if(!dr(this))throw yr("values");return function(e,t){const r=V(e),n=new ReadableStreamAsyncIteratorImpl(r,t),o=Object.create(re);return o._asyncIteratorImpl=n,o}(this,function(e,t){F(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function ur(e,t,r,n=1,o=(()=>1)){const s=Object.create(ReadableStream.prototype);cr(s);return Xt(s,Object.create(ReadableStreamDefaultController.prototype),e,t,r,n,o),s}function lr(e,t,r){const n=Object.create(ReadableStream.prototype);cr(n);return We(n,Object.create(ReadableByteStreamController.prototype),e,t,r,0,void 0),n}function cr(e){e._state="readable",e._reader=void 0,e._storedError=void 0,e._disturbed=!1}function dr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function fr(e){return void 0!==e._reader}function pr(e,t){if(e._disturbed=!0,"closed"===e._state)return p(void 0);if("errored"===e._state)return h(e._storedError);hr(e);const r=e._reader;void 0!==r&&$e(r)&&(r._readIntoRequests.forEach((e=>{e._closeSteps(void 0)})),r._readIntoRequests=new SimpleQueue);return _(e._readableStreamController[D](t),o)}function hr(e){e._state="closed";const t=e._reader;void 0!==t&&(A(t),Z(t)&&(t._readRequests.forEach((e=>{e._closeSteps()})),t._readRequests=new SimpleQueue))}function br(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(j(r,t),Z(r)?(r._readRequests.forEach((e=>{e._errorSteps(t)})),r._readRequests=new SimpleQueue):(r._readIntoRequests.forEach((e=>{e._errorSteps(t)})),r._readIntoRequests=new SimpleQueue))}function yr(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function mr(e,t){F(e,t);const r=null==e?void 0:e.highWaterMark;return $(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:U(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ReadableStream.prototype,n.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof n.asyncIterator&&Object.defineProperty(ReadableStream.prototype,n.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const gr=e=>e.byteLength;Object.defineProperty(gr,"name",{value:"size",configurable:!0});class ByteLengthQueuingStrategy{constructor(e){z(e,1,"ByteLengthQueuingStrategy"),e=mr(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!vr(this))throw _r("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!vr(this))throw _r("size");return gr}}function _r(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function vr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,n.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const wr=()=>1;Object.defineProperty(wr,"name",{value:"size",configurable:!0});class CountQueuingStrategy{constructor(e){z(e,1,"CountQueuingStrategy"),e=mr(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!Rr(this))throw Sr("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!Rr(this))throw Sr("size");return wr}}function Sr(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function Rr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function Tr(e,t,r){return M(e,r),r=>R(e,t,[r])}function qr(e,t,r){return M(e,r),r=>S(e,t,[r])}function Pr(e,t,r){return M(e,r),(r,n)=>R(e,t,[r,n])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,n.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const n=Ve(t,"Second parameter"),o=Ve(r,"Third parameter"),s=function(e,t){F(e,t);const r=null==e?void 0:e.flush,n=null==e?void 0:e.readableType,o=null==e?void 0:e.start,s=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:Tr(r,e,`${t} has member 'flush' that`),readableType:n,start:void 0===o?void 0:qr(o,e,`${t} has member 'start' that`),transform:void 0===s?void 0:Pr(s,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==s.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==s.writableType)throw new RangeError("Invalid writableType specified");const i=Ne(o,0),a=Qe(o),u=Ne(n,1),l=Qe(n);let c;!function(e,t,r,n,o,s){function i(){return t}function a(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return _(e._backpressureChangePromise,(()=>{const n=e._writable;if("erroring"===n._state)throw n._storedError;return Dr(r,t)}))}return Dr(r,t)}(e,t)}function u(t){return function(e,t){return Er(e,t),p(void 0)}(e,t)}function l(){return function(e){const t=e._readable,r=e._transformStreamController,n=r._flushAlgorithm();return kr(r),_(n,(()=>{if("errored"===t._state)throw t._storedError;Yt(t._readableStreamController)}),(r=>{throw Er(e,r),t._storedError}))}(e)}function c(){return function(e){return jr(e,!1),e._backpressureChangePromise}(e)}function d(t){return Or(e,t),p(void 0)}e._writable=function(e,t,r,n,o=1,s=(()=>1)){const i=Object.create(WritableStream.prototype);return rt(i),wt(i,Object.create(WritableStreamDefaultController.prototype),e,t,r,n,o,s),i}(i,a,l,u,r,n),e._readable=ur(i,c,d,o,s),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,jr(e,!0),e._transformStreamController=void 0}(this,f((e=>{c=e})),u,l,i,a),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let n=e=>{try{return Br(r,e),p(void 0)}catch(e){return h(e)}},o=()=>p(void 0);void 0!==t.transform&&(n=e=>t.transform(e,r));void 0!==t.flush&&(o=()=>t.flush(r));!function(e,t,r,n){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=n}(e,r,n,o)}(this,s),void 0!==s.start?c(s.start(this._transformStreamController)):c(void 0)}get readable(){if(!Cr(this))throw xr("readable");return this._readable}get writable(){if(!Cr(this))throw xr("writable");return this._writable}}function Cr(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function Er(e,t){Jt(e._readable._readableStreamController,t),Or(e,t)}function Or(e,t){kr(e._transformStreamController),qt(e._writable._writableStreamController,t),e._backpressure&&jr(e,!1)}function jr(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=f((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(TransformStream.prototype,n.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!Ar(this))throw Wr("desiredSize");return Kt(this._controlledTransformStream._readable._readableStreamController)}enqueue(e){if(!Ar(this))throw Wr("enqueue");Br(this,e)}error(e){if(!Ar(this))throw Wr("error");var t;t=e,Er(this._controlledTransformStream,t)}terminate(){if(!Ar(this))throw Wr("terminate");!function(e){const t=e._controlledTransformStream;Yt(t._readable._readableStreamController);const r=new TypeError("TransformStream terminated");Or(t,r)}(this)}}function Ar(e){return!!i(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function kr(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function Br(e,t){const r=e._controlledTransformStream,n=r._readable._readableStreamController;if(!Zt(n))throw new TypeError("Readable side is not in a state that permits enqueue");try{Gt(n,t)}catch(e){throw Or(r,e),r._readable._storedError}const o=function(e){return!Qt(e)}(n);o!==r._backpressure&&jr(r,!0)}function Dr(e,t){return _(e._transformAlgorithm(t),void 0,(t=>{throw Er(e._controlledTransformStream,t),t}))}function Wr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function xr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),"symbol"==typeof n.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,n.toStringTag,{value:"TransformStreamDefaultController",configurable:!0})}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={id:n,loaded:!1,exports:{}};return e[n].call(s.exports,s,s.exports,r),s.loaded=!0,s.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var n=r(175);return n=n.default})()}));
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixLQUNqQyxJQUFJLElBQUk1aUIsS0FBTzRpQixFQUNYMHFCLEVBQW9CSyxFQUFFL3FCLEVBQVk1aUIsS0FBU3N0QyxFQUFvQkssRUFBRXZ3QyxFQUFTNEMsSUFDNUV2QyxPQUFPQyxlQUFlTixFQUFTNEMsRUFBSyxDQUFFdkIsWUFBWSxFQUFNTCxJQUFLd2tCLEVBQVc1aUIsTUNKM0VzdEMsRUFBb0JLLEVBQUksQ0FBQ3BpQyxFQUFLcWlDLElBQVVud0MsT0FBT2EsVUFBVTZ6QixlQUFlanpCLEtBQUtxTSxFQUFLcWlDLEdDQ2xGTixFQUFvQnhULEVBQUsxOEIsSUFDSCxvQkFBWHNCLFFBQTBCQSxPQUFPQyxhQUMxQ2xCLE9BQU9DLGVBQWVOLEVBQVNzQixPQUFPQyxZQUFhLENBQUVoQixNQUFPLFdBRTdERixPQUFPQyxlQUFlTixFQUFTLGFBQWMsQ0FBRU8sT0FBTyxLQ0x2RDJ2QyxFQUFvQk8sSUFBT3h3QyxJQUMxQkEsRUFBT3l3QyxNQUFRLEdBQ1Z6d0MsRUFBTzB3QyxXQUFVMXdDLEVBQU8wd0MsU0FBVyxJQUNqQzF3QyxHQ0FSLElBQUkyd0MsRUFBc0JWLEVBQW9CLHlCN0NPOUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2Fib3J0LWNvbnRyb2xsZXIvZGlzdC9hYm9ydC1jb250cm9sbGVyLmpzIiwid2VicGFjazovL21haWxndW4vLi9saWIvY2xpZW50LnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvZG9tYWlucy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnNDcmVkZW50aWFscy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2RvbWFpbnNUYWdzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvZG9tYWluc1RlbXBsYXRlcy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL2Vycm9yLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvZXZlbnRzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvZm9ybURhdGFCdWlsZGVyLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9pbnRlcmZhY2VzL1N1cHJlc3Npb25zLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvaXAtcG9vbHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9pcHMudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi9saXN0cy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL21haWxMaXN0TWVtYmVycy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL21lc3NhZ2VzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvbXVsdGlwbGVWYWxpZGF0aW9uLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvcmVxdWVzdC50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3JvdXRlcy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbGliL3N0YXRzLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvc3VwcHJlc3Npb25zLnRzIiwid2VicGFjazovL21haWxndW4vLi9saWIvdmFsaWRhdGUudHMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL2xpYi93ZWJob29rcy50cyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2Jhc2UtNjQvYmFzZTY0LmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvZGF0YS11cmktdG8tYnVmZmVyL2Rpc3Qvc3JjL2luZGV4LmpzIiwid2VicGFjazovL21haWxndW4vLi9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vZGlzdC9ldmVudC10YXJnZXQtc2hpbS5qcyIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL2ZldGNoLWJsb2IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9reS11bml2ZXJzYWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy9reS91bWQuanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy91cmwtam9pbi9saWIvdXJsLWpvaW4uanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiaHR0cFwiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBzXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwic3RyZWFtXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidXJsXCIiLCJ3ZWJwYWNrOi8vbWFpbGd1bi9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidXRpbFwiIiwid2VicGFjazovL21haWxndW4vZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInpsaWJcIiIsIndlYnBhY2s6Ly9tYWlsZ3VuLy4vbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvZGlzdC9pbmRleC5janMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi8uL25vZGVfbW9kdWxlcy93ZWItc3RyZWFtcy1wb2x5ZmlsbC9kaXN0L3BvbnlmaWxsLmVzMjAxOC5tanMiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vbWFpbGd1bi93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL21haWxndW4vd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9tYWlsZ3VuL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJtYWlsZ3VuXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIm1haWxndW5cIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIvKipcbiAqIEBhdXRob3IgVG9ydSBOYWdhc2hpbWEgPGh0dHBzOi8vZ2l0aHViLmNvbS9teXN0aWNhdGVhPlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBldmVudFRhcmdldFNoaW0gPSByZXF1aXJlKCdldmVudC10YXJnZXQtc2hpbScpO1xuXG4vKipcbiAqIFRoZSBzaWduYWwgY2xhc3MuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRzaWduYWxcbiAqL1xuY2xhc3MgQWJvcnRTaWduYWwgZXh0ZW5kcyBldmVudFRhcmdldFNoaW0uRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFib3J0U2lnbmFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBgQWJvcnRTaWduYWxgJ3MgYEFib3J0Q29udHJvbGxlcmAgaGFzIHNpZ25hbGVkIHRvIGFib3J0LCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGFib3J0ZWQgPSBhYm9ydGVkRmxhZ3MuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGFib3J0ZWQgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0U2lnbmFsJyBvYmplY3QsIGJ1dCBnb3QgJHt0aGlzID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdGhpc31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWJvcnRlZDtcbiAgICB9XG59XG5ldmVudFRhcmdldFNoaW0uZGVmaW5lRXZlbnRBdHRyaWJ1dGUoQWJvcnRTaWduYWwucHJvdG90eXBlLCBcImFib3J0XCIpO1xuLyoqXG4gKiBDcmVhdGUgYW4gQWJvcnRTaWduYWwgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBzaWduYWwgPSBPYmplY3QuY3JlYXRlKEFib3J0U2lnbmFsLnByb3RvdHlwZSk7XG4gICAgZXZlbnRUYXJnZXRTaGltLkV2ZW50VGFyZ2V0LmNhbGwoc2lnbmFsKTtcbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgZmFsc2UpO1xuICAgIHJldHVybiBzaWduYWw7XG59XG4vKipcbiAqIEFib3J0IGEgZ2l2ZW4gc2lnbmFsLlxuICovXG5mdW5jdGlvbiBhYm9ydFNpZ25hbChzaWduYWwpIHtcbiAgICBpZiAoYWJvcnRlZEZsYWdzLmdldChzaWduYWwpICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFib3J0ZWRGbGFncy5zZXQoc2lnbmFsLCB0cnVlKTtcbiAgICBzaWduYWwuZGlzcGF0Y2hFdmVudCh7IHR5cGU6IFwiYWJvcnRcIiB9KTtcbn1cbi8qKlxuICogQWJvcnRlZCBmbGFnIGZvciBlYWNoIGluc3RhbmNlcy5cbiAqL1xuY29uc3QgYWJvcnRlZEZsYWdzID0gbmV3IFdlYWtNYXAoKTtcbi8vIFByb3BlcnRpZXMgc2hvdWxkIGJlIGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBYm9ydFNpZ25hbC5wcm90b3R5cGUsIHtcbiAgICBhYm9ydGVkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbn0pO1xuLy8gYHRvU3RyaW5nKClgIHNob3VsZCByZXR1cm4gYFwiW29iamVjdCBBYm9ydFNpZ25hbF1cImBcbmlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gXCJzeW1ib2xcIikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBcIkFib3J0U2lnbmFsXCIsXG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIEFib3J0Q29udHJvbGxlci5cbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNhYm9ydGNvbnRyb2xsZXJcbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoaXMgY29udHJvbGxlci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc2lnbmFscy5zZXQodGhpcywgY3JlYXRlQWJvcnRTaWduYWwoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBBYm9ydFNpZ25hbGAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXQgc2lnbmFsKCkge1xuICAgICAgICByZXR1cm4gZ2V0U2lnbmFsKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydCBhbmQgc2lnbmFsIHRvIGFueSBvYnNlcnZlcnMgdGhhdCB0aGUgYXNzb2NpYXRlZCBhY3Rpdml0eSBpcyB0byBiZSBhYm9ydGVkLlxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICBhYm9ydFNpZ25hbChnZXRTaWduYWwodGhpcykpO1xuICAgIH1cbn1cbi8qKlxuICogQXNzb2NpYXRlZCBzaWduYWxzLlxuICovXG5jb25zdCBzaWduYWxzID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogR2V0IHRoZSBhc3NvY2lhdGVkIHNpZ25hbCBvZiBhIGdpdmVuIGNvbnRyb2xsZXIuXG4gKi9cbmZ1bmN0aW9uIGdldFNpZ25hbChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gc2lnbmFscy5nZXQoY29udHJvbGxlcik7XG4gICAgaWYgKHNpZ25hbCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICd0aGlzJyB0byBiZSBhbiAnQWJvcnRDb250cm9sbGVyJyBvYmplY3QsIGJ1dCBnb3QgJHtjb250cm9sbGVyID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgY29udHJvbGxlcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hbDtcbn1cbi8vIFByb3BlcnRpZXMgc2hvdWxkIGJlIGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgc2lnbmFsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBhYm9ydDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gXCJzeW1ib2xcIikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydENvbnRyb2xsZXJcIixcbiAgICB9KTtcbn1cblxuZXhwb3J0cy5BYm9ydENvbnRyb2xsZXIgPSBBYm9ydENvbnRyb2xsZXI7XG5leHBvcnRzLkFib3J0U2lnbmFsID0gQWJvcnRTaWduYWw7XG5leHBvcnRzLmRlZmF1bHQgPSBBYm9ydENvbnRyb2xsZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gQWJvcnRDb250cm9sbGVyXG5tb2R1bGUuZXhwb3J0cy5BYm9ydENvbnRyb2xsZXIgPSBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBBYm9ydENvbnRyb2xsZXJcbm1vZHVsZS5leHBvcnRzLkFib3J0U2lnbmFsID0gQWJvcnRTaWduYWxcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFib3J0LWNvbnRyb2xsZXIuanMubWFwXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvT3B0aW9ucyc7XG5pbXBvcnQgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9SZXF1ZXN0T3B0aW9ucyc7XG5cbmltcG9ydCBEb21haW5DbGllbnQgZnJvbSAnLi9kb21haW5zJztcbmltcG9ydCBFdmVudENsaWVudCBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgU3RhdHNDbGllbnQgZnJvbSAnLi9zdGF0cyc7XG5pbXBvcnQgU3VwcHJlc3Npb25DbGllbnQgZnJvbSAnLi9zdXBwcmVzc2lvbnMnO1xuaW1wb3J0IFdlYmhvb2tDbGllbnQgZnJvbSAnLi93ZWJob29rcyc7XG5pbXBvcnQgTWVzc2FnZXNDbGllbnQgZnJvbSAnLi9tZXNzYWdlcyc7XG5pbXBvcnQgUm91dGVzQ2xpZW50IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCBWYWxpZGF0ZUNsaWVudCBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBJcHNDbGllbnQgZnJvbSAnLi9pcHMnO1xuaW1wb3J0IElwUG9vbHNDbGllbnQgZnJvbSAnLi9pcC1wb29scyc7XG5pbXBvcnQgTGlzdHNDbGllbnQgZnJvbSAnLi9saXN0cyc7XG5pbXBvcnQgTWFpbExpc3RzTWVtYmVycyBmcm9tICcuL21haWxMaXN0TWVtYmVycyc7XG5pbXBvcnQgeyBJbnB1dEZvcm1EYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lGb3JtRGF0YSc7XG5pbXBvcnQgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQgZnJvbSAnLi9kb21haW5zQ3JlZGVudGlhbHMnO1xuaW1wb3J0IE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCBmcm9tICcuL211bHRpcGxlVmFsaWRhdGlvbic7XG5pbXBvcnQgRG9tYWluVGVtcGxhdGVzQ2xpZW50IGZyb20gJy4vZG9tYWluc1RlbXBsYXRlcyc7XG5pbXBvcnQgRG9tYWluVGFnc0NsaWVudCBmcm9tICcuL2RvbWFpbnNUYWdzJztcbmltcG9ydCB7IElNYWlsZ3VuQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNYWlsZ3VuQ2xpZW50JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50IGltcGxlbWVudHMgSU1haWxndW5DbGllbnQge1xuICBwcml2YXRlIHJlcXVlc3Q7XG5cbiAgcHVibGljIGRvbWFpbnM7XG4gIHB1YmxpYyB3ZWJob29rcztcbiAgcHVibGljIGV2ZW50cztcbiAgcHVibGljIHN0YXRzO1xuICBwdWJsaWMgc3VwcHJlc3Npb25zO1xuICBwdWJsaWMgbWVzc2FnZXM7XG4gIHB1YmxpYyByb3V0ZXM7XG4gIHB1YmxpYyB2YWxpZGF0ZTtcbiAgcHVibGljIGlwcztcbiAgcHVibGljIGlwX3Bvb2xzO1xuICBwdWJsaWMgbGlzdHM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucywgZm9ybURhdGE6IElucHV0Rm9ybURhdGEpIHtcbiAgICBjb25zdCBjb25maWc6IFJlcXVlc3RPcHRpb25zID0geyAuLi5vcHRpb25zIH0gYXMgUmVxdWVzdE9wdGlvbnM7XG5cbiAgICBpZiAoIWNvbmZpZy51cmwpIHtcbiAgICAgIGNvbmZpZy51cmwgPSAnaHR0cHM6Ly9hcGkubWFpbGd1bi5uZXQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciBcInVzZXJuYW1lXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIFwia2V5XCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3QoY29uZmlnLCBmb3JtRGF0YSk7XG4gICAgY29uc3QgbWFpbExpc3RzTWVtYmVycyA9IG5ldyBNYWlsTGlzdHNNZW1iZXJzKHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQgPSBuZXcgRG9tYWluQ3JlZGVudGlhbHNDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICBjb25zdCBkb21haW5UZW1wbGF0ZXNDbGllbnQgPSBuZXcgRG9tYWluVGVtcGxhdGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgZG9tYWluVGFnc0NsaWVudCA9IG5ldyBEb21haW5UYWdzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgY29uc3QgbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50ID0gbmV3IE11bHRpcGxlVmFsaWRhdGlvbkNsaWVudCh0aGlzLnJlcXVlc3QpO1xuXG4gICAgdGhpcy5kb21haW5zID0gbmV3IERvbWFpbkNsaWVudChcbiAgICAgIHRoaXMucmVxdWVzdCxcbiAgICAgIGRvbWFpbkNyZWRlbnRpYWxzQ2xpZW50LFxuICAgICAgZG9tYWluVGVtcGxhdGVzQ2xpZW50LFxuICAgICAgZG9tYWluVGFnc0NsaWVudFxuICAgICk7XG4gICAgdGhpcy53ZWJob29rcyA9IG5ldyBXZWJob29rQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRDbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLnN0YXRzID0gbmV3IFN0YXRzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5zdXBwcmVzc2lvbnMgPSBuZXcgU3VwcHJlc3Npb25DbGllbnQodGhpcy5yZXF1ZXN0KTtcbiAgICB0aGlzLm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5yb3V0ZXMgPSBuZXcgUm91dGVzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcHMgPSBuZXcgSXBzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5pcF9wb29scyA9IG5ldyBJcFBvb2xzQ2xpZW50KHRoaXMucmVxdWVzdCk7XG4gICAgdGhpcy5saXN0cyA9IG5ldyBMaXN0c0NsaWVudCh0aGlzLnJlcXVlc3QsIG1haWxMaXN0c01lbWJlcnMpO1xuICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgVmFsaWRhdGVDbGllbnQodGhpcy5yZXF1ZXN0LCBtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQpO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7XG4gIERvbWFpblJlc3BvbnNlRGF0YSxcbiAgRGVzdHJveWVkRG9tYWluUmVzcG9uc2UsXG4gIERvbWFpbnNRdWVyeSxcbiAgRG9tYWluSW5mbyxcbiAgRG9tYWluTGlzdFJlc3BvbnNlRGF0YSxcbiAgRG9tYWluU2hvcnREYXRhLFxuICBETlNSZWNvcmQsXG4gIENvbm5lY3Rpb25TZXR0aW5nc1Jlc3BvbnNlLFxuICBDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3MsXG4gIFVwZGF0ZWRDb25uZWN0aW9uU2V0dGluZ3NSZXMsXG4gIERLSU1BdXRob3JpdHlJbmZvLFxuICBVcGRhdGVkREtJTUF1dGhvcml0eSxcbiAgVXBkYXRlZERLSU1BdXRob3JpdHlSZXNwb25zZSxcbiAgREtJTVNlbGVjdG9ySW5mbyxcbiAgVXBkYXRlZERLSU1TZWxlY3RvclJlc3BvbnNlLFxuICBXZWJQcmVmaXhJbmZvLFxuICBVcGRhdGVkV2ViUHJlZml4UmVzcG9uc2UsXG4gIFJlcGxhY2VtZW50Rm9yUG9vbCxcbiAgTWVzc2FnZVJlc3BvbnNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWlucyc7XG5cbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIERvbWFpblRyYWNraW5nUmVzcG9uc2UsXG4gIERvbWFpblRyYWNraW5nRGF0YSxcbiAgT3BlblRyYWNraW5nSW5mbyxcbiAgQ2xpY2tUcmFja2luZ0luZm8sXG4gIFVuc3Vic2NyaWJlVHJhY2tpbmdJbmZvLFxuICBVcGRhdGVEb21haW5UcmFja2luZ1Jlc3BvbnNlLFxuICBVcGRhdGVkT3BlblRyYWNraW5nXG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UcmFja2luZyc7XG5pbXBvcnQgeyBJRG9tYWluQ3JlZGVudGlhbHMgfSBmcm9tICcuL2ludGVyZmFjZXMvRG9tYWluQ3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgSURvbWFpblRlbXBsYXRlc0NsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UZW1wbGF0ZXMnO1xuaW1wb3J0IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50IGZyb20gJy4vZG9tYWluc0NyZWRlbnRpYWxzJztcbmltcG9ydCBEb21haW5UZW1wbGF0ZXNDbGllbnQgZnJvbSAnLi9kb21haW5zVGVtcGxhdGVzJztcbmltcG9ydCB7IElEb21haW5UYWdzQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0RvbWFpblRhZ3MnO1xuaW1wb3J0IERvbWFpblRhZ3NDbGllbnQgZnJvbSAnLi9kb21haW5zVGFncyc7XG5cbmV4cG9ydCBjbGFzcyBEb21haW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHJlcXVpcmVfdGxzOiBib29sZWFuO1xuICBza2lwX3ZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgc3RhdGU6IHN0cmluZztcbiAgd2lsZGNhcmQ6IGJvb2xlYW47XG4gIHNwYW1fYWN0aW9uOiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgc210cF9wYXNzd29yZDogc3RyaW5nO1xuICBzbXRwX2xvZ2luOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgcmVjZWl2aW5nX2Ruc19yZWNvcmRzOiBETlNSZWNvcmRbXSB8IG51bGw7XG4gIHNlbmRpbmdfZG5zX3JlY29yZHM6IEROU1JlY29yZFtdIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBEb21haW5TaG9ydERhdGEsIHJlY2VpdmluZz86IEROU1JlY29yZFtdIHwgbnVsbCwgc2VuZGluZz86IEROU1JlY29yZFtdIHwgbnVsbCkge1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnJlcXVpcmVfdGxzID0gZGF0YS5yZXF1aXJlX3RscztcbiAgICB0aGlzLnNraXBfdmVyaWZpY2F0aW9uID0gZGF0YS5za2lwX3ZlcmlmaWNhdGlvbjtcbiAgICB0aGlzLnN0YXRlID0gZGF0YS5zdGF0ZTtcbiAgICB0aGlzLndpbGRjYXJkID0gZGF0YS53aWxkY2FyZDtcbiAgICB0aGlzLnNwYW1fYWN0aW9uID0gZGF0YS5zcGFtX2FjdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRfYXQgPSBkYXRhLmNyZWF0ZWRfYXQ7XG4gICAgdGhpcy5zbXRwX3Bhc3N3b3JkID0gZGF0YS5zbXRwX3Bhc3N3b3JkO1xuICAgIHRoaXMuc210cF9sb2dpbiA9IGRhdGEuc210cF9sb2dpbjtcbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICB0aGlzLnJlY2VpdmluZ19kbnNfcmVjb3JkcyA9IHJlY2VpdmluZyB8fCBudWxsO1xuICAgIHRoaXMuc2VuZGluZ19kbnNfcmVjb3JkcyA9IHNlbmRpbmcgfHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW5DbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuICBwdWJsaWMgZG9tYWluQ3JlZGVudGlhbHM6IElEb21haW5DcmVkZW50aWFscztcbiAgcHVibGljIGRvbWFpblRlbXBsYXRlczogSURvbWFpblRlbXBsYXRlc0NsaWVudDtcbiAgcHVibGljIGRvbWFpblRhZ3M6IElEb21haW5UYWdzQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ6IERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50LFxuICAgIGRvbWFpblRlbXBsYXRlc0NsaWVudDogRG9tYWluVGVtcGxhdGVzQ2xpZW50LFxuICAgIGRvbWFpblRhZ3NDbGllbnQ6IERvbWFpblRhZ3NDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmRvbWFpbkNyZWRlbnRpYWxzID0gZG9tYWluQ3JlZGVudGlhbHNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UZW1wbGF0ZXMgPSBkb21haW5UZW1wbGF0ZXNDbGllbnQ7XG4gICAgdGhpcy5kb21haW5UYWdzID0gZG9tYWluVGFnc0NsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlTWVzc2FnZShyZXNwb25zZTogRGVzdHJveWVkRG9tYWluUmVzcG9uc2UpIDogTWVzc2FnZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluTGlzdChyZXNwb25zZTogRG9tYWluTGlzdFJlc3BvbnNlRGF0YSk6IERvbWFpbltdIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keS5pdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBuZXcgRG9tYWluKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEb21haW4ocmVzcG9uc2U6IERvbWFpblJlc3BvbnNlRGF0YSk6IERvbWFpbiB7XG4gICAgcmV0dXJuIG5ldyBEb21haW4oXG4gICAgICByZXNwb25zZS5ib2R5LmRvbWFpbixcbiAgICAgIHJlc3BvbnNlLmJvZHkucmVjZWl2aW5nX2Ruc19yZWNvcmRzLFxuICAgICAgcmVzcG9uc2UuYm9keS5zZW5kaW5nX2Ruc19yZWNvcmRzXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVHJhY2tpbmdTZXR0aW5ncyhyZXNwb25zZTogRG9tYWluVHJhY2tpbmdSZXNwb25zZSkgOiBEb21haW5UcmFja2luZ0RhdGEge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5LnRyYWNraW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VUcmFja2luZ1VwZGF0ZShyZXNwb25zZTogVXBkYXRlRG9tYWluVHJhY2tpbmdSZXNwb25zZSkgOlVwZGF0ZWRPcGVuVHJhY2tpbmcge1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICB9XG5cbiAgbGlzdChxdWVyeT86IERvbWFpbnNRdWVyeSk6IFByb21pc2U8RG9tYWluW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCgnL3YzL2RvbWFpbnMnLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW5MaXN0KHJlcyBhcyBEb21haW5MaXN0UmVzcG9uc2VEYXRhKSk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcpIDogUHJvbWlzZTxEb21haW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3YzL2RvbWFpbnMvJHtkb21haW59YClcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW4ocmVzIGFzIERvbWFpblJlc3BvbnNlRGF0YSkpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IERvbWFpbkluZm8pIDogUHJvbWlzZTxEb21haW4+IHtcbiAgICBjb25zdCBwb3N0T2JqID0geyAuLi5kYXRhIH07XG4gICAgaWYgKCdmb3JjZV9ka2ltX2F1dGhvcml0eScgaW4gcG9zdE9iaiAmJiB0eXBlb2YgcG9zdE9iai5mb3JjZV9ka2ltX2F1dGhvcml0eSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBwb3N0T2JqLmZvcmNlX2RraW1fYXV0aG9yaXR5ID0gcG9zdE9iai50b1N0cmluZygpID09PSAndHJ1ZScgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRCgnL3YzL2RvbWFpbnMnLCBwb3N0T2JqKVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZURvbWFpbihyZXMgYXMgRG9tYWluUmVzcG9uc2VEYXRhKSk7XG4gIH1cblxuICB2ZXJpZnkoZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpbj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vdmVyaWZ5YClcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW4ocmVzIGFzIERvbWFpblJlc3BvbnNlRGF0YSkpO1xuICB9XG5cbiAgZGVzdHJveShkb21haW46IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92My9kb21haW5zLyR7ZG9tYWlufWApXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlTWVzc2FnZShyZXMgYXMgRGVzdHJveWVkRG9tYWluUmVzcG9uc2UpKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vY29ubmVjdGlvbmApXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBDb25uZWN0aW9uU2V0dGluZ3NSZXNwb25zZSlcbiAgICAgIC50aGVuKChyZXM6Q29ubmVjdGlvblNldHRpbmdzUmVzcG9uc2UpID0+IHJlcy5ib2R5LmNvbm5lY3Rpb24gYXMgQ29ubmVjdGlvblNldHRpbmdzKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbm5lY3Rpb24oZG9tYWluOiBzdHJpbmcsIGRhdGE6IENvbm5lY3Rpb25TZXR0aW5ncyk6IFByb21pc2U8VXBkYXRlZENvbm5lY3Rpb25TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KGAvdjMvZG9tYWlucy8ke2RvbWFpbn0vY29ubmVjdGlvbmAsIGRhdGEpXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzUmVzKVxuICAgICAgLnRoZW4oKHJlczpVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzUmVzKSA9PiByZXMuYm9keSBhcyBVcGRhdGVkQ29ubmVjdGlvblNldHRpbmdzKTtcbiAgfVxuXG4gIC8vIFRyYWNraW5nXG5cbiAgZ2V0VHJhY2tpbmcoZG9tYWluOiBzdHJpbmcpIDogUHJvbWlzZTxEb21haW5UcmFja2luZ0RhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3RyYWNraW5nJykpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVRyYWNraW5nU2V0dGluZ3MpO1xuICB9XG5cbiAgdXBkYXRlVHJhY2tpbmcoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGRhdGE6IE9wZW5UcmFja2luZ0luZm8gfCBDbGlja1RyYWNraW5nSW5mbyB8IFVuc3Vic2NyaWJlVHJhY2tpbmdJbmZvXG4gICk6IFByb21pc2U8VXBkYXRlZE9wZW5UcmFja2luZz4ge1xuICAgIGlmICh0eXBlb2YgZGF0YT8uYWN0aXZlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcih7IHN0YXR1czogNDAwLCBzdGF0dXNUZXh0OiAnUmVjZWl2ZWQgYm9vbGVhbiB2YWx1ZSBmb3IgYWN0aXZlIHByb3BlcnR5JywgYm9keTogeyBtZXNzYWdlOiAnUHJvcGVydHkgXCJhY3RpdmVcIiBtdXN0IGNvbnRhaW4gc3RyaW5nIHZhbHVlLicgfSB9IGFzIEFQSUVycm9yT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAndHJhY2tpbmcnLCB0eXBlKSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXMgOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VUcmFja2luZ1VwZGF0ZShyZXMgYXMgVXBkYXRlRG9tYWluVHJhY2tpbmdSZXNwb25zZSkpO1xuICB9XG5cbiAgLy8gSVBzXG5cbiAgZ2V0SXBzKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJykpXG4gICAgICAudGhlbigocmVzcG9uc2U6IEFQSVJlc3BvbnNlKSA9PiByZXNwb25zZT8uYm9keT8uaXRlbXMpO1xuICB9XG5cbiAgYXNzaWduSXAoZG9tYWluOiBzdHJpbmcsIGlwOiBzdHJpbmcpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJyksIHsgaXAgfSk7XG4gIH1cblxuICBkZWxldGVJcChkb21haW46IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ2lwcycsIGlwKSk7XG4gIH1cblxuICBsaW5rSXBQb29sKGRvbWFpbjogc3RyaW5nLCBwb29sX2lkOiBzdHJpbmcpOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnaXBzJyksIHsgcG9vbF9pZCB9KTtcbiAgfVxuXG4gIHVubGlua0lwUG9sbChkb21haW46IHN0cmluZywgcmVwbGFjZW1lbnQ6IFJlcGxhY2VtZW50Rm9yUG9vbCk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBsZXQgc2VhcmNoUGFyYW1zID0gJyc7XG4gICAgaWYgKHJlcGxhY2VtZW50LnBvb2xfaWQgJiYgcmVwbGFjZW1lbnQuaXApIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcihcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIHN0YXR1c1RleHQ6ICdUb28gbXVjaCBkYXRhIGZvciByZXBsYWNlbWVudCcsXG4gICAgICAgICAgYm9keTogeyBtZXNzYWdlOiAnUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHBvb2xfaWQgb3IgaXAgKG5vdCBib3RoKScgfVxuICAgICAgICB9IGFzIEFQSUVycm9yT3B0aW9uc1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50LnBvb2xfaWQpIHtcbiAgICAgIHNlYXJjaFBhcmFtcyA9IGA/cG9vbF9pZD0ke3JlcGxhY2VtZW50LnBvb2xfaWR9YDtcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50LmlwKSB7XG4gICAgICBzZWFyY2hQYXJhbXMgPSBgP2lwPSR7cmVwbGFjZW1lbnQuaXB9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICdpcHMnLCAnaXBfcG9vbCcsIHNlYXJjaFBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlREtJTUF1dGhvcml0eShkb21haW46IHN0cmluZywgZGF0YTogREtJTUF1dGhvcml0eUluZm8pOiBQcm9taXNlPFVwZGF0ZWRES0lNQXV0aG9yaXR5PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXQoYC92My9kb21haW5zLyR7ZG9tYWlufS9ka2ltX2F1dGhvcml0eWAsIHt9LCB7IHF1ZXJ5OiBgc2VsZj0ke2RhdGEuc2VsZn1gIH0pXG4gICAgICAudGhlbigocmVzIDogQVBJUmVzcG9uc2UpID0+IHJlcyBhcyBVcGRhdGVkREtJTUF1dGhvcml0eVJlc3BvbnNlKVxuICAgICAgLnRoZW4oKHJlcyA6IFVwZGF0ZWRES0lNQXV0aG9yaXR5UmVzcG9uc2UpID0+IHJlcy5ib2R5IGFzIFVwZGF0ZWRES0lNQXV0aG9yaXR5KTtcbiAgfVxuXG4gIHVwZGF0ZURLSU1TZWxlY3Rvcihkb21haW46IHN0cmluZywgZGF0YTogREtJTVNlbGVjdG9ySW5mbyk6IFByb21pc2U8VXBkYXRlZERLSU1TZWxlY3RvclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXQoYC92My9kb21haW5zLyR7ZG9tYWlufS9ka2ltX3NlbGVjdG9yYCwge30sIHsgcXVlcnk6IGBka2ltX3NlbGVjdG9yPSR7ZGF0YS5ka2ltU2VsZWN0b3J9YCB9KVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiByZXMgYXMgVXBkYXRlZERLSU1TZWxlY3RvclJlc3BvbnNlKTtcbiAgfVxuXG4gIHVwZGF0ZVdlYlByZWZpeChkb21haW46IHN0cmluZywgZGF0YTogV2ViUHJlZml4SW5mbyk6IFByb21pc2U8VXBkYXRlZFdlYlByZWZpeFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXQoYC92My9kb21haW5zLyR7ZG9tYWlufS93ZWJfcHJlZml4YCwge30sIHsgcXVlcnk6IGB3ZWJfcHJlZml4PSR7ZGF0YS53ZWJQcmVmaXh9YCB9KVxuICAgICAgLnRoZW4oKHJlcyA6IEFQSVJlc3BvbnNlKSA9PiByZXMgYXMgVXBkYXRlZFdlYlByZWZpeFJlc3BvbnNlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuaW1wb3J0IEFQSVJlc3BvbnNlIGZyb20gJy4vaW50ZXJmYWNlcy9BcGlSZXNwb25zZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5pbXBvcnQge1xuICBDcmVhdGVkVXBkYXRlZERvbWFpbkNyZWRlbnRpYWxzUmVzcG9uc2UsXG4gIERlbGV0ZWREb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlLFxuICBEb21haW5DcmVkZW50aWFscyxcbiAgRG9tYWluQ3JlZGVudGlhbHNMaXN0LFxuICBEb21haW5DcmVkZW50aWFsc1F1ZXJ5LFxuICBEb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlRGF0YSxcbiAgRG9tYWluQ3JlZGVudGlhbHNSZXN1bHQsXG4gIElEb21haW5DcmVkZW50aWFscyxcbiAgVXBkYXRlRG9tYWluQ3JlZGVudGlhbHNEYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5DcmVkZW50aWFscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbWFpbkNyZWRlbnRpYWxzQ2xpZW50IGltcGxlbWVudHMgSURvbWFpbkNyZWRlbnRpYWxzIHtcbiAgYmFzZVJvdXRlOiBzdHJpbmc7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgdGhpcy5iYXNlUm91dGUgPSAnL3YzL2RvbWFpbnMvJztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRG9tYWluQ3JlZGVudGlhbHNMaXN0KFxuICAgIHJlc3BvbnNlOiBEb21haW5DcmVkZW50aWFsc1Jlc3BvbnNlRGF0YVxuICApOiBEb21haW5DcmVkZW50aWFsc0xpc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcmVzcG9uc2UuYm9keS5pdGVtcyxcbiAgICAgIHRvdGFsQ291bnQ6IHJlc3BvbnNlLmJvZHkudG90YWxfY291bnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VNZXNzYWdlUmVzcG9uc2UoXG4gICAgcmVzcG9uc2U6IENyZWF0ZWRVcGRhdGVkRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZVxuICApOiBEb21haW5DcmVkZW50aWFsc1Jlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2VcbiAgICB9IGFzIERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZURlbGV0ZWRSZXNwb25zZShcbiAgICByZXNwb25zZTpEZWxldGVkRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZVxuICApOiBEb21haW5DcmVkZW50aWFsc1Jlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICBzcGVjOiByZXNwb25zZS5ib2R5LnNwZWNcbiAgICB9IGFzIERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGxpc3QoZG9tYWluOiBzdHJpbmcsIHF1ZXJ5PzogRG9tYWluQ3JlZGVudGlhbHNRdWVyeSk6IFByb21pc2U8RG9tYWluQ3JlZGVudGlhbHNMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL2NyZWRlbnRpYWxzJyksIHF1ZXJ5KVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZURvbWFpbkNyZWRlbnRpYWxzTGlzdChyZXMgYXMgRG9tYWluQ3JlZGVudGlhbHNSZXNwb25zZURhdGEpXG4gICAgICApO1xuICB9XG5cbiAgY3JlYXRlKFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIGRhdGE6IERvbWFpbkNyZWRlbnRpYWxzXG4gICk6IFByb21pc2U8RG9tYWluQ3JlZGVudGlhbHNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9JHtkb21haW59L2NyZWRlbnRpYWxzYCwgZGF0YSlcbiAgICAgIC50aGVuKChyZXM6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZU1lc3NhZ2VSZXNwb25zZShyZXMpKTtcbiAgfVxuXG4gIHVwZGF0ZShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBjcmVkZW50aWFsc0xvZ2luOiBzdHJpbmcsXG4gICAgZGF0YTogVXBkYXRlRG9tYWluQ3JlZGVudGlhbHNEYXRhXG4gICk6IFByb21pc2U8RG9tYWluQ3JlZGVudGlhbHNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0ke2RvbWFpbn0vY3JlZGVudGlhbHMvJHtjcmVkZW50aWFsc0xvZ2lufWAsIGRhdGEpXG4gICAgICAudGhlbigocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VNZXNzYWdlUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBkZXN0cm95KFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzTG9naW46IHN0cmluZ1xuICApOiBQcm9taXNlPERvbWFpbkNyZWRlbnRpYWxzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYCR7dGhpcy5iYXNlUm91dGV9JHtkb21haW59L2NyZWRlbnRpYWxzLyR7Y3JlZGVudGlhbHNMb2dpbn1gKVxuICAgICAgLnRoZW4oKHJlczogQVBJUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlRGVsZXRlZFJlc3BvbnNlKHJlcykpO1xuICB9XG59XG4iLCJpbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQgQVBJUmVzcG9uc2UgZnJvbSAnLi9pbnRlcmZhY2VzL0FwaVJlc3BvbnNlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbmltcG9ydCB7XG4gIERvbWFpblRhZ0FQSVJlc3BvbnNlU3RhdHNJdGVtLFxuICBEb21haW5UYWdDb3VudHJpZXNBZ2dyZWdhdGlvbixcbiAgRG9tYWluVGFnQ291bnRyaWVzQVBJUmVzcG9uc2UsXG4gIERvbWFpblRhZ0RldmljZXNBZ2dyZWdhdGlvbixcbiAgRG9tYWluVGFnRGV2aWNlc0FQSVJlc3BvbnNlLFxuICBEb21haW5UYWdQcm92aWRlcnNBZ2dyZWdhdGlvbixcbiAgRG9tYWluVGFnUHJvdmlkZXJzQVBJUmVzcG9uc2UsXG4gIERvbWFpblRhZ3NJdGVtLFxuICBEb21haW5UYWdzSXRlbUluZm8sXG4gIERvbWFpblRhZ3NMaXN0LFxuICBEb21haW5UYWdzTWVzc2FnZVJlcyxcbiAgRG9tYWluVGFnc1F1ZXJ5LFxuICBEb21haW5UYWdzUmVzcG9uc2VEYXRhLFxuICBEb21haW5UYWdzU3RhdGlzdGljUXVlcnksXG4gIERvbWFpblRhZ1N0YXRBUElSZXNwb25zZSxcbiAgRG9tYWluVGFnU3RhdGlzdGljSXRlbSxcbiAgRG9tYWluVGFnU3RhdGlzdGljUmVzdWx0LFxuICBJRG9tYWluVGFnc0NsaWVudCxcbiAgUGFnZXNMaXN0LFxuICBQYWdlc0xpc3RBY2N1bXVsYXRvcixcbiAgUGFyc2VkUGFnZXNMaXN0LFxuICBSZXNvbHV0aW9uXG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UYWdzJztcblxuZXhwb3J0IGNsYXNzIERvbWFpblRhZyBpbXBsZW1lbnRzIERvbWFpblRhZ3NJdGVtIHtcbiAgdGFnOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICdmaXJzdC1zZWVuJzogRGF0ZTtcbiAgJ2xhc3Qtc2Vlbic6IERhdGU7XG5cbiAgY29uc3RydWN0b3IodGFnSW5mbzogRG9tYWluVGFnc0l0ZW1JbmZvKSB7XG4gICAgdGhpcy50YWcgPSB0YWdJbmZvLnRhZztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gdGFnSW5mby5kZXNjcmlwdGlvbjtcbiAgICB0aGlzWydmaXJzdC1zZWVuJ10gPSBuZXcgRGF0ZSh0YWdJbmZvWydmaXJzdC1zZWVuJ10pO1xuICAgIHRoaXNbJ2xhc3Qtc2VlbiddID0gbmV3IERhdGUodGFnSW5mb1snbGFzdC1zZWVuJ10pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb21haW5UYWdTdGF0aXN0aWMgaW1wbGVtZW50cyBEb21haW5UYWdTdGF0aXN0aWNSZXN1bHQge1xuICB0YWc6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhcnQ6IERhdGU7XG4gIGVuZDogRGF0ZTtcbiAgcmVzb2x1dGlvbjogUmVzb2x1dGlvbjtcbiAgc3RhdHM6IERvbWFpblRhZ1N0YXRpc3RpY0l0ZW1bXTtcblxuICBjb25zdHJ1Y3Rvcih0YWdTdGF0aXN0aWNJbmZvOiBEb21haW5UYWdTdGF0QVBJUmVzcG9uc2UpIHtcbiAgICB0aGlzLnRhZyA9IHRhZ1N0YXRpc3RpY0luZm8uYm9keS50YWc7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRhZ1N0YXRpc3RpY0luZm8uYm9keS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnN0YXJ0ID0gbmV3IERhdGUodGFnU3RhdGlzdGljSW5mby5ib2R5LnN0YXJ0KTtcbiAgICB0aGlzLmVuZCA9IG5ldyBEYXRlKHRhZ1N0YXRpc3RpY0luZm8uYm9keS5lbmQpO1xuICAgIHRoaXMucmVzb2x1dGlvbiA9IHRhZ1N0YXRpc3RpY0luZm8uYm9keS5yZXNvbHV0aW9uO1xuICAgIHRoaXMuc3RhdHMgPSB0YWdTdGF0aXN0aWNJbmZvLmJvZHkuc3RhdHMubWFwKGZ1bmN0aW9uIChzdGF0OiBEb21haW5UYWdBUElSZXNwb25zZVN0YXRzSXRlbSkge1xuICAgICAgY29uc3QgcmVzID0geyAuLi5zdGF0LCB0aW1lOiBuZXcgRGF0ZShzdGF0LnRpbWUpIH07XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbWFpblRhZ3NDbGllbnQgaW1wbGVtZW50cyBJRG9tYWluVGFnc0NsaWVudCB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuYmFzZVJvdXRlID0gJy92My8nO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VQYWdlTGlua3MocmVzcG9uc2U6IERvbWFpblRhZ3NSZXNwb25zZURhdGEpOiBQYXJzZWRQYWdlc0xpc3Qge1xuICAgIGNvbnN0IHBhZ2VzID0gT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuYm9keS5wYWdpbmcgYXMgUGFnZXNMaXN0KTtcbiAgICByZXR1cm4gcGFnZXMucmVkdWNlKFxuICAgICAgKGFjYzogUGFnZXNMaXN0QWNjdW11bGF0b3IsIGVudHJpZTogW3VybDogc3RyaW5nLCBpZDogc3RyaW5nXSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGVudHJpZVswXTtcbiAgICAgICAgY29uc3QgdXJsID0gZW50cmllWzFdO1xuICAgICAgICBhY2NbaWRdID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHVybFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApIGFzIHVua25vd24gYXMgUGFyc2VkUGFnZXNMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VEb21haW5UYWdzTGlzdChcbiAgICByZXNwb25zZTogRG9tYWluVGFnc1Jlc3BvbnNlRGF0YVxuICApOiBEb21haW5UYWdzTGlzdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiByZXNwb25zZS5ib2R5Lml0ZW1zLm1hcCgodGFnSW5mbykgPT4gbmV3IERvbWFpblRhZyh0YWdJbmZvKSksXG4gICAgICBwYWdlczogdGhpcy5fcGFyc2VQYWdlTGlua3MocmVzcG9uc2UpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVGFnU3RhdGlzdGljKFxuICAgIHJlc3BvbnNlOiBEb21haW5UYWdTdGF0QVBJUmVzcG9uc2VcbiAgKTogRG9tYWluVGFnU3RhdGlzdGljIHtcbiAgICByZXR1cm4gbmV3IERvbWFpblRhZ1N0YXRpc3RpYyhyZXNwb25zZSk7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IERvbWFpblRhZ3NRdWVyeSk6IFByb21pc2U8RG9tYWluVGFnc0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VEb21haW5UYWdzTGlzdChyZXMgYXMgRG9tYWluVGFnc1Jlc3BvbnNlRGF0YSlcbiAgICAgICk7XG4gIH1cblxuICBnZXQoZG9tYWluOiBzdHJpbmcsIHRhZzogc3RyaW5nKTogUHJvbWlzZTxEb21haW5UYWdzSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90YWdzJywgdGFnKSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gbmV3IERvbWFpblRhZyhyZXMuYm9keSlcbiAgICAgICk7XG4gIH1cblxuICB1cGRhdGUoZG9tYWluOiBzdHJpbmcsIHRhZzogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTxEb21haW5UYWdzTWVzc2FnZVJlcz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90YWdzJywgdGFnKSwgZGVzY3JpcHRpb24pXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQVBJUmVzcG9uc2UpID0+IHJlcy5ib2R5IGFzIERvbWFpblRhZ3NNZXNzYWdlUmVzXG4gICAgICApO1xuICB9XG5cbiAgZGVzdHJveShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZ1xuICApOiBQcm9taXNlPERvbWFpblRhZ3NNZXNzYWdlUmVzPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYCR7dGhpcy5iYXNlUm91dGV9JHtkb21haW59L3RhZ3MvJHt0YWd9YClcbiAgICAgIC50aGVuKChyZXM6IEFQSVJlc3BvbnNlKSA9PiAoXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiByZXMuYm9keS5tZXNzYWdlLFxuICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1c1xuICAgICAgICB9IGFzIERvbWFpblRhZ3NNZXNzYWdlUmVzKSk7XG4gIH1cblxuICBzdGF0aXN0aWMoZG9tYWluOiBzdHJpbmcsIHRhZzogc3RyaW5nLCBxdWVyeTogRG9tYWluVGFnc1N0YXRpc3RpY1F1ZXJ5KVxuICAgIDogUHJvbWlzZTxEb21haW5UYWdTdGF0aXN0aWM+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZywgJ3N0YXRzJyksIHF1ZXJ5KVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IEFQSVJlc3BvbnNlKSA9PiB0aGlzLl9wYXJzZVRhZ1N0YXRpc3RpYyhyZXMpXG4gICAgICApO1xuICB9XG5cbiAgY291bnRyaWVzKGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGFnQ291bnRyaWVzQWdncmVnYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZywgJ3N0YXRzL2FnZ3JlZ2F0ZXMvY291bnRyaWVzJykpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogRG9tYWluVGFnQ291bnRyaWVzQVBJUmVzcG9uc2UpID0+IHJlcy5ib2R5IGFzIERvbWFpblRhZ0NvdW50cmllc0FnZ3JlZ2F0aW9uXG4gICAgICApO1xuICB9XG5cbiAgcHJvdmlkZXJzKGRvbWFpbjogc3RyaW5nLCB0YWc6IHN0cmluZyk6IFByb21pc2U8RG9tYWluVGFnUHJvdmlkZXJzQWdncmVnYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGFncycsIHRhZywgJ3N0YXRzL2FnZ3JlZ2F0ZXMvcHJvdmlkZXJzJykpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogRG9tYWluVGFnUHJvdmlkZXJzQVBJUmVzcG9uc2UpID0+IHJlcy5ib2R5IGFzIERvbWFpblRhZ1Byb3ZpZGVyc0FnZ3JlZ2F0aW9uXG4gICAgICApO1xuICB9XG5cbiAgZGV2aWNlcyhkb21haW46IHN0cmluZywgdGFnOiBzdHJpbmcpOiBQcm9taXNlPERvbWFpblRhZ0RldmljZXNBZ2dyZWdhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90YWdzJywgdGFnLCAnc3RhdHMvYWdncmVnYXRlcy9kZXZpY2VzJykpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogRG9tYWluVGFnRGV2aWNlc0FQSVJlc3BvbnNlKSA9PiByZXMuYm9keSBhcyBEb21haW5UYWdEZXZpY2VzQWdncmVnYXRpb25cbiAgICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuaW1wb3J0IHtcbiAgQ3JlYXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSxcbiAgQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UsXG4gIENyZWF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCxcbiAgRG9tYWluVGVtcGxhdGUsIERvbWFpblRlbXBsYXRlRGF0YSxcbiAgRG9tYWluVGVtcGxhdGVzUXVlcnksXG4gIERvbWFpblRlbXBsYXRlVXBkYXRlRGF0YSxcbiAgRG9tYWluVGVtcGxhdGVVcGRhdGVWZXJzaW9uRGF0YSxcbiAgRG9tYWluVGVtcGxhdGVWZXJzaW9uRGF0YSxcbiAgR2V0RG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSxcbiAgSURvbWFpblRlbXBsYXRlc0NsaWVudCxcbiAgTGlzdERvbWFpblRlbXBsYXRlc0FQSVJlc3BvbnNlLFxuICBMaXN0RG9tYWluVGVtcGxhdGVzUmVzdWx0LFxuICBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc0FQSVJlc3BvbnNlLFxuICBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc1Jlc3VsdCxcbiAgTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UsXG4gIE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCxcbiAgTm90aWZpY2F0aW9uQVBJUmVzcG9uc2UsXG4gIE5vdGlmaWNhdGlvblJlc3VsdCxcbiAgU2hvcnRUZW1wbGF0ZVZlcnNpb24sXG4gIFRlbXBsYXRlUXVlcnksXG4gIFRlbXBsYXRlVmVyc2lvbixcbiAgVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlLFxuICBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlUmVzdWx0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9Eb21haW5UZW1wbGF0ZXMnO1xuXG5leHBvcnQgY2xhc3MgRG9tYWluVGVtcGxhdGVJdGVtIGltcGxlbWVudHMgRG9tYWluVGVtcGxhdGUge1xuICBuYW1lIDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbiA6IHN0cmluZztcbiAgY3JlYXRlZEF0IDogRGF0ZSB8ICcnO1xuICBjcmVhdGVkQnkgOiBzdHJpbmc7XG4gIGlkIDogc3RyaW5nO1xuICB2ZXJzaW9uPzogVGVtcGxhdGVWZXJzaW9uO1xuICB2ZXJzaW9ucz86IFNob3J0VGVtcGxhdGVWZXJzaW9uW107XG5cbiAgY29uc3RydWN0b3IoZG9tYWluVGVtcGxhdGVGcm9tQVBJOiBEb21haW5UZW1wbGF0ZSkge1xuICAgIHRoaXMubmFtZSA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS5uYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuZGVzY3JpcHRpb247XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkb21haW5UZW1wbGF0ZUZyb21BUEkuY3JlYXRlZEF0ID8gbmV3IERhdGUoZG9tYWluVGVtcGxhdGVGcm9tQVBJLmNyZWF0ZWRBdCkgOiAnJztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS5jcmVhdGVkQnk7XG4gICAgdGhpcy5pZCA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS5pZDtcblxuICAgIGlmIChkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbikge1xuICAgICAgdGhpcy52ZXJzaW9uID0gZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb247XG4gICAgICBpZiAoZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb24uY3JlYXRlZEF0KSB7XG4gICAgICAgIHRoaXMudmVyc2lvbi5jcmVhdGVkQXQgPSBuZXcgRGF0ZShkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbi5jcmVhdGVkQXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb21haW5UZW1wbGF0ZUZyb21BUEkudmVyc2lvbnMgJiYgZG9tYWluVGVtcGxhdGVGcm9tQVBJLnZlcnNpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9ucyA9IGRvbWFpblRlbXBsYXRlRnJvbUFQSS52ZXJzaW9ucy5tYXAoKHZlcnNpb24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyAuLi52ZXJzaW9uIH07XG4gICAgICAgIHJlc3VsdC5jcmVhdGVkQXQgPSBuZXcgRGF0ZSh2ZXJzaW9uLmNyZWF0ZWRBdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tYWluVGVtcGxhdGVzQ2xpZW50IGltcGxlbWVudHMgSURvbWFpblRlbXBsYXRlc0NsaWVudCB7XG4gIGJhc2VSb3V0ZTogc3RyaW5nO1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuYmFzZVJvdXRlID0gJy92My8nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUNyZWF0aW9uUmVzcG9uc2UoZGF0YTogQ3JlYXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSk6IERvbWFpblRlbXBsYXRlSXRlbSB7XG4gICAgcmV0dXJuIG5ldyBEb21haW5UZW1wbGF0ZUl0ZW0oZGF0YS5ib2R5LnRlbXBsYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDcmVhdGlvblZlcnNpb25SZXNwb25zZShcbiAgICBkYXRhOiBDcmVhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25BUElSZXNwb25zZVxuICApOiBDcmVhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0ID0ge30gYXMgQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0O1xuICAgIHJlc3VsdC5zdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICByZXN1bHQubWVzc2FnZSA9IGRhdGEuYm9keS5tZXNzYWdlO1xuICAgIGlmIChkYXRhLmJvZHkgJiYgZGF0YS5ib2R5LnRlbXBsYXRlKSB7XG4gICAgICByZXN1bHQudGVtcGxhdGUgPSBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKGRhdGEuYm9keS50ZW1wbGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTXV0YXRpb25SZXNwb25zZShcbiAgICBkYXRhOiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2VcbiAgKTogVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBVcGRhdGVPckRlbGV0ZURvbWFpblRlbXBsYXRlUmVzdWx0ID0ge30gYXMgVXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdDtcbiAgICByZXN1bHQuc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBkYXRhLmJvZHkubWVzc2FnZTtcbiAgICBpZiAoZGF0YS5ib2R5ICYmIGRhdGEuYm9keS50ZW1wbGF0ZSkge1xuICAgICAgcmVzdWx0LnRlbXBsYXRlTmFtZSA9IGRhdGEuYm9keS50ZW1wbGF0ZS5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU5vdGlmaWNhdGlvblJlc3BvbnNlKGRhdGE6IE5vdGlmaWNhdGlvbkFQSVJlc3BvbnNlKTogTm90aWZpY2F0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQ6IE5vdGlmaWNhdGlvblJlc3VsdCA9IHt9IGFzIE5vdGlmaWNhdGlvblJlc3VsdDtcbiAgICByZXN1bHQuc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBkYXRhLmJvZHkubWVzc2FnZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU11dGF0ZVRlbXBsYXRlVmVyc2lvblJlc3BvbnNlKFxuICAgIGRhdGE6IE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvbkFQSVJlc3BvbnNlXG4gICk6IE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQgPSB7fSBhcyBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25SZXN1bHQ7XG4gICAgcmVzdWx0LnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJlc3VsdC5tZXNzYWdlID0gZGF0YS5ib2R5Lm1lc3NhZ2U7XG4gICAgaWYgKGRhdGEuYm9keS50ZW1wbGF0ZSkge1xuICAgICAgcmVzdWx0LnRlbXBsYXRlTmFtZSA9IGRhdGEuYm9keS50ZW1wbGF0ZS5uYW1lO1xuICAgICAgcmVzdWx0LnRlbXBsYXRlVmVyc2lvbiA9IHsgdGFnOiBkYXRhLmJvZHkudGVtcGxhdGUudmVyc2lvbi50YWcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VMaXN0KHJlc3BvbnNlOiBMaXN0RG9tYWluVGVtcGxhdGVzQVBJUmVzcG9uc2UpOiBMaXN0RG9tYWluVGVtcGxhdGVzUmVzdWx0IHtcbiAgICBjb25zdCBkYXRhID0ge30gYXMgTGlzdERvbWFpblRlbXBsYXRlc1Jlc3VsdDtcblxuICAgIGRhdGEuaXRlbXMgPSByZXNwb25zZS5ib2R5Lml0ZW1zLm1hcCgoZDogRG9tYWluVGVtcGxhdGUpID0+IG5ldyBEb21haW5UZW1wbGF0ZUl0ZW0oZCkpO1xuXG4gICAgZGF0YS5wYWdlcyA9IHJlc3BvbnNlLmJvZHkucGFnaW5nO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTGlzdFRlbXBsYXRlVmVyc2lvbnMoXG4gICAgcmVzcG9uc2U6IExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zQVBJUmVzcG9uc2VcbiAgKTogTGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQge1xuICAgIGNvbnN0IGRhdGEgPSB7fSBhcyBMaXN0RG9tYWluVGVtcGxhdGVWZXJzaW9uc1Jlc3VsdDtcblxuICAgIGRhdGEudGVtcGxhdGUgPSBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKHJlc3BvbnNlLmJvZHkudGVtcGxhdGUpO1xuXG4gICAgZGF0YS5wYWdlcyA9IHJlc3BvbnNlLmJvZHkucGFnaW5nO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBsaXN0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IERvbWFpblRlbXBsYXRlc1F1ZXJ5KTogUHJvbWlzZTxMaXN0RG9tYWluVGVtcGxhdGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZUxpc3QocmVzKVxuICAgICAgKTtcbiAgfVxuXG4gIGdldChkb21haW46IHN0cmluZywgdGVtcGxhdGVOYW1lOiBzdHJpbmcsIHF1ZXJ5PzogVGVtcGxhdGVRdWVyeSk6IFByb21pc2U8RG9tYWluVGVtcGxhdGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcy8nLCB0ZW1wbGF0ZU5hbWUpLCBxdWVyeSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzOiBHZXREb21haW5UZW1wbGF0ZUFQSVJlc3BvbnNlKSA9PiBuZXcgRG9tYWluVGVtcGxhdGVJdGVtKHJlcy5ib2R5LnRlbXBsYXRlKVxuICAgICAgKTtcbiAgfVxuXG4gIGNyZWF0ZShcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5UZW1wbGF0ZURhdGFcbiAgKTogUHJvbWlzZTxEb21haW5UZW1wbGF0ZUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcycpLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlczogQ3JlYXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZUNyZWF0aW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICB1cGRhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRG9tYWluVGVtcGxhdGVVcGRhdGVEYXRhXG4gICk6IFByb21pc2U8VXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lKSwgZGF0YSlcbiAgICAgIC50aGVuKChyZXM6IFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU11dGF0aW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBkZXN0cm95KGRvbWFpbjogc3RyaW5nLCB0ZW1wbGF0ZU5hbWU6IHN0cmluZyk6IFByb21pc2U8VXBkYXRlT3JEZWxldGVEb21haW5UZW1wbGF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lKSlcbiAgICAgIC50aGVuKChyZXM6IFVwZGF0ZU9yRGVsZXRlRG9tYWluVGVtcGxhdGVBUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU11dGF0aW9uUmVzcG9uc2UocmVzKSk7XG4gIH1cblxuICBkZXN0cm95QWxsKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTxOb3RpZmljYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmRlbGV0ZSh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzJykpXG4gICAgICAudGhlbigocmVzOiBOb3RpZmljYXRpb25BUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU5vdGlmaWNhdGlvblJlc3BvbnNlKHJlcykpO1xuICB9XG5cbiAgY3JlYXRlVmVyc2lvbihcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5UZW1wbGF0ZVZlcnNpb25EYXRhXG4gICk6IFByb21pc2U8Q3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zJyksIGRhdGEpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlczogQ3JlYXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VDcmVhdGlvblZlcnNpb25SZXNwb25zZShyZXMpXG4gICAgICApO1xuICB9XG5cbiAgZ2V0VmVyc2lvbihkb21haW46IHN0cmluZywgdGVtcGxhdGVOYW1lOiBzdHJpbmcsIHRhZzogc3RyaW5nKTogUHJvbWlzZTxEb21haW5UZW1wbGF0ZUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzLycsIHRlbXBsYXRlTmFtZSwgJy92ZXJzaW9ucy8nLCB0YWcpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IEdldERvbWFpblRlbXBsYXRlQVBJUmVzcG9uc2UpID0+IG5ldyBEb21haW5UZW1wbGF0ZUl0ZW0ocmVzLmJvZHkudGVtcGxhdGUpXG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlVmVyc2lvbihcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBkYXRhOiBEb21haW5UZW1wbGF0ZVVwZGF0ZVZlcnNpb25EYXRhXG4gICk6IFByb21pc2U8TXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQodXJsam9pbih0aGlzLmJhc2VSb3V0ZSwgZG9tYWluLCAnL3RlbXBsYXRlcy8nLCB0ZW1wbGF0ZU5hbWUsICcvdmVyc2lvbnMvJywgdGFnKSwgZGF0YSlcbiAgICAgIC50aGVuKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAocmVzOiBNdXRhdGVEb21haW5UZW1wbGF0ZVZlcnNpb25BUElSZXNwb25zZSkgPT4gdGhpcy5wYXJzZU11dGF0ZVRlbXBsYXRlVmVyc2lvblJlc3BvbnNlKHJlcylcbiAgICAgICk7XG4gIH1cblxuICBkZXN0cm95VmVyc2lvbihcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZ1xuICApOiBQcm9taXNlPE11dGF0ZURvbWFpblRlbXBsYXRlVmVyc2lvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4odGhpcy5iYXNlUm91dGUsIGRvbWFpbiwgJy90ZW1wbGF0ZXMvJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zLycsIHRhZykpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgLnRoZW4oKHJlczogTXV0YXRlRG9tYWluVGVtcGxhdGVWZXJzaW9uQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VNdXRhdGVUZW1wbGF0ZVZlcnNpb25SZXNwb25zZShyZXMpKTtcbiAgfVxuXG4gIGxpc3RWZXJzaW9ucyhcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICBxdWVyeT86IERvbWFpblRlbXBsYXRlc1F1ZXJ5XG4gICk6IFByb21pc2U8TGlzdERvbWFpblRlbXBsYXRlVmVyc2lvbnNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldCh1cmxqb2luKHRoaXMuYmFzZVJvdXRlLCBkb21haW4sICcvdGVtcGxhdGVzJywgdGVtcGxhdGVOYW1lLCAnL3ZlcnNpb25zJyksIHF1ZXJ5KVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXM6IExpc3REb21haW5UZW1wbGF0ZVZlcnNpb25zQVBJUmVzcG9uc2UpID0+IHRoaXMucGFyc2VMaXN0VGVtcGxhdGVWZXJzaW9ucyhyZXMpXG4gICAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgQVBJRXJyb3JPcHRpb25zIGZyb20gJy4vaW50ZXJmYWNlcy9BUElFcnJvck9wdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBUElFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdHVzOiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0YWNrOiBzdHJpbmc7XG4gIGRldGFpbHM6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgc3RhdHVzLFxuICAgIHN0YXR1c1RleHQsXG4gICAgbWVzc2FnZSxcbiAgICBib2R5ID0ge31cbiAgfTogQVBJRXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtZXNzYWdlOiBib2R5TWVzc2FnZSwgZXJyb3IgfSA9IGJvZHk7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IGVycm9yIHx8IHN0YXR1c1RleHQ7XG4gICAgdGhpcy5kZXRhaWxzID0gYm9keU1lc3NhZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCB7XG4gIEV2ZW50c0xpc3QsXG4gIEV2ZW50c1BhZ2UsXG4gIEV2ZW50c1F1ZXJ5LFxuICBFdmVudHNSZXNwb25zZSxcbiAgUGFnZXNMaXN0LFxuICBQYWdlc0xpc3RBY2N1bXVsYXRvcixcbiAgUGFyc2VkUGFnZXNMaXN0XG59IGZyb20gJy4vaW50ZXJmYWNlcy9FdmVudHMnO1xuXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudENsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBfcGFyc2VQYWdlTnVtYmVyKHVybDogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdCgnLycpLnBvcCgpIHx8ICcnO1xuICB9XG5cbiAgX3BhcnNlUGFnZShpZDogc3RyaW5nLCB1cmw6IHN0cmluZykgOiBFdmVudHNQYWdlIHtcbiAgICByZXR1cm4geyBpZCwgbnVtYmVyOiB0aGlzLl9wYXJzZVBhZ2VOdW1iZXIodXJsKSwgdXJsIH07XG4gIH1cblxuICBfcGFyc2VQYWdlTGlua3MocmVzcG9uc2U6IEV2ZW50c1Jlc3BvbnNlKSA6IFBhcnNlZFBhZ2VzTGlzdCB7XG4gICAgY29uc3QgcGFnZXMgPSBPYmplY3QuZW50cmllcyhyZXNwb25zZS5ib2R5LnBhZ2luZyBhcyBQYWdlc0xpc3QpO1xuICAgIHJldHVybiBwYWdlcy5yZWR1Y2UoXG4gICAgICAoYWNjOiBQYWdlc0xpc3RBY2N1bXVsYXRvciwgcGFpcjogW3VybDogc3RyaW5nLCBpZDogc3RyaW5nXSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHBhaXJbMF07XG4gICAgICAgIGNvbnN0IHVybCA9IHBhaXJbMV07XG4gICAgICAgIGFjY1tpZF0gPSB0aGlzLl9wYXJzZVBhZ2UoaWQsIHVybCk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fVxuICAgICkgYXMgdW5rbm93biBhcyBQYXJzZWRQYWdlc0xpc3Q7XG4gIH1cblxuICBfcGFyc2VFdmVudExpc3QocmVzcG9uc2U6IEV2ZW50c1Jlc3BvbnNlKSA6IEV2ZW50c0xpc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcmVzcG9uc2UuYm9keS5pdGVtcyxcbiAgICAgIHBhZ2VzOiB0aGlzLl9wYXJzZVBhZ2VMaW5rcyhyZXNwb25zZSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0KGRvbWFpbjogc3RyaW5nLCBxdWVyeT86IEV2ZW50c1F1ZXJ5KSA6IFByb21pc2U8RXZlbnRzTGlzdD4ge1xuICAgIGxldCB1cmw7XG4gICAgY29uc3QgcXVlcnlDb3B5ID0geyAuLi5xdWVyeSB9O1xuICAgIGlmIChxdWVyeUNvcHkgJiYgcXVlcnlDb3B5LnBhZ2UpIHtcbiAgICAgIHVybCA9IHVybGpvaW4oJy92MycsIGRvbWFpbiwgJ2V2ZW50cycsIHF1ZXJ5Q29weS5wYWdlKTtcbiAgICAgIGRlbGV0ZSBxdWVyeUNvcHkucGFnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsID0gdXJsam9pbignL3YzJywgZG9tYWluLCAnZXZlbnRzJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybCwgcXVlcnlDb3B5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBFdmVudHNSZXNwb25zZSkgPT4gdGhpcy5fcGFyc2VFdmVudExpc3QocmVzcG9uc2UpKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgTm9kZUZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgeyBJbnB1dEZvcm1EYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lGb3JtRGF0YSc7XG5cbmNsYXNzIEZvcm1EYXRhQnVpbGRlciB7XG4gIHByaXZhdGUgRm9ybURhdGFDb25zdHJ1Y3RvcjogSW5wdXRGb3JtRGF0YTtcbiAgY29uc3RydWN0b3IoRm9ybURhdGFDb25zdHJ1Y3RvcjogSW5wdXRGb3JtRGF0YSkge1xuICAgIHRoaXMuRm9ybURhdGFDb25zdHJ1Y3RvciA9IEZvcm1EYXRhQ29uc3RydWN0b3I7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRm9ybURhdGEoZGF0YTogYW55KTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBkYXRhIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBmb3JtRGF0YTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEgPSBPYmplY3Qua2V5cyhkYXRhKVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBkYXRhW2tleV07IH0pXG4gICAgICAucmVkdWNlKChmb3JtRGF0YUFjYzogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5cyA9IFsnYXR0YWNobWVudCcsICdpbmxpbmUnLCAnZmlsZSddO1xuICAgICAgICBpZiAoZmlsZUtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuYWRkRmlsZXNUb0ZEKGtleSwgZGF0YVtrZXldLCBmb3JtRGF0YUFjYyk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ21lc3NhZ2UnKSB7IC8vIG1pbWUgbWVzc2FnZVxuICAgICAgICAgIHRoaXMuYWRkTWltZURhdGFUb0ZEKGtleSwgZGF0YVtrZXldLCBmb3JtRGF0YUFjYyk7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb21tb25Qcm9wZXJ0eVRvRkQoa2V5LCBkYXRhW2tleV0sIGZvcm1EYXRhQWNjKTtcbiAgICAgICAgcmV0dXJuIGZvcm1EYXRhQWNjO1xuICAgICAgfSwgbmV3IHRoaXMuRm9ybURhdGFDb25zdHJ1Y3RvcigpKTtcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cblxuICBwcml2YXRlIGlzTm9kZUZvcm1EYXRhKGZvcm1EYXRhSW5zdGFuY2U6IE5vZGVGb3JtRGF0YSB8IEZvcm1EYXRhKVxuICA6IGZvcm1EYXRhSW5zdGFuY2UgaXMgTm9kZUZvcm1EYXRhIHtcbiAgICByZXR1cm4gKDxOb2RlRm9ybURhdGE+Zm9ybURhdGFJbnN0YW5jZSkuZ2V0SGVhZGVycyAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHRhY2htZW50T3B0aW9ucyhpdGVtOiB7XG4gICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gICAgY29udGVudFR5cGU/IDogc3RyaW5nO1xuICAgIGtub3duTGVuZ3RoPzogbnVtYmVyO1xuICB9KToge1xuICAgIGZpbGVuYW1lPzogc3RyaW5nLFxuICAgIGNvbnRlbnRUeXBlPzogc3RyaW5nLFxuICAgIGtub3duTGVuZ3RoPzogbnVtYmVyXG4gIH0ge1xuICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcgfHwgdGhpcy5pc1N0cmVhbShpdGVtKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgY29udGVudFR5cGUsXG4gICAgICBrbm93bkxlbmd0aFxuICAgIH0gPSBpdGVtO1xuICAgIHJldHVybiB7XG4gICAgICAuLi4oZmlsZW5hbWUgPyB7IGZpbGVuYW1lIH0gOiB7IGZpbGVuYW1lOiAnZmlsZScgfSksXG4gICAgICAuLi4oY29udGVudFR5cGUgJiYgeyBjb250ZW50VHlwZSB9KSxcbiAgICAgIC4uLihrbm93bkxlbmd0aCAmJiB7IGtub3duTGVuZ3RoIH0pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWltZURhdGFUb0ZEKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGRhdGE6IEJ1ZmZlciB8IEJsb2IsXG4gICAgZm9ybURhdGFJbnN0YW5jZTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNOb2RlRm9ybURhdGEoZm9ybURhdGFJbnN0YW5jZSkpIHtcbiAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgZm9ybURhdGFJbnN0YW5jZS5hcHBlbmQoa2V5LCBkYXRhLCB7IGZpbGVuYW1lOiAnTWltZU1lc3NhZ2UnIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRGF0YUluc3RhbmNlLmFwcGVuZChrZXksIGRhdGEgYXMgQmxvYiwgJ01pbWVNZXNzYWdlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRGaWxlc1RvRkQoXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmb3JtRGF0YUluc3RhbmNlOiBOb2RlRm9ybURhdGEgfCBGb3JtRGF0YVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBhcHBlbmRGaWxlVG9GRCA9IChcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgb2JqOiBhbnksXG4gICAgICBmb3JtRGF0YTogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGlzU3RyZWFtRGF0YSA9IHRoaXMuaXNTdHJlYW0ob2JqKTtcbiAgICAgIGNvbnN0IG9iakRhdGEgPSBpc1N0cmVhbURhdGEgPyBvYmogOiBvYmouZGF0YTtcbiAgICAgIC8vIGdldEF0dGFjaG1lbnRPcHRpb25zIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBvYmogcGFyYW1ldGVyIHRvIHByZXZlbnQgbG9vc2luZyBmaWxlbmFtZVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0QXR0YWNobWVudE9wdGlvbnMob2JqKTtcbiAgICAgIGlmICh0aGlzLmlzTm9kZUZvcm1EYXRhKGZvcm1EYXRhKSkge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpEYXRhLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqRGF0YSwgb3B0aW9ucy5maWxlbmFtZSk7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBhcHBlbmRGaWxlVG9GRChwcm9wZXJ0eU5hbWUsIGl0ZW0sIGZvcm1EYXRhSW5zdGFuY2UpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZEZpbGVUb0ZEKHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1EYXRhSW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNTdHJlYW0oZGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgZGF0YS5waXBlID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb21tb25Qcm9wZXJ0eVRvRkQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmb3JtRGF0YUFjYzogTm9kZUZvcm1EYXRhIHwgRm9ybURhdGFcbiAgKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgZm9ybURhdGFBY2MuYXBwZW5kKGtleSwgaXRlbSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGZvcm1EYXRhQWNjLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEZvcm1EYXRhQnVpbGRlcjtcbiIsImltcG9ydCBDbGllbnQgZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgSW5wdXRGb3JtRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JRm9ybURhdGEnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnLi9pbnRlcmZhY2VzL09wdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWlsZ3VuIHtcbiAgc3RhdGljIGdldCBkZWZhdWx0KCk6IHR5cGVvZiBNYWlsZ3VuIHsgcmV0dXJuIHRoaXM7IH1cbiAgcHJpdmF0ZSBmb3JtRGF0YTogSW5wdXRGb3JtRGF0YVxuXG4gIGNvbnN0cnVjdG9yKEZvcm1EYXRhOiBJbnB1dEZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IEZvcm1EYXRhO1xuICB9XG5cbiAgY2xpZW50KG9wdGlvbnM6IE9wdGlvbnMpIDogQ2xpZW50IHtcbiAgICByZXR1cm4gbmV3IENsaWVudChvcHRpb25zLCB0aGlzLmZvcm1EYXRhKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQm91bmNlLCBDb21wbGFpbnQsIFVuc3Vic2NyaWJlLCBXaGl0ZUxpc3Rcbn0gZnJvbSAnLi4vc3VwcHJlc3Npb25zJztcblxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5leHBvcnQgaW50ZXJmYWNlIEJvdW5jZURhdGEge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvZGU6IG51bWJlcjtcbiAgZXJyb3I6IHN0cmluZztcbiAgY3JlYXRlZF9hdDogc3RyaW5nIHwgRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGFpbnREYXRhIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVuc3Vic2NyaWJlRGF0YSB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgdGFnczogYW55O1xuICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdoaXRlTGlzdERhdGEge1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkUGFnZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhZ2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGFkZHJlc3M6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHVybDogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFBhZ2VzTGlzdCB7XG4gIHByZXZpb3VzOiBQYXJzZWRQYWdlO1xuICBmaXJzdDogUGFyc2VkUGFnZTtcbiAgbGFzdDogUGFyc2VkUGFnZTtcbiAgbmV4dDogUGFyc2VkUGFnZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXBwcmVzc2lvbkxpc3Qge1xuICBpdGVtczogKEJvdW5jZSB8IENvbXBsYWludCB8IFVuc3Vic2NyaWJlIHwgV2hpdGVMaXN0KVtdO1xuICBwYWdlczogUGFyc2VkUGFnZXNMaXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VzTGlzdCB7XG4gIHByZXZpb3VzOiBzdHJpbmc7XG4gIGZpcnN0OiBzdHJpbmc7XG4gIGxhc3Q6IHN0cmluZztcbiAgbmV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBTdXBwcmVzc2lvbk1vZGVscyB7XG4gIEJPVU5DRVMgPSAnYm91bmNlcycsXG4gIENPTVBMQUlOVFMgPSAnY29tcGxhaW50cycsXG4gIFVOU1VCU0NSSUJFUyA9ICd1bnN1YnNjcmliZXMnLFxuICBXSElURUxJU1RTID0gJ3doaXRlbGlzdHMnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZXNMaXN0QWNjdW11bGF0b3Ige1xuICBbaW5kZXg6IHN0cmluZ106IFBhcnNlZFBhZ2U7XG59XG5cbmV4cG9ydCB0eXBlIFN1cHByZXNzaW9uTGlzdFF1ZXJ5ID0ge1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXBwcmVzc2lvbkxpc3RSZXNwb25zZSB7XG4gIGJvZHk6IHtcbiAgICBpdGVtczogQm91bmNlRGF0YVtdIHwgQ29tcGxhaW50RGF0YVtdIHwgVW5zdWJzY3JpYmVEYXRhW10gfCBXaGl0ZUxpc3REYXRhW107XG4gICAgcGFnaW5nOiBQYWdlc0xpc3Q7XG4gIH1cbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25SZXNwb25zZSB7XG4gIGJvZHk6IEJvdW5jZURhdGEgfCBDb21wbGFpbnREYXRhIHwgVW5zdWJzY3JpYmVEYXRhIHwgV2hpdGVMaXN0RGF0YTtcbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25EZXN0cm95UmVzcG9uc2Uge1xuICBib2R5OiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gIH1cbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25EZXN0cm95UmVzdWx0IHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTdXBwcmVzc2lvbkNyZWF0aW9uRGF0YSA9IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjb2RlPzogbnVtYmVyO1xuICBlcnJvcj86IHN0cmluZztcbiAgZG9tYWluPzogc3RyaW5nO1xuICB0YWc/OiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ/OiBzdHJpbmcgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHByZXNzaW9uQ3JlYXRpb25SZXNwb25zZSB7XG4gIGJvZHk6e1xuICAgIG1lc3NhZ2U6c3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH1cbiAgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcHJlc3Npb25DcmVhdGlvblJlc3VsdCB7XG4gIG1lc3NhZ2U6c3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5pbXBvcnQge1xuICBJcFBvb2xDcmVhdGVEYXRhLFxuICBJcFBvb2xDcmVhdGVSZXNwb25zZSxcbiAgSXBQb29sQ3JlYXRlUmVzdWx0LFxuICBJcFBvb2xEZWxldGVEYXRhLFxuICBJcFBvb2xMaXN0UmVzcG9uc2UsXG4gIElwUG9vbExpc3RSZXN1bHQsXG4gIElwUG9vbE1lc3NhZ2VSZXNwb25zZSxcbiAgSXBQb29sTWVzc2FnZVJlc3VsdCxcbiAgSXBQb29sVXBkYXRlRGF0YSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lwUG9vbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJcFBvb2xzQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIGxpc3QoKTogUHJvbWlzZTxJcFBvb2xMaXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92MS9pcF9wb29scycpXG4gICAgICAudGhlbigocmVzcG9uc2U6IElwUG9vbExpc3RSZXNwb25zZSkgPT4gdGhpcy5wYXJzZUlwUG9vbHNSZXNwb25zZShyZXNwb25zZSkpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IElwUG9vbENyZWF0ZURhdGEpOiBQcm9taXNlPElwUG9vbENyZWF0ZVJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJcFBvb2xDcmVhdGVSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKCcvdjEvaXBfcG9vbHMnLCBkYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAuLi5yZXNwb25zZS5ib2R5XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShwb29sSWQ6IHN0cmluZywgZGF0YTogSXBQb29sVXBkYXRlRGF0YSk6IFByb21pc2U8SXBQb29sTWVzc2FnZVJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBJcFBvb2xNZXNzYWdlUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QucGF0Y2hXaXRoRkQoYC92MS9pcF9wb29scy8ke3Bvb2xJZH1gLCBkYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAuLi5yZXNwb25zZS5ib2R5XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShwb29sSWQ6IHN0cmluZywgZGF0YTogSXBQb29sRGVsZXRlRGF0YSk6IFByb21pc2U8SXBQb29sTWVzc2FnZVJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOklwUG9vbE1lc3NhZ2VSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdC5kZWxldGUoYC92MS9pcF9wb29scy8ke3Bvb2xJZH1gLCBkYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAuLi5yZXNwb25zZS5ib2R5XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJcFBvb2xzUmVzcG9uc2UocmVzcG9uc2U6IElwUG9vbExpc3RSZXNwb25zZSk6IElwUG9vbExpc3RSZXN1bHQge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIC4uLnJlc3BvbnNlLmJvZHlcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgTWdSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBJcERhdGEsIElwc0xpc3RSZXNwb25zZUJvZHkgfSBmcm9tICcuL2ludGVyZmFjZXMvSXBzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSXBzQ2xpZW50IHtcbiAgcmVxdWVzdDogTWdSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IE1nUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBhc3luYyBsaXN0KHF1ZXJ5OiBhbnkpOiBQcm9taXNlPElwc0xpc3RSZXNwb25zZUJvZHk+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy92My9pcHMnLCBxdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VJcHNSZXNwb25zZTxJcHNMaXN0UmVzcG9uc2VCb2R5PihyZXNwb25zZSk7XG4gIH1cblxuICBhc3luYyBnZXQoaXA6IHN0cmluZyk6IFByb21pc2U8SXBEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KGAvdjMvaXBzLyR7aXB9YCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VJcHNSZXNwb25zZTxJcERhdGE+KHJlc3BvbnNlKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJcHNSZXNwb25zZTxUPihyZXNwb25zZTogeyBib2R5OiBUIH0pOiBUIHtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxufVxuIiwiaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIExpc3RzUXVlcnksXG4gIENyZWF0ZVVwZGF0ZUxpc3QsXG4gIERlc3Ryb3llZExpc3QsXG4gIE1haWxpbmdMaXN0LFxuICBWYWxpZGF0aW9uQXBpUmVzcG9uc2UsXG4gIFN0YXJ0VmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvblJlc3VsdCxcbiAgQ2FuY2VsVmFsaWRhdGlvblJlc3VsdFxufSBmcm9tICcuL2ludGVyZmFjZXMvbGlzdHMnO1xuaW1wb3J0IHsgSU1haWxMaXN0c01lbWJlcnMgfSBmcm9tICcuL2ludGVyZmFjZXMvbWFpbExpc3RNZW1iZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdHNDbGllbnQge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcbiAgbWVtYmVyczogSU1haWxMaXN0c01lbWJlcnM7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCwgbWVtYmVyczpJTWFpbExpc3RzTWVtYmVycykge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgdGhpcy5iYXNlUm91dGUgPSAnL3YzL2xpc3RzJztcbiAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhbGlkYXRpb25SZXN1bHQoc3RhdHVzOiBudW1iZXIsIGRhdGE6IFZhbGlkYXRpb25BcGlSZXNwb25zZSk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXMsXG4gICAgICB2YWxpZGF0aW9uUmVzdWx0OiB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKGRhdGEuY3JlYXRlZF9hdCAqIDEwMDApIC8vIGFkZCBtaWxsaXNlY29uZCB0byBVbml4IHRpbWVzdGFtcFxuICAgICAgfVxuICAgIH0gYXMgVmFsaWRhdGlvblJlc3VsdDtcbiAgfVxuXG4gIGxpc3QocXVlcnk/OiBMaXN0c1F1ZXJ5KTogUHJvbWlzZTxNYWlsaW5nTGlzdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYCR7dGhpcy5iYXNlUm91dGV9L3BhZ2VzYCwgcXVlcnkpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkuaXRlbXMgYXMgTWFpbGluZ0xpc3RbXSk7XG4gIH1cblxuICBnZXQobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPE1haWxpbmdMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkubGlzdCBhcyBNYWlsaW5nTGlzdCk7XG4gIH1cblxuICBjcmVhdGUoZGF0YTogQ3JlYXRlVXBkYXRlTGlzdCk6IFByb21pc2U8TWFpbGluZ0xpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQodGhpcy5iYXNlUm91dGUsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkubGlzdCBhcyBNYWlsaW5nTGlzdCk7XG4gIH1cblxuICB1cGRhdGUobWFpbExpc3RBZGRyZXNzOiBzdHJpbmcsIGRhdGE6IENyZWF0ZVVwZGF0ZUxpc3QpOiBQcm9taXNlPE1haWxpbmdMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wdXRXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfWAsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkubGlzdCBhcyBNYWlsaW5nTGlzdCk7XG4gIH1cblxuICBkZXN0cm95KG1haWxMaXN0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxEZXN0cm95ZWRMaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkgYXMgRGVzdHJveWVkTGlzdCk7XG4gIH1cblxuICB2YWxpZGF0ZShtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8U3RhcnRWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0KGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vdmFsaWRhdGVgLCB7fSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gKHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIC4uLnJlc3BvbnNlLmJvZHlcbiAgICAgIH0pIGFzIFN0YXJ0VmFsaWRhdGlvblJlc3VsdCk7XG4gIH1cblxuICB2YWxpZGF0aW9uUmVzdWx0KG1haWxMaXN0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS92YWxpZGF0ZWApXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PiB0aGlzLnBhcnNlVmFsaWRhdGlvblJlc3VsdChcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgIHJlc3BvbnNlLmJvZHkgYXMgVmFsaWRhdGlvbkFwaVJlc3BvbnNlXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBjYW5jZWxWYWxpZGF0aW9uKG1haWxMaXN0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxDYW5jZWxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS92YWxpZGF0ZWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+ICh7XG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2VcbiAgICAgIH0gYXMgQ2FuY2VsVmFsaWRhdGlvblJlc3VsdCkpO1xuICB9XG59XG4iLCJpbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHtcbiAgTWFpbExpc3RNZW1iZXJzUXVlcnksXG4gIElNYWlsTGlzdHNNZW1iZXJzLFxuICBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnMsXG4gIE1haWxMaXN0TWVtYmVyLFxuICBNdWx0aXBsZU1lbWJlcnNEYXRhLFxuICBNdWx0aXBsZU1lbWJlcnNSZXFEYXRhLFxuICBEZWxldGVkTWVtYmVyLFxuICBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNSZXEsXG4gIE5ld011bHRpcGxlTWVtYmVyc1Jlc3BvbnNlXG59IGZyb20gJy4vaW50ZXJmYWNlcy9tYWlsTGlzdE1lbWJlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWlsTGlzdHNNZW1iZXJzIGltcGxlbWVudHMgSU1haWxMaXN0c01lbWJlcnMge1xuICBiYXNlUm91dGU6IHN0cmluZztcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmJhc2VSb3V0ZSA9ICcvdjMvbGlzdHMnO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FuZFVwZGF0ZURhdGEoZGF0YTogQ3JlYXRlVXBkYXRlTWFpbExpc3RNZW1iZXJzKSB7XG4gICAgY29uc3QgbmV3RGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhLnZhcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICBuZXdEYXRhLnZhcnMgPSBKU09OLnN0cmluZ2lmeShuZXdEYXRhLnZhcnMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YS5zdWJzY3JpYmVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIG5ld0RhdGEuc3Vic2NyaWJlZCA9IGRhdGEuc3Vic2NyaWJlZCA/ICd5ZXMnIDogJ25vJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RGF0YSBhcyBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNSZXE7XG4gIH1cblxuICBsaXN0TWVtYmVycyhtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgcXVlcnk/OiBNYWlsTGlzdE1lbWJlcnNRdWVyeSk6IFByb21pc2U8TWFpbExpc3RNZW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAke3RoaXMuYmFzZVJvdXRlfS8ke21haWxMaXN0QWRkcmVzc30vbWVtYmVycy9wYWdlc2AsIHF1ZXJ5KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lml0ZW1zIGFzIE1haWxMaXN0TWVtYmVyW10pO1xuICB9XG5cbiAgZ2V0TWVtYmVyKG1haWxMaXN0QWRkcmVzczogc3RyaW5nLCBtYWlsTGlzdE1lbWJlckFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8TWFpbExpc3RNZW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMvJHttYWlsTGlzdE1lbWJlckFkZHJlc3N9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5tZW1iZXIgYXMgTWFpbExpc3RNZW1iZXIpO1xuICB9XG5cbiAgY3JlYXRlTWVtYmVyKFxuICAgIG1haWxMaXN0QWRkcmVzczogc3RyaW5nLFxuICAgIGRhdGE6IENyZWF0ZVVwZGF0ZU1haWxMaXN0TWVtYmVyc1xuICApOiBQcm9taXNlPE1haWxMaXN0TWVtYmVyPiB7XG4gICAgY29uc3QgcmVxRGF0YSA9IHRoaXMuY2hlY2tBbmRVcGRhdGVEYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnNgLCByZXFEYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5Lm1lbWJlciBhcyBNYWlsTGlzdE1lbWJlcik7XG4gIH1cblxuICBjcmVhdGVNZW1iZXJzKFxuICAgIG1haWxMaXN0QWRkcmVzczogc3RyaW5nLFxuICAgIGRhdGE6IE11bHRpcGxlTWVtYmVyc0RhdGFcbiAgKTogUHJvbWlzZTxOZXdNdWx0aXBsZU1lbWJlcnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IG5ld0RhdGE6IE11bHRpcGxlTWVtYmVyc1JlcURhdGEgPSB7XG4gICAgICBtZW1iZXJzOiBBcnJheS5pc0FycmF5KGRhdGEubWVtYmVycykgPyBKU09OLnN0cmluZ2lmeShkYXRhLm1lbWJlcnMpIDogZGF0YS5tZW1iZXJzLFxuICAgICAgdXBzZXJ0OiBkYXRhLnVwc2VydFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzLmpzb25gLCBuZXdEYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5IGFzIE5ld011bHRpcGxlTWVtYmVyc1Jlc3BvbnNlKTtcbiAgfVxuXG4gIHVwZGF0ZU1lbWJlcihcbiAgICBtYWlsTGlzdEFkZHJlc3M6IHN0cmluZyxcbiAgICBtYWlsTGlzdE1lbWJlckFkZHJlc3M6IHN0cmluZyxcbiAgICBkYXRhOiBDcmVhdGVVcGRhdGVNYWlsTGlzdE1lbWJlcnNcbiAgKTogUHJvbWlzZTxNYWlsTGlzdE1lbWJlcj4ge1xuICAgIGNvbnN0IHJlcURhdGEgPSB0aGlzLmNoZWNrQW5kVXBkYXRlRGF0YShkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRChgJHt0aGlzLmJhc2VSb3V0ZX0vJHttYWlsTGlzdEFkZHJlc3N9L21lbWJlcnMvJHttYWlsTGlzdE1lbWJlckFkZHJlc3N9YCwgcmVxRGF0YSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5tZW1iZXIgYXMgTWFpbExpc3RNZW1iZXIpO1xuICB9XG5cbiAgZGVzdHJveU1lbWJlcihtYWlsTGlzdEFkZHJlc3M6IHN0cmluZywgbWFpbExpc3RNZW1iZXJBZGRyZXNzOiBzdHJpbmcpIDogUHJvbWlzZTxEZWxldGVkTWVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYCR7dGhpcy5iYXNlUm91dGV9LyR7bWFpbExpc3RBZGRyZXNzfS9tZW1iZXJzLyR7bWFpbExpc3RNZW1iZXJBZGRyZXNzfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkgYXMgRGVsZXRlZE1lbWJlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIE1haWxndW5NZXNzYWdlRGF0YSxcbiAgTWVzc2FnZXNTZW5kQVBJUmVzcG9uc2UsXG4gIE1lc3NhZ2VzU2VuZFJlc3VsdFxufSBmcm9tICcuL2ludGVyZmFjZXMvTWVzc2FnZXMnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVzc2FnZXNDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgX3BhcnNlUmVzcG9uc2UocmVzcG9uc2U6IE1lc3NhZ2VzU2VuZEFQSVJlc3BvbnNlKTogTWVzc2FnZXNTZW5kUmVzdWx0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAuLi5yZXNwb25zZS5ib2R5XG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZShkb21haW46IHN0cmluZywgZGF0YTogTWFpbGd1bk1lc3NhZ2VEYXRhKTogUHJvbWlzZTxNZXNzYWdlc1NlbmRSZXN1bHQ+IHtcbiAgICBpZiAoZGF0YS5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoYC92My8ke2RvbWFpbn0vbWVzc2FnZXMubWltZWAsIGRhdGEpXG4gICAgICAgIC50aGVuKHRoaXMuX3BhcnNlUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgL3YzLyR7ZG9tYWlufS9tZXNzYWdlc2AsIGRhdGEpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVJlc3BvbnNlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2FuY2VsZWRNdWx0aXBsZVZhbGlkYXRpb25Kb2IsXG4gIENyZWF0ZWRNdWx0aXBsZVZhbGlkYXRpb25Kb2IsXG4gIElNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQsXG4gIE11bHRpcGxlVmFsaWRhdGlvbkpvYixcbiAgTXVsdGlwbGVWYWxpZGF0aW9uSm9ic0xpc3RSZXN1bHRcbn1cbiAgZnJvbSAnLi9pbnRlcmZhY2VzL011bHRpcGxlVmFsaWRhdGlvbic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNdWx0aXBsZVZhbGlkYXRpb25DbGllbnQgaW1wbGVtZW50cyBJTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50IHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgfVxuXG4gIGxpc3QoKTogUHJvbWlzZTxNdWx0aXBsZVZhbGlkYXRpb25Kb2JzTGlzdFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjQvYWRkcmVzcy92YWxpZGF0ZS9idWxrJylcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSBhcyBNdWx0aXBsZVZhbGlkYXRpb25Kb2JzTGlzdFJlc3VsdCk7XG4gIH1cblxuICBnZXQobGlzdElkOiBzdHJpbmcpOiBQcm9taXNlPE11bHRpcGxlVmFsaWRhdGlvbkpvYj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KGAvdjQvYWRkcmVzcy92YWxpZGF0ZS9idWxrLyR7bGlzdElkfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgY3JlYXRlKGxpc3RJZDogc3RyaW5nLCBmaWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8Q3JlYXRlZE11bHRpcGxlVmFsaWRhdGlvbkpvYj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QucG9zdFdpdGhGRChgL3Y0L2FkZHJlc3MvdmFsaWRhdGUvYnVsay8ke2xpc3RJZH1gLCBmaWxlKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGRlc3Ryb3kobGlzdElkOiBzdHJpbmcpOiBQcm9taXNlPENhbmNlbGVkTXVsdGlwbGVWYWxpZGF0aW9uSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5kZWxldGUoYC92NC9hZGRyZXNzL3ZhbGlkYXRlL2J1bGsvJHtsaXN0SWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBiYXNlNjQgZnJvbSAnYmFzZS02NCc7XG5pbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5pbXBvcnQga3kgZnJvbSAna3ktdW5pdmVyc2FsJztcbmltcG9ydCAqIGFzIE5vZGVGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgT25DYWxsRW1wdHlIZWFkZXJzLCBPbkNhbGxSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvUmVxdWVzdE9wdGlvbnMnO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcbmltcG9ydCB7IElucHV0Rm9ybURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvSUZvcm1EYXRhJztcbmltcG9ydCBBUElSZXNwb25zZSBmcm9tICcuL2ludGVyZmFjZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IEZvcm1EYXRhQnVpbGRlciBmcm9tICcuL2Zvcm1EYXRhQnVpbGRlcic7XG5pbXBvcnQgeyBJcFBvb2xEZWxldGVEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lwUG9vbHMnO1xuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGtleTogc3RyaW5nO1xuICBwcml2YXRlIHVybDogc3RyaW5nO1xuICBwcml2YXRlIHRpbWVvdXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJpdmF0ZSBmb3JtRGF0YUJ1aWxkZXI6IEZvcm1EYXRhQnVpbGRlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgZm9ybURhdGE6IElucHV0Rm9ybURhdGEpIHtcbiAgICB0aGlzLnVzZXJuYW1lID0gb3B0aW9ucy51c2VybmFtZTtcbiAgICB0aGlzLmtleSA9IG9wdGlvbnMua2V5O1xuICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmwgYXMgc3RyaW5nO1xuICAgIHRoaXMudGltZW91dCA9IG9wdGlvbnMudGltZW91dDtcbiAgICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307XG4gICAgdGhpcy5mb3JtRGF0YUJ1aWxkZXIgPSBuZXcgRm9ybURhdGFCdWlsZGVyKGZvcm1EYXRhKTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb25DYWxsT3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA+XG4gICk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBjb25zdCBvcHRpb25zOiBPbkNhbGxSZXF1ZXN0T3B0aW9ucyA9IHsgLi4ub25DYWxsT3B0aW9ucyB9O1xuICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0LmVuY29kZShgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMua2V5fWApO1xuICAgIGNvbnN0IG9uQ2FsbEhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgPyBvcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICBjb25zdCBoZWFkZXJzOiBIZWFkZXJzSW5pdHwgT25DYWxsRW1wdHlIZWFkZXJzID0ge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWN9YCxcbiAgICAgIC4uLnRoaXMuaGVhZGVycyxcbiAgICAgIC4uLm9uQ2FsbEhlYWRlcnNcbiAgICB9O1xuXG4gICAgZGVsZXRlIG9wdGlvbnM/LmhlYWRlcnM7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IC4uLm9wdGlvbnMgfTtcblxuICAgIGlmIChvcHRpb25zPy5xdWVyeSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvcHRpb25zPy5xdWVyeSkubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zLnNlYXJjaFBhcmFtcyA9IG9wdGlvbnMucXVlcnk7XG4gICAgICBkZWxldGUgcGFyYW1zLnF1ZXJ5O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IGt5KFxuICAgICAgdXJsam9pbih0aGlzLnVybCwgdXJsKSxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBtZXRob2QudG9Mb2NhbGVVcHBlckNhc2UoKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogdGhpcy50aW1lb3V0LFxuICAgICAgICAuLi5wYXJhbXNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKCFyZXNwb25zZT8ub2spIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZ2V0UmVzcG9uc2VCb2R5KHJlc3BvbnNlKTtcblxuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZT8uc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZT8uc3RhdHVzVGV4dCxcbiAgICAgICAgYm9keTogcmVzLmJvZHlcbiAgICAgIH0gYXMgQVBJRXJyb3JPcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldFJlc3BvbnNlQm9keShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHJlcyBhcyBBUElSZXNwb25zZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVzcG9uc2VCb2R5KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSB7XG4gICAgICBib2R5OiB7fSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2U/LnN0YXR1c1xuICAgIH0gYXMgQVBJUmVzcG9uc2U7XG4gICAgbGV0IHJlc3BvbnNlU3RyaW5nID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgY29uc3QganNvbkJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTtcbiAgICAgIHJlcy5ib2R5ID0ganNvbkJvZHk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICByZXMuc3RhdHVzID0gNDAwO1xuICAgICAgcmVzLmJvZHkgPSB7XG4gICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlU3RyaW5nLFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9XG5cbiAgcXVlcnkoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IEFycmF5PEFycmF5PHN0cmluZz4+LFxuICAgIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXRob2QsIHVybCwgeyBxdWVyeSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIGNvbW1hbmQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgc3RyaW5nIHwgTm9kZUZvcm1EYXRhIHwgRm9ybURhdGEsXG4gICAgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGFkZERlZmF1bHRIZWFkZXJzID0gdHJ1ZVxuICApOiBQcm9taXNlPEFQSVJlc3BvbnNlPiB7XG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYWRkRGVmYXVsdEhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIC4uLmhlYWRlcnMsXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgKTtcbiAgfVxuXG4gIGdldChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgQXJyYXk8QXJyYXk8c3RyaW5nPj4sXG4gICAgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnZ2V0JywgdXJsLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICBwb3N0KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHN0cmluZyxcbiAgICBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3Bvc3QnLCB1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcG9zdFdpdGhGRChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+W11cbiAgKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5mb3JtRGF0YUJ1aWxkZXIuY3JlYXRlRm9ybURhdGEoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCgncG9zdCcsIHVybCwgZm9ybURhdGEsIHt9LCBmYWxzZSk7XG4gIH1cblxuICBwdXRXaXRoRkQodXJsOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5mb3JtRGF0YUJ1aWxkZXIuY3JlYXRlRm9ybURhdGEoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCgncHV0JywgdXJsLCBmb3JtRGF0YSwge30sIGZhbHNlKTtcbiAgfVxuXG4gIHBhdGNoV2l0aEZEKHVybDogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8QVBJUmVzcG9uc2U+IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZm9ybURhdGFCdWlsZGVyLmNyZWF0ZUZvcm1EYXRhKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3BhdGNoJywgdXJsLCBmb3JtRGF0YSwge30sIGZhbHNlKTtcbiAgfVxuXG4gIHB1dCh1cmw6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gIDogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ3B1dCcsIHVybCwgZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBkZWxldGUodXJsOiBzdHJpbmcsIGRhdGE/OiBJcFBvb2xEZWxldGVEYXRhKTogUHJvbWlzZTxBUElSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQoJ2RlbGV0ZScsIHVybCwgZGF0YSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVxdWVzdDtcbiIsImltcG9ydCB7XG4gIENyZWF0ZVVwZGF0ZVJvdXRlRGF0YSwgRGVzdHJveVJvdXRlUmVzcG9uc2UsIFJvdXRlLCBSb3V0ZXNMaXN0UXVlcnksIFVwZGF0ZVJvdXRlUmVzcG9uc2Vcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JvdXRlcyc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXNDbGllbnQge1xuICByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICB9XG5cbiAgbGlzdChxdWVyeTogUm91dGVzTGlzdFF1ZXJ5KTogUHJvbWlzZTxSb3V0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQoJy92My9yb3V0ZXMnLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keS5pdGVtcyk7XG4gIH1cblxuICBnZXQoaWQ6IHN0cmluZyk6IFByb21pc2U8Um91dGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldChgL3YzL3JvdXRlcy8ke2lkfWApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkucm91dGUpO1xuICB9XG5cbiAgY3JlYXRlKGRhdGE6IENyZWF0ZVVwZGF0ZVJvdXRlRGF0YSk6IFByb21pc2U8Um91dGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnBvc3RXaXRoRkQoJy92My9yb3V0ZXMnLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5ib2R5LnJvdXRlKTtcbiAgfVxuXG4gIHVwZGF0ZShpZDogc3RyaW5nLCBkYXRhOiBDcmVhdGVVcGRhdGVSb3V0ZURhdGEpOiBQcm9taXNlPFVwZGF0ZVJvdXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRChgL3YzL3JvdXRlcy8ke2lkfWAsIGRhdGEpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmJvZHkpO1xuICB9XG5cbiAgZGVzdHJveShpZDogc3RyaW5nKTogUHJvbWlzZTxEZXN0cm95Um91dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKGAvdjMvcm91dGVzLyR7aWR9YClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuYm9keSk7XG4gIH1cbn1cbiIsImltcG9ydCB1cmxqb2luIGZyb20gJ3VybC1qb2luJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBTdGF0c1F1ZXJ5LCBTdGF0c09wdGlvbnMsIFN0YXQgfSBmcm9tICcuL2ludGVyZmFjZXMvU3RhdHNPcHRpb25zJztcblxuY2xhc3MgU3RhdHMge1xuICBzdGFydDogRGF0ZTtcbiAgZW5kOiBEYXRlO1xuICByZXNvbHV0aW9uOiBzdHJpbmc7XG4gIHN0YXRzOiBTdGF0W107XG5cbiAgY29uc3RydWN0b3IoZGF0YTogU3RhdHNPcHRpb25zKSB7XG4gICAgdGhpcy5zdGFydCA9IG5ldyBEYXRlKGRhdGEuc3RhcnQpO1xuICAgIHRoaXMuZW5kID0gbmV3IERhdGUoZGF0YS5lbmQpO1xuICAgIHRoaXMucmVzb2x1dGlvbiA9IGRhdGEucmVzb2x1dGlvbjtcbiAgICB0aGlzLnN0YXRzID0gZGF0YS5zdGF0cy5tYXAoZnVuY3Rpb24gKHN0YXQ6IFN0YXQpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHsgLi4uc3RhdCB9O1xuICAgICAgcmVzLnRpbWUgPSBuZXcgRGF0ZShzdGF0LnRpbWUpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0c0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVTZWFyY2hQYXJhbXMocXVlcnk6IFN0YXRzUXVlcnkgfCB1bmRlZmluZWQpOiBBcnJheTxBcnJheTxzdHJpbmc+PiB7XG4gICAgbGV0IHNlYXJjaFBhcmFtcyA9IFtdIGFzIEFycmF5PEFycmF5PHN0cmluZz4+O1xuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGgpIHtcbiAgICAgIHNlYXJjaFBhcmFtcyA9IE9iamVjdC5lbnRyaWVzKHF1ZXJ5KS5yZWR1Y2UoKGFycmF5V2l0aFBhaXJzLCBjdXJyZW50UGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBjdXJyZW50UGFpcjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHJlcGVhdGVkUHJvcGVydHkgPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFtrZXksIGl0ZW1dKTtcbiAgICAgICAgICByZXR1cm4gWy4uLmFycmF5V2l0aFBhaXJzLCAuLi5yZXBlYXRlZFByb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICBhcnJheVdpdGhQYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIHJldHVybiBhcnJheVdpdGhQYWlycztcbiAgICAgIH0sIFtdIGFzIEFycmF5PEFycmF5PHN0cmluZz4+KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VhcmNoUGFyYW1zO1xuICB9XG5cbiAgX3BhcnNlU3RhdHMocmVzcG9uc2U6IHsgYm9keTogU3RhdHNPcHRpb25zIH0pOiBTdGF0cyB7XG4gICAgcmV0dXJuIG5ldyBTdGF0cyhyZXNwb25zZS5ib2R5KTtcbiAgfVxuXG4gIGdldERvbWFpbihkb21haW46IHN0cmluZywgcXVlcnk/OiBTdGF0c1F1ZXJ5KTogUHJvbWlzZTxTdGF0cz4ge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHRoaXMucHJlcGFyZVNlYXJjaFBhcmFtcyhxdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbignL3YzJywgZG9tYWluLCAnc3RhdHMvdG90YWwnKSwgc2VhcmNoUGFyYW1zKVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VTdGF0cyk7XG4gIH1cblxuICBnZXRBY2NvdW50KHF1ZXJ5PzogU3RhdHNRdWVyeSk6IFByb21pc2U8U3RhdHM+IHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSB0aGlzLnByZXBhcmVTZWFyY2hQYXJhbXMocXVlcnkpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KCcvdjMvc3RhdHMvdG90YWwnLCBzZWFyY2hQYXJhbXMpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVN0YXRzKTtcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgdXJsam9pbiBmcm9tICd1cmwtam9pbic7XG5cbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQge1xuICBCb3VuY2VEYXRhLFxuICBDb21wbGFpbnREYXRhLFxuICBQYWdlc0xpc3QsXG4gIFBhZ2VzTGlzdEFjY3VtdWxhdG9yLFxuICBQYXJzZWRQYWdlLFxuICBQYXJzZWRQYWdlc0xpc3QsXG4gIFN1cHByZXNzaW9uQ3JlYXRpb25EYXRhLFxuICBTdXBwcmVzc2lvbkNyZWF0aW9uUmVzcG9uc2UsXG4gIFN1cHByZXNzaW9uQ3JlYXRpb25SZXN1bHQsXG4gIFN1cHByZXNzaW9uRGVzdHJveVJlc3BvbnNlLFxuICBTdXBwcmVzc2lvbkRlc3Ryb3lSZXN1bHQsXG4gIFN1cHByZXNzaW9uTGlzdCxcbiAgU3VwcHJlc3Npb25MaXN0UXVlcnksXG4gIFN1cHByZXNzaW9uTGlzdFJlc3BvbnNlLFxuICBTdXBwcmVzc2lvbk1vZGVscyxcbiAgU3VwcHJlc3Npb25SZXNwb25zZSxcbiAgVW5zdWJzY3JpYmVEYXRhLFxuICBXaGl0ZUxpc3REYXRhLFxufSBmcm9tICcuL2ludGVyZmFjZXMvU3VwcmVzc2lvbnMnO1xuaW1wb3J0IEFQSUVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IEFQSUVycm9yT3B0aW9ucyBmcm9tICcuL2ludGVyZmFjZXMvQVBJRXJyb3JPcHRpb25zJztcblxuY29uc3QgY3JlYXRlT3B0aW9ucyA9IHtcbiAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cbn07XG5leHBvcnQgY2xhc3MgU3VwcHJlc3Npb24ge1xuICB0eXBlOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHR5cGU6IFN1cHByZXNzaW9uTW9kZWxzKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEJvdW5jZSBleHRlbmRzIFN1cHByZXNzaW9uIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjb2RlOiBudW1iZXI7XG4gIGVycm9yOiBzdHJpbmc7XG4gIGNyZWF0ZWRfYXQ6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogQm91bmNlRGF0YSkge1xuICAgIHN1cGVyKFN1cHByZXNzaW9uTW9kZWxzLkJPVU5DRVMpO1xuICAgIHRoaXMuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcztcbiAgICB0aGlzLmNvZGUgPSArZGF0YS5jb2RlO1xuICAgIHRoaXMuZXJyb3IgPSBkYXRhLmVycm9yO1xuICAgIHRoaXMuY3JlYXRlZF9hdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZF9hdCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBsYWludCBleHRlbmRzIFN1cHByZXNzaW9uIHtcbiAgYWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjcmVhdGVkX2F0OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IENvbXBsYWludERhdGEpIHtcbiAgICBzdXBlcihTdXBwcmVzc2lvbk1vZGVscy5DT01QTEFJTlRTKTtcbiAgICB0aGlzLmFkZHJlc3MgPSBkYXRhLmFkZHJlc3M7XG4gICAgdGhpcy5jcmVhdGVkX2F0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkX2F0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5zdWJzY3JpYmUgZXh0ZW5kcyBTdXBwcmVzc2lvbiB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgdGFnczogc3RyaW5nW107XG4gIGNyZWF0ZWRfYXQ6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogVW5zdWJzY3JpYmVEYXRhKSB7XG4gICAgc3VwZXIoU3VwcHJlc3Npb25Nb2RlbHMuVU5TVUJTQ1JJQkVTKTtcbiAgICB0aGlzLmFkZHJlc3MgPSBkYXRhLmFkZHJlc3M7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZF9hdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZF9hdCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdoaXRlTGlzdCBleHRlbmRzIFN1cHByZXNzaW9uIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBXaGl0ZUxpc3REYXRhKSB7XG4gICAgc3VwZXIoU3VwcHJlc3Npb25Nb2RlbHMuV0hJVEVMSVNUUyk7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWU7XG4gICAgdGhpcy5yZWFzb24gPSBkYXRhLnJlYXNvbjtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZEF0KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdXBwcmVzc2lvbkNsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gIG1vZGVsczogTWFwPHN0cmluZywgYW55PjtcblxuICBjb25zdHJ1Y3RvcihyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLm1vZGVscyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm1vZGVscy5zZXQoJ2JvdW5jZXMnLCBCb3VuY2UpO1xuICAgIHRoaXMubW9kZWxzLnNldCgnY29tcGxhaW50cycsIENvbXBsYWludCk7XG4gICAgdGhpcy5tb2RlbHMuc2V0KCd1bnN1YnNjcmliZXMnLCBVbnN1YnNjcmliZSk7XG4gICAgdGhpcy5tb2RlbHMuc2V0KCd3aGl0ZWxpc3RzJywgV2hpdGVMaXN0KTtcbiAgfVxuXG4gIF9wYXJzZVBhZ2UoaWQ6IHN0cmluZywgcGFnZVVybDogc3RyaW5nKSA6IFBhcnNlZFBhZ2Uge1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocGFnZVVybCk7XG4gICAgY29uc3QgeyBzZWFyY2hQYXJhbXMgfSA9IHBhcnNlZFVybDtcbiAgICByZXR1cm4ge1xuICAgICAgaWQsXG4gICAgICBwYWdlOiBzZWFyY2hQYXJhbXMuaGFzKCdwYWdlJykgPyBzZWFyY2hQYXJhbXMuZ2V0KCdwYWdlJykgOiB1bmRlZmluZWQsXG4gICAgICBhZGRyZXNzOiBzZWFyY2hQYXJhbXMuaGFzKCdhZGRyZXNzJykgPyBzZWFyY2hQYXJhbXMuZ2V0KCdhZGRyZXNzJykgOiB1bmRlZmluZWQsXG4gICAgICB1cmw6IHBhZ2VVcmxcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlUGFnZUxpbmtzKHJlc3BvbnNlOiBTdXBwcmVzc2lvbkxpc3RSZXNwb25zZSk6IFBhcnNlZFBhZ2VzTGlzdCB7XG4gICAgY29uc3QgcGFnZXMgPSBPYmplY3QuZW50cmllcyhyZXNwb25zZS5ib2R5LnBhZ2luZyBhcyBQYWdlc0xpc3QpO1xuICAgIHJldHVybiBwYWdlcy5yZWR1Y2UoXG4gICAgICAoYWNjOiBQYWdlc0xpc3RBY2N1bXVsYXRvciwgcGFpcjogW3BhZ2VVcmw6IHN0cmluZywgaWQ6IHN0cmluZ10pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBwYWlyWzBdO1xuICAgICAgICBjb25zdCBwYWdlVXJsID0gcGFpclsxXTtcbiAgICAgICAgYWNjW2lkXSA9IHRoaXMuX3BhcnNlUGFnZShpZCwgcGFnZVVybCk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fVxuICAgICkgYXMgdW5rbm93biBhcyBQYXJzZWRQYWdlc0xpc3Q7XG4gIH1cblxuICBfcGFyc2VMaXN0KFxuICAgIHJlc3BvbnNlOiBTdXBwcmVzc2lvbkxpc3RSZXNwb25zZSxcbiAgICBNb2RlbDoge1xuICAgICAgbmV3KGRhdGE6IEJvdW5jZURhdGEgfCBDb21wbGFpbnREYXRhIHwgVW5zdWJzY3JpYmVEYXRhIHwgV2hpdGVMaXN0RGF0YSk6XG4gICAgICBCb3VuY2UgfCBDb21wbGFpbnQgfCBVbnN1YnNjcmliZSB8IFdoaXRlTGlzdFxuICAgIH1cbiAgKTogU3VwcHJlc3Npb25MaXN0IHtcbiAgICBjb25zdCBkYXRhID0ge30gYXMgU3VwcHJlc3Npb25MaXN0O1xuICAgIGRhdGEuaXRlbXMgPSByZXNwb25zZS5ib2R5Lml0ZW1zLm1hcCgoaXRlbSkgPT4gbmV3IE1vZGVsKGl0ZW0pKTtcblxuICAgIGRhdGEucGFnZXMgPSB0aGlzLl9wYXJzZVBhZ2VMaW5rcyhyZXNwb25zZSk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIF9wYXJzZUl0ZW08VCBleHRlbmRzIFN1cHByZXNzaW9uPihcbiAgICBkYXRhIDogQm91bmNlRGF0YSB8IENvbXBsYWludERhdGEgfCBVbnN1YnNjcmliZURhdGEgfCBXaGl0ZUxpc3REYXRhLFxuICAgIE1vZGVsOiB7XG4gICAgICBuZXcoZGF0YTogQm91bmNlRGF0YSB8IENvbXBsYWludERhdGEgfCBVbnN1YnNjcmliZURhdGEgfCBXaGl0ZUxpc3REYXRhKTpcbiAgICAgIFRcbiAgICB9XG4gICk6IFQge1xuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdoaXRlTGlzdChcbiAgICBkb21haW46IHN0cmluZyxcbiAgICBkYXRhOiBTdXBwcmVzc2lvbkNyZWF0aW9uRGF0YSB8IFN1cHByZXNzaW9uQ3JlYXRpb25EYXRhW11cbiAgKTogUHJvbWlzZTxTdXBwcmVzc2lvbkNyZWF0aW9uUmVzdWx0PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcih7XG4gICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICBzdGF0dXNUZXh0OiAnRGF0YSBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gb2JqZWN0JyxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1lc3NhZ2U6ICdXaGl0ZWxpc3RcXCdzIGNyZWF0aW9uIHByb2Nlc3MgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjcmVhdGlvbnMuIERhdGEgcHJvcGVydHkgc2hvdWxkIGJlIGFuIG9iamVjdCdcbiAgICAgICAgfVxuICAgICAgfSBhcyBBUElFcnJvck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0XG4gICAgICAucG9zdFdpdGhGRCh1cmxqb2luKCd2MycsIGRvbWFpbiwgJ3doaXRlbGlzdHMnKSwgZGF0YSlcbiAgICAgIC50aGVuKHRoaXMucHJlcGFyZVJlc3BvbnNlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5tb2RlbHMuaGFzKHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJRXJyb3Ioe1xuICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgc3RhdHVzVGV4dDogJ1Vua25vd24gdHlwZSB2YWx1ZScsXG4gICAgICAgIGJvZHk6IHsgbWVzc2FnZTogJ1R5cGUgbWF5IGJlIG9ubHkgb25lIG9mIFtib3VuY2VzLCBjb21wbGFpbnRzLCB1bnN1YnNjcmliZXMsIHdoaXRlbGlzdHNdJyB9XG4gICAgICB9IGFzIEFQSUVycm9yT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUmVzcG9uc2UocmVzcG9uc2U6IFN1cHByZXNzaW9uQ3JlYXRpb25SZXNwb25zZSk6IFN1cHByZXNzaW9uQ3JlYXRpb25SZXN1bHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICB0eXBlOiByZXNwb25zZS5ib2R5LnR5cGUgfHwgJycsXG4gICAgICB2YWx1ZTogcmVzcG9uc2UuYm9keS52YWx1ZSB8fCAnJyxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzXG4gICAgfTtcbiAgfVxuXG4gIGxpc3QoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHF1ZXJ5PzogU3VwcHJlc3Npb25MaXN0UXVlcnlcbiAgKTogUHJvbWlzZTxTdXBwcmVzc2lvbkxpc3Q+IHtcbiAgICB0aGlzLmNoZWNrVHlwZSh0eXBlKTtcblxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHMuZ2V0KHR5cGUpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5nZXQodXJsam9pbigndjMnLCBkb21haW4sIHR5cGUpLCBxdWVyeSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogU3VwcHJlc3Npb25MaXN0UmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlTGlzdChyZXNwb25zZSwgbW9kZWwpKTtcbiAgfVxuXG4gIGdldChcbiAgICBkb21haW46IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgYWRkcmVzczogc3RyaW5nXG4gICk6IFByb21pc2U8Qm91bmNlIHwgQ29tcGxhaW50IHwgVW5zdWJzY3JpYmUgfCBXaGl0ZUxpc3Q+IHtcbiAgICB0aGlzLmNoZWNrVHlwZSh0eXBlKTtcblxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHMuZ2V0KHR5cGUpO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RcbiAgICAgIC5nZXQodXJsam9pbigndjMnLCBkb21haW4sIHR5cGUsIGVuY29kZVVSSUNvbXBvbmVudChhZGRyZXNzKSkpXG4gICAgICAudGhlbigocmVzcG9uc2U6IFN1cHByZXNzaW9uUmVzcG9uc2UpID0+IHRoaXMuX3BhcnNlSXRlbTx0eXBlb2YgbW9kZWw+KHJlc3BvbnNlLmJvZHksIG1vZGVsKSk7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgZG9tYWluOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGRhdGE6IFN1cHByZXNzaW9uQ3JlYXRpb25EYXRhIHwgU3VwcHJlc3Npb25DcmVhdGlvbkRhdGFbXVxuICApOiBQcm9taXNlPFN1cHByZXNzaW9uQ3JlYXRpb25SZXN1bHQ+IHtcbiAgICB0aGlzLmNoZWNrVHlwZSh0eXBlKTtcbiAgICAvLyBzdXBwb3J0cyBhZGRpbmcgbXVsdGlwbGUgc3VwcHJlc3Npb25zIGJ5IGRlZmF1bHRcbiAgICBsZXQgcG9zdERhdGE7XG4gICAgaWYgKHR5cGUgPT09ICd3aGl0ZWxpc3RzJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlV2hpdGVMaXN0KGRvbWFpbiwgZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBwb3N0RGF0YSA9IFtkYXRhXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBbLi4uZGF0YV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFxuICAgICAgLnBvc3QodXJsam9pbigndjMnLCBkb21haW4sIHR5cGUpLCBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksIGNyZWF0ZU9wdGlvbnMpXG4gICAgICAudGhlbih0aGlzLnByZXBhcmVSZXNwb25zZSk7XG4gIH1cblxuICBkZXN0cm95KFxuICAgIGRvbWFpbjogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTdXBwcmVzc2lvbkRlc3Ryb3lSZXN1bHQ+IHtcbiAgICB0aGlzLmNoZWNrVHlwZSh0eXBlKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0XG4gICAgICAuZGVsZXRlKHVybGpvaW4oJ3YzJywgZG9tYWluLCB0eXBlLCBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlOiBTdXBwcmVzc2lvbkRlc3Ryb3lSZXNwb25zZSkgPT4gKHtcbiAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlLFxuICAgICAgICB2YWx1ZTogcmVzcG9uc2UuYm9keS52YWx1ZSB8fCAnJyxcbiAgICAgICAgYWRkcmVzczogcmVzcG9uc2UuYm9keS5hZGRyZXNzIHx8ICcnLFxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgfSkpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3VwcHJlc3Npb25DbGllbnQ7XG4iLCJpbXBvcnQgeyBJTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL011bHRpcGxlVmFsaWRhdGlvbic7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0LCBWYWxpZGF0aW9uUmVzcG9uc2UsIFZhbGlkYXRpb25RdWVyeSB9IGZyb20gJy4vaW50ZXJmYWNlcy9WYWxpZGF0ZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0ZUNsaWVudCB7XG4gIHB1YmxpYyBtdWx0aXBsZVZhbGlkYXRpb247XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCwgbXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50OiBJTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50KSB7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLm11bHRpcGxlVmFsaWRhdGlvbiA9IG11bHRpcGxlVmFsaWRhdGlvbkNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIGdldChhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBxdWVyeTogVmFsaWRhdGlvblF1ZXJ5ID0geyBhZGRyZXNzIH07XG4gICAgY29uc3QgcmVzdWx0OiBWYWxpZGF0aW9uUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvdjQvYWRkcmVzcy92YWxpZGF0ZScsIHF1ZXJ5KTtcbiAgICByZXR1cm4gcmVzdWx0LmJvZHkgYXMgVmFsaWRhdGlvblJlc3VsdDtcbiAgfVxufVxuIiwiaW1wb3J0IHVybGpvaW4gZnJvbSAndXJsLWpvaW4nO1xuXG5pbXBvcnQge1xuICBWYWxpZGF0aW9uUmVzcG9uc2UsXG4gIFdlYmhvb2tMaXN0LFxuICBXZWJob29rUmVzcG9uc2UsXG4gIFdlYmhvb2tzSWRzLFxuICBXZWJob29rc1F1ZXJ5XG59IGZyb20gJy4vaW50ZXJmYWNlcy9XZWJob29rcyc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuXG5jbGFzcyBXZWJob29rIHtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViaG9va0NsaWVudCB7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIH1cblxuICBfcGFyc2VXZWJob29rTGlzdChyZXNwb25zZTogeyBib2R5OiB7IHdlYmhvb2tzOiBXZWJob29rTGlzdCB9IH0pOiBXZWJob29rTGlzdCB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkud2ViaG9va3M7XG4gIH1cblxuICBfcGFyc2VXZWJob29rV2l0aElEKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlOiBXZWJob29rUmVzcG9uc2UpOiBXZWJob29rIHtcbiAgICAgIGNvbnN0IHdlYmhvb2tSZXNwb25zZSA9IHJlc3BvbnNlPy5ib2R5Py53ZWJob29rO1xuICAgICAgbGV0IHVybCA9IHdlYmhvb2tSZXNwb25zZT8udXJsO1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgdXJsID0gd2ViaG9va1Jlc3BvbnNlPy51cmxzICYmIHdlYmhvb2tSZXNwb25zZS51cmxzLmxlbmd0aFxuICAgICAgICAgID8gd2ViaG9va1Jlc3BvbnNlLnVybHNbMF1cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgV2ViaG9vayhpZCwgdXJsKTtcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlV2ViaG9va1Rlc3QocmVzcG9uc2U6IHsgYm9keTogeyBjb2RlOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZyB9IH0pXG4gIDoge2NvZGU6IG51bWJlciwgbWVzc2FnZTpzdHJpbmd9IHtcbiAgICByZXR1cm4geyBjb2RlOiByZXNwb25zZS5ib2R5LmNvZGUsIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZSB9IGFzIFZhbGlkYXRpb25SZXNwb25zZTtcbiAgfVxuXG4gIGxpc3QoZG9tYWluOiBzdHJpbmcsIHF1ZXJ5OiBXZWJob29rc1F1ZXJ5KTogUHJvbWlzZTxXZWJob29rTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0KHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnKSwgcXVlcnkpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tMaXN0KTtcbiAgfVxuXG4gIGdldChkb21haW46IHN0cmluZywgaWQ6IFdlYmhvb2tzSWRzKTogUHJvbWlzZTxXZWJob29rPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXQodXJsam9pbignL3YzL2RvbWFpbnMnLCBkb21haW4sICd3ZWJob29rcycsIGlkKSlcbiAgICAgIC50aGVuKHRoaXMuX3BhcnNlV2ViaG9va1dpdGhJRChpZCkpO1xuICB9XG5cbiAgY3JlYXRlKGRvbWFpbjogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGVzdCA9IGZhbHNlKTogUHJvbWlzZTxXZWJob29rIHwgVmFsaWRhdGlvblJlc3BvbnNlPiB7XG4gICAgaWYgKHRlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QucHV0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnLCBpZCwgJ3Rlc3QnKSwgeyB1cmwgfSlcbiAgICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rVGVzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdC5wb3N0V2l0aEZEKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnKSwgeyBpZCwgdXJsIH0pXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tXaXRoSUQoaWQpKTtcbiAgfVxuXG4gIHVwZGF0ZShkb21haW46IHN0cmluZywgaWQ6IHN0cmluZywgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFdlYmhvb2s+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LnB1dFdpdGhGRCh1cmxqb2luKCcvdjMvZG9tYWlucycsIGRvbWFpbiwgJ3dlYmhvb2tzJywgaWQpLCB7IHVybCB9KVxuICAgICAgLnRoZW4odGhpcy5fcGFyc2VXZWJob29rV2l0aElEKGlkKSk7XG4gIH1cblxuICBkZXN0cm95KGRvbWFpbjogc3RyaW5nLCBpZDogc3RyaW5nKSA6IFByb21pc2U8V2ViaG9vaz4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZGVsZXRlKHVybGpvaW4oJy92My9kb21haW5zJywgZG9tYWluLCAnd2ViaG9va3MnLCBpZCkpXG4gICAgICAudGhlbih0aGlzLl9wYXJzZVdlYmhvb2tXaXRoSUQoaWQpKTtcbiAgfVxufVxuIiwiLyohIGh0dHBzOi8vbXRocy5iZS9iYXNlNjQgdjEuMC4wIGJ5IEBtYXRoaWFzIHwgTUlUIGxpY2Vuc2UgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlcyBgZXhwb3J0c2AuXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHM7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuXG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHRtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cyAmJiBtb2R1bGU7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAsIGZyb20gTm9kZS5qcyBvciBCcm93c2VyaWZpZWQgY29kZSwgYW5kIHVzZVxuXHQvLyBpdCBhcyBgcm9vdGAuXG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIEludmFsaWRDaGFyYWN0ZXJFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHR9O1xuXHRJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yO1xuXHRJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnSW52YWxpZENoYXJhY3RlckVycm9yJztcblxuXHR2YXIgZXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0Ly8gTm90ZTogdGhlIGVycm9yIG1lc3NhZ2VzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGZpbGUgbWF0Y2ggdGhvc2UgdXNlZCBieVxuXHRcdC8vIHRoZSBuYXRpdmUgYGF0b2JgL2BidG9hYCBpbXBsZW1lbnRhdGlvbiBpbiBDaHJvbWl1bS5cblx0XHR0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckVycm9yKG1lc3NhZ2UpO1xuXHR9O1xuXG5cdHZhciBUQUJMRSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblx0Ly8gaHR0cDovL3doYXR3Zy5vcmcvaHRtbC9jb21tb24tbWljcm9zeW50YXhlcy5odG1sI3NwYWNlLWNoYXJhY3RlclxuXHR2YXIgUkVHRVhfU1BBQ0VfQ0hBUkFDVEVSUyA9IC9bXFx0XFxuXFxmXFxyIF0vZztcblxuXHQvLyBgZGVjb2RlYCBpcyBkZXNpZ25lZCB0byBiZSBmdWxseSBjb21wYXRpYmxlIHdpdGggYGF0b2JgIGFzIGRlc2NyaWJlZCBpbiB0aGVcblx0Ly8gSFRNTCBTdGFuZGFyZC4gaHR0cDovL3doYXR3Zy5vcmcvaHRtbC93ZWJhcHBhcGlzLmh0bWwjZG9tLXdpbmRvd2Jhc2U2NC1hdG9iXG5cdC8vIFRoZSBvcHRpbWl6ZWQgYmFzZTY0LWRlY29kaW5nIGFsZ29yaXRobSB1c2VkIGlzIGJhc2VkIG9uIEBhdGvigJlzIGV4Y2VsbGVudFxuXHQvLyBpbXBsZW1lbnRhdGlvbi4gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vYXRrLzEwMjAzOTZcblx0dmFyIGRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0aW5wdXQgPSBTdHJpbmcoaW5wdXQpXG5cdFx0XHQucmVwbGFjZShSRUdFWF9TUEFDRV9DSEFSQUNURVJTLCAnJyk7XG5cdFx0dmFyIGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0XHRpZiAobGVuZ3RoICUgNCA9PSAwKSB7XG5cdFx0XHRpbnB1dCA9IGlucHV0LnJlcGxhY2UoLz09PyQvLCAnJyk7XG5cdFx0XHRsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdGxlbmd0aCAlIDQgPT0gMSB8fFxuXHRcdFx0Ly8gaHR0cDovL3doYXR3Zy5vcmcvQyNhbHBoYW51bWVyaWMtYXNjaWktY2hhcmFjdGVyc1xuXHRcdFx0L1teK2EtekEtWjAtOS9dLy50ZXN0KGlucHV0KVxuXHRcdCkge1xuXHRcdFx0ZXJyb3IoXG5cdFx0XHRcdCdJbnZhbGlkIGNoYXJhY3RlcjogdGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4nXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR2YXIgYml0Q291bnRlciA9IDA7XG5cdFx0dmFyIGJpdFN0b3JhZ2U7XG5cdFx0dmFyIGJ1ZmZlcjtcblx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0dmFyIHBvc2l0aW9uID0gLTE7XG5cdFx0d2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHtcblx0XHRcdGJ1ZmZlciA9IFRBQkxFLmluZGV4T2YoaW5wdXQuY2hhckF0KHBvc2l0aW9uKSk7XG5cdFx0XHRiaXRTdG9yYWdlID0gYml0Q291bnRlciAlIDQgPyBiaXRTdG9yYWdlICogNjQgKyBidWZmZXIgOiBidWZmZXI7XG5cdFx0XHQvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCBvZiA0IGNoYXJhY3RlcnPigKZcblx0XHRcdGlmIChiaXRDb3VudGVyKysgJSA0KSB7XG5cdFx0XHRcdC8vIOKApmNvbnZlcnQgdGhlIGZpcnN0IDggYml0cyB0byBhIHNpbmdsZSBBU0NJSSBjaGFyYWN0ZXIuXG5cdFx0XHRcdG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuXHRcdFx0XHRcdDB4RkYgJiBiaXRTdG9yYWdlID4+ICgtMiAqIGJpdENvdW50ZXIgJiA2KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9O1xuXG5cdC8vIGBlbmNvZGVgIGlzIGRlc2lnbmVkIHRvIGJlIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBgYnRvYWAgYXMgZGVzY3JpYmVkIGluIHRoZVxuXHQvLyBIVE1MIFN0YW5kYXJkOiBodHRwOi8vd2hhdHdnLm9yZy9odG1sL3dlYmFwcGFwaXMuaHRtbCNkb20td2luZG93YmFzZTY0LWJ0b2Fcblx0dmFyIGVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0aW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuXHRcdGlmICgvW15cXDAtXFx4RkZdLy50ZXN0KGlucHV0KSkge1xuXHRcdFx0Ly8gTm90ZTogbm8gbmVlZCB0byBzcGVjaWFsLWNhc2UgYXN0cmFsIHN5bWJvbHMgaGVyZSwgYXMgc3Vycm9nYXRlcyBhcmVcblx0XHRcdC8vIG1hdGNoZWQsIGFuZCB0aGUgaW5wdXQgaXMgc3VwcG9zZWQgdG8gb25seSBjb250YWluIEFTQ0lJIGFueXdheS5cblx0XHRcdGVycm9yKFxuXHRcdFx0XHQnVGhlIHN0cmluZyB0byBiZSBlbmNvZGVkIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZSBvZiB0aGUgJyArXG5cdFx0XHRcdCdMYXRpbjEgcmFuZ2UuJ1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0dmFyIHBhZGRpbmcgPSBpbnB1dC5sZW5ndGggJSAzO1xuXHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHR2YXIgcG9zaXRpb24gPSAtMTtcblx0XHR2YXIgYTtcblx0XHR2YXIgYjtcblx0XHR2YXIgYztcblx0XHR2YXIgYnVmZmVyO1xuXHRcdC8vIE1ha2Ugc3VyZSBhbnkgcGFkZGluZyBpcyBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIGxvb3AuXG5cdFx0dmFyIGxlbmd0aCA9IGlucHV0Lmxlbmd0aCAtIHBhZGRpbmc7XG5cblx0XHR3aGlsZSAoKytwb3NpdGlvbiA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gUmVhZCB0aHJlZSBieXRlcywgaS5lLiAyNCBiaXRzLlxuXHRcdFx0YSA9IGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24pIDw8IDE2O1xuXHRcdFx0YiA9IGlucHV0LmNoYXJDb2RlQXQoKytwb3NpdGlvbikgPDwgODtcblx0XHRcdGMgPSBpbnB1dC5jaGFyQ29kZUF0KCsrcG9zaXRpb24pO1xuXHRcdFx0YnVmZmVyID0gYSArIGIgKyBjO1xuXHRcdFx0Ly8gVHVybiB0aGUgMjQgYml0cyBpbnRvIGZvdXIgY2h1bmtzIG9mIDYgYml0cyBlYWNoLCBhbmQgYXBwZW5kIHRoZVxuXHRcdFx0Ly8gbWF0Y2hpbmcgY2hhcmFjdGVyIGZvciBlYWNoIG9mIHRoZW0gdG8gdGhlIG91dHB1dC5cblx0XHRcdG91dHB1dCArPSAoXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMTggJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMTIgJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gNiAmIDB4M0YpICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciAmIDB4M0YpXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChwYWRkaW5nID09IDIpIHtcblx0XHRcdGEgPSBpbnB1dC5jaGFyQ29kZUF0KHBvc2l0aW9uKSA8PCA4O1xuXHRcdFx0YiA9IGlucHV0LmNoYXJDb2RlQXQoKytwb3NpdGlvbik7XG5cdFx0XHRidWZmZXIgPSBhICsgYjtcblx0XHRcdG91dHB1dCArPSAoXG5cdFx0XHRcdFRBQkxFLmNoYXJBdChidWZmZXIgPj4gMTApICtcblx0XHRcdFx0VEFCTEUuY2hhckF0KChidWZmZXIgPj4gNCkgJiAweDNGKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdCgoYnVmZmVyIDw8IDIpICYgMHgzRikgK1xuXHRcdFx0XHQnPSdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChwYWRkaW5nID09IDEpIHtcblx0XHRcdGJ1ZmZlciA9IGlucHV0LmNoYXJDb2RlQXQocG9zaXRpb24pO1xuXHRcdFx0b3V0cHV0ICs9IChcblx0XHRcdFx0VEFCTEUuY2hhckF0KGJ1ZmZlciA+PiAyKSArXG5cdFx0XHRcdFRBQkxFLmNoYXJBdCgoYnVmZmVyIDw8IDQpICYgMHgzRikgK1xuXHRcdFx0XHQnPT0nXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH07XG5cblx0dmFyIGJhc2U2NCA9IHtcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCdkZWNvZGUnOiBkZWNvZGUsXG5cdFx0J3ZlcnNpb24nOiAnMS4wLjAnXG5cdH07XG5cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gYmFzZTY0O1xuXHRcdH0pO1xuXHR9XHRlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiAhZnJlZUV4cG9ydHMubm9kZVR5cGUpIHtcblx0XHRpZiAoZnJlZU1vZHVsZSkgeyAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gYmFzZTY0O1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gYmFzZTY0KSB7XG5cdFx0XHRcdGJhc2U2NC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gYmFzZTY0W2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHsgLy8gaW4gUmhpbm8gb3IgYSB3ZWIgYnJvd3NlclxuXHRcdHJvb3QuYmFzZTY0ID0gYmFzZTY0O1xuXHR9XG5cbn0odGhpcykpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIFJldHVybnMgYSBgQnVmZmVyYCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBkYXRhIFVSSSBgdXJpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIERhdGEgVVJJIHRvIHR1cm4gaW50byBhIEJ1ZmZlciBpbnN0YW5jZVxuICogQHJldHVybiB7QnVmZmVyfSBCdWZmZXIgaW5zdGFuY2UgZnJvbSBEYXRhIFVSSVxuICogQGFwaSBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gZGF0YVVyaVRvQnVmZmVyKHVyaSkge1xuICAgIGlmICghL15kYXRhOi9pLnRlc3QodXJpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgdXJpYCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBEYXRhIFVSSSAobXVzdCBiZWdpbiB3aXRoIFwiZGF0YTpcIiknKTtcbiAgICB9XG4gICAgLy8gc3RyaXAgbmV3bGluZXNcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgLy8gc3BsaXQgdGhlIFVSSSB1cCBpbnRvIHRoZSBcIm1ldGFkYXRhXCIgYW5kIHRoZSBcImRhdGFcIiBwb3J0aW9uc1xuICAgIGNvbnN0IGZpcnN0Q29tbWEgPSB1cmkuaW5kZXhPZignLCcpO1xuICAgIGlmIChmaXJzdENvbW1hID09PSAtMSB8fCBmaXJzdENvbW1hIDw9IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFsZm9ybWVkIGRhdGE6IFVSSScpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgdGhlIFwiZGF0YTpcIiBzY2hlbWUgYW5kIHBhcnNlIHRoZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGEgPSB1cmkuc3Vic3RyaW5nKDUsIGZpcnN0Q29tbWEpLnNwbGl0KCc7Jyk7XG4gICAgbGV0IGNoYXJzZXQgPSAnJztcbiAgICBsZXQgYmFzZTY0ID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IG1ldGFbMF0gfHwgJ3RleHQvcGxhaW4nO1xuICAgIGxldCB0eXBlRnVsbCA9IHR5cGU7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtZXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtZXRhW2ldID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgYmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVGdWxsICs9IGA7JHttZXRhW2ldfWA7XG4gICAgICAgICAgICBpZiAobWV0YVtpXS5pbmRleE9mKCdjaGFyc2V0PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2hhcnNldCA9IG1ldGFbaV0uc3Vic3RyaW5nKDgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGRlZmF1bHRzIHRvIFVTLUFTQ0lJIG9ubHkgaWYgdHlwZSBpcyBub3QgcHJvdmlkZWRcbiAgICBpZiAoIW1ldGFbMF0gJiYgIWNoYXJzZXQubGVuZ3RoKSB7XG4gICAgICAgIHR5cGVGdWxsICs9ICc7Y2hhcnNldD1VUy1BU0NJSSc7XG4gICAgICAgIGNoYXJzZXQgPSAnVVMtQVNDSUknO1xuICAgIH1cbiAgICAvLyBnZXQgdGhlIGVuY29kZWQgZGF0YSBwb3J0aW9uIGFuZCBkZWNvZGUgVVJJLWVuY29kZWQgY2hhcnNcbiAgICBjb25zdCBlbmNvZGluZyA9IGJhc2U2NCA/ICdiYXNlNjQnIDogJ2FzY2lpJztcbiAgICBjb25zdCBkYXRhID0gdW5lc2NhcGUodXJpLnN1YnN0cmluZyhmaXJzdENvbW1hICsgMSkpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEsIGVuY29kaW5nKTtcbiAgICAvLyBzZXQgYC50eXBlYCBhbmQgYC50eXBlRnVsbGAgcHJvcGVydGllcyB0byBNSU1FIHR5cGVcbiAgICBidWZmZXIudHlwZSA9IHR5cGU7XG4gICAgYnVmZmVyLnR5cGVGdWxsID0gdHlwZUZ1bGw7XG4gICAgLy8gc2V0IHRoZSBgLmNoYXJzZXRgIHByb3BlcnR5XG4gICAgYnVmZmVyLmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgIHJldHVybiBidWZmZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRhdGFVcmlUb0J1ZmZlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYSA8aHR0cHM6Ly9naXRodWIuY29tL215c3RpY2F0ZWE+XG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcml2YXRlRGF0YVxuICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7e3R5cGU6c3RyaW5nfX0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBldmVudFBoYXNlIFRoZSBjdXJyZW50IGV2ZW50IHBoYXNlLlxuICogQHByb3BlcnR5IHtFdmVudFRhcmdldHxudWxsfSBjdXJyZW50VGFyZ2V0IFRoZSBjdXJyZW50IGV2ZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2FuY2VsZWQgVGhlIGZsYWcgdG8gcHJldmVudCBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBzdG9wcGVkIFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGltbWVkaWF0ZVN0b3BwZWQgVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbiBpbW1lZGlhdGVseS5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb258bnVsbH0gcGFzc2l2ZUxpc3RlbmVyIFRoZSBsaXN0ZW5lciBpZiB0aGUgY3VycmVudCBsaXN0ZW5lciBpcyBwYXNzaXZlLiBPdGhlcndpc2UgdGhpcyBpcyBudWxsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVTdGFtcCBUaGUgdW5peCB0aW1lLlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIFByaXZhdGUgZGF0YSBmb3IgZXZlbnQgd3JhcHBlcnMuXG4gKiBAdHlwZSB7V2Vha01hcDxFdmVudCwgUHJpdmF0ZURhdGE+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgcHJpdmF0ZURhdGEgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIENhY2hlIGZvciB3cmFwcGVyIGNsYXNzZXMuXG4gKiBAdHlwZSB7V2Vha01hcDxPYmplY3QsIEZ1bmN0aW9uPn1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHdyYXBwZXJzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBHZXQgcHJpdmF0ZSBkYXRhLlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdCB0byBnZXQgcHJpdmF0ZSBkYXRhLlxuICogQHJldHVybnMge1ByaXZhdGVEYXRhfSBUaGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBldmVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHBkKGV2ZW50KSB7XG4gICAgY29uc3QgcmV0diA9IHByaXZhdGVEYXRhLmdldChldmVudCk7XG4gICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIHJldHYgIT0gbnVsbCxcbiAgICAgICAgXCIndGhpcycgaXMgZXhwZWN0ZWQgYW4gRXZlbnQgb2JqZWN0LCBidXQgZ290XCIsXG4gICAgICAgIGV2ZW50XG4gICAgKTtcbiAgICByZXR1cm4gcmV0dlxufVxuXG4vKipcbiAqIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jc2V0LXRoZS1jYW5jZWxlZC1mbGFnXG4gKiBAcGFyYW0gZGF0YSB7UHJpdmF0ZURhdGF9IHByaXZhdGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FuY2VsRmxhZyhkYXRhKSB7XG4gICAgaWYgKGRhdGEucGFzc2l2ZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIFwiVW5hYmxlIHRvIHByZXZlbnREZWZhdWx0IGluc2lkZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVyIGludm9jYXRpb24uXCIsXG4gICAgICAgICAgICAgICAgZGF0YS5wYXNzaXZlTGlzdGVuZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghZGF0YS5ldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRhdGEuY2FuY2VsZWQgPSB0cnVlO1xuICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5wcmV2ZW50RGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGRhdGEuZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS1ldmVudFxuICogQHByaXZhdGVcbiAqL1xuLyoqXG4gKiBUaGUgZXZlbnQgd3JhcHBlci5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldCBvZiB0aGlzIGRpc3BhdGNoaW5nLlxuICogQHBhcmFtIHtFdmVudHx7dHlwZTpzdHJpbmd9fSBldmVudCBUaGUgb3JpZ2luYWwgZXZlbnQgdG8gd3JhcC5cbiAqL1xuZnVuY3Rpb24gRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50KSB7XG4gICAgcHJpdmF0ZURhdGEuc2V0KHRoaXMsIHtcbiAgICAgICAgZXZlbnRUYXJnZXQsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBldmVudFBoYXNlOiAyLFxuICAgICAgICBjdXJyZW50VGFyZ2V0OiBldmVudFRhcmdldCxcbiAgICAgICAgY2FuY2VsZWQ6IGZhbHNlLFxuICAgICAgICBzdG9wcGVkOiBmYWxzZSxcbiAgICAgICAgaW1tZWRpYXRlU3RvcHBlZDogZmFsc2UsXG4gICAgICAgIHBhc3NpdmVMaXN0ZW5lcjogbnVsbCxcbiAgICAgICAgdGltZVN0YW1wOiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKSxcbiAgICB9KTtcblxuICAgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI1VuZm9yZ2VhYmxlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaXNUcnVzdGVkXCIsIHsgdmFsdWU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4gICAgLy8gRGVmaW5lIGFjY2Vzc29yc1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhldmVudCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwgZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKGtleSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBTaG91bGQgYmUgZW51bWVyYWJsZSwgYnV0IGNsYXNzIG1ldGhvZHMgYXJlIG5vdCBlbnVtZXJhYmxlLlxuRXZlbnQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50LnR5cGVcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKi9cbiAgICBnZXQgdGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH1cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudFRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmN1cnJlbnRUYXJnZXRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge0V2ZW50VGFyZ2V0W119IFRoZSBjb21wb3NlZCBwYXRoIG9mIHRoaXMgZXZlbnQuXG4gICAgICovXG4gICAgY29tcG9zZWRQYXRoKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gcGQodGhpcykuY3VycmVudFRhcmdldDtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjdXJyZW50VGFyZ2V0XVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiBOT05FLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IE5PTkUoKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIENBUFRVUklOR19QSEFTRS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBDQVBUVVJJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIEFUX1RBUkdFVC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBBVF9UQVJHRVQoKSB7XG4gICAgICAgIHJldHVybiAyXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIEJVQkJMSU5HX1BIQVNFLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IEJVQkJMSU5HX1BIQVNFKCkge1xuICAgICAgICByZXR1cm4gM1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgZXZlbnRQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50UGhhc2VcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuc3RvcFByb3BhZ2F0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRhdGEuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCBldmVudCBidWJibGluZy5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwZCh0aGlzKTtcblxuICAgICAgICBkYXRhLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBkYXRhLmltbWVkaWF0ZVN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRhdGEuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gYmUgYnViYmxpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGJ1YmJsZXMoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBkKHRoaXMpLmV2ZW50LmJ1YmJsZXMpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIGJlIGNhbmNlbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGNhbmNlbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBkKHRoaXMpLmV2ZW50LmNhbmNlbGFibGUpXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbmNlbCB0aGlzIGV2ZW50LlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICBzZXRDYW5jZWxGbGFnKHBkKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gaW5kaWNhdGUgY2FuY2VsbGF0aW9uIHN0YXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuY2FuY2VsZWRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gYmUgY29tcG9zZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGNvbXBvc2VkKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihwZCh0aGlzKS5ldmVudC5jb21wb3NlZClcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHVuaXggdGltZSBvZiB0aGlzIGV2ZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHRpbWVTdGFtcCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLnRpbWVTdGFtcFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IHNyY0VsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFRhcmdldFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBzdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IGNhbmNlbEJ1YmJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLnN0b3BwZWRcbiAgICB9LFxuICAgIHNldCBjYW5jZWxCdWJibGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IHBkKHRoaXMpO1xuXG4gICAgICAgIGRhdGEuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5jYW5jZWxCdWJibGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBkYXRhLmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gaW5kaWNhdGUgY2FuY2VsbGF0aW9uIHN0YXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IHJldHVyblZhbHVlKCkge1xuICAgICAgICByZXR1cm4gIXBkKHRoaXMpLmNhbmNlbGVkXG4gICAgfSxcbiAgICBzZXQgcmV0dXJuVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgc2V0Q2FuY2VsRmxhZyhwZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGV2ZW50IG9iamVjdC4gQnV0IGRvIG5vdGhpbmcgdW5kZXIgZXZlbnQgZGlzcGF0Y2hpbmcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYnViYmxlcz1mYWxzZV0gVGhlIGZsYWcgdG8gYmUgcG9zc2libGUgdG8gYnViYmxlIHVwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhbmNlbGFibGU9ZmFsc2VdIFRoZSBmbGFnIHRvIGJlIHBvc3NpYmxlIHRvIGNhbmNlbC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluaXRFdmVudCgpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9LFxufTtcblxuLy8gYGNvbnN0cnVjdG9yYCBpcyBub3QgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBFdmVudCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG59KTtcblxuLy8gRW5zdXJlIGBldmVudCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudGAgaXMgYHRydWVgLlxuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5FdmVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihFdmVudC5wcm90b3R5cGUsIHdpbmRvdy5FdmVudC5wcm90b3R5cGUpO1xuXG4gICAgLy8gTWFrZSBhc3NvY2lhdGlvbiBmb3Igd3JhcHBlcnMuXG4gICAgd3JhcHBlcnMuc2V0KHdpbmRvdy5FdmVudC5wcm90b3R5cGUsIEV2ZW50KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gcmVkaXJlY3QgYSBnaXZlbiBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgUHJvcGVydHkgbmFtZSB0byBkZWZpbmUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0IHRoZSBwcm9wZXJ0eS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVJlZGlyZWN0RGVzY3JpcHRvcihrZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRba2V5XVxuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgIHBkKHRoaXMpLmV2ZW50W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gY2FsbCBhIGdpdmVuIG1ldGhvZCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgUHJvcGVydHkgbmFtZSB0byBkZWZpbmUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9IFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGNhbGwgdGhlIG1ldGhvZCBwcm9wZXJ0eS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUNhbGxEZXNjcmlwdG9yKGtleSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlKCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBwZCh0aGlzKS5ldmVudDtcbiAgICAgICAgICAgIHJldHVybiBldmVudFtrZXldLmFwcGx5KGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogRGVmaW5lIG5ldyB3cmFwcGVyIGNsYXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQmFzZUV2ZW50IFRoZSBiYXNlIHdyYXBwZXIgY2xhc3MuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIHByb3RvdHlwZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSBkZWZpbmVkIHdyYXBwZXIgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVXcmFwcGVyKEJhc2VFdmVudCwgcHJvdG8pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvdG8pO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQmFzZUV2ZW50XG4gICAgfVxuXG4gICAgLyoqIEN1c3RvbUV2ZW50ICovXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50KSB7XG4gICAgICAgIEJhc2VFdmVudC5jYWxsKHRoaXMsIGV2ZW50VGFyZ2V0LCBldmVudCk7XG4gICAgfVxuXG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBDdXN0b21FdmVudCwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9LFxuICAgIH0pO1xuXG4gICAgLy8gRGVmaW5lIGFjY2Vzc29ycy5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCEoa2V5IGluIEJhc2VFdmVudC5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGlzRnVuYyA9IHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBpc0Z1bmNcbiAgICAgICAgICAgICAgICAgICAgPyBkZWZpbmVDYWxsRGVzY3JpcHRvcihrZXkpXG4gICAgICAgICAgICAgICAgICAgIDogZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKGtleSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnRcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdyYXBwZXIgY2xhc3Mgb2YgYSBnaXZlbiBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIHByb3RvdHlwZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZ2V0IGl0cyB3cmFwcGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgd3JhcHBlciBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBwZXIocHJvdG8pIHtcbiAgICBpZiAocHJvdG8gPT0gbnVsbCB8fCBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICByZXR1cm4gRXZlbnRcbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlciA9IHdyYXBwZXJzLmdldChwcm90byk7XG4gICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkge1xuICAgICAgICB3cmFwcGVyID0gZGVmaW5lV3JhcHBlcihnZXRXcmFwcGVyKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpLCBwcm90byk7XG4gICAgICAgIHdyYXBwZXJzLnNldChwcm90bywgd3JhcHBlcik7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVyXG59XG5cbi8qKlxuICogV3JhcCBhIGdpdmVuIGV2ZW50IHRvIG1hbmFnZW1lbnQgYSBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IFRoZSBldmVudCB0YXJnZXQgb2YgdGhpcyBkaXNwYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBUaGUgZXZlbnQgdG8gd3JhcC5cbiAqIEByZXR1cm5zIHtFdmVudH0gVGhlIHdyYXBwZXIgaW5zdGFuY2UuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB3cmFwRXZlbnQoZXZlbnRUYXJnZXQsIGV2ZW50KSB7XG4gICAgY29uc3QgV3JhcHBlciA9IGdldFdyYXBwZXIoT2JqZWN0LmdldFByb3RvdHlwZU9mKGV2ZW50KSk7XG4gICAgcmV0dXJuIG5ldyBXcmFwcGVyKGV2ZW50VGFyZ2V0LCBldmVudClcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGltbWVkaWF0ZVN0b3BwZWQgZmxhZyBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIGdldC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uIGltbWVkaWF0ZWx5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNTdG9wcGVkKGV2ZW50KSB7XG4gICAgcmV0dXJuIHBkKGV2ZW50KS5pbW1lZGlhdGVTdG9wcGVkXG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IGV2ZW50IHBoYXNlIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gc2V0IGN1cnJlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50UGhhc2UgTmV3IGV2ZW50IHBoYXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRFdmVudFBoYXNlKGV2ZW50LCBldmVudFBoYXNlKSB7XG4gICAgcGQoZXZlbnQpLmV2ZW50UGhhc2UgPSBldmVudFBoYXNlO1xufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCB0YXJnZXQgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBzZXQgY3VycmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fG51bGx9IGN1cnJlbnRUYXJnZXQgTmV3IGN1cnJlbnQgdGFyZ2V0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDdXJyZW50VGFyZ2V0KGV2ZW50LCBjdXJyZW50VGFyZ2V0KSB7XG4gICAgcGQoZXZlbnQpLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xufVxuXG4vKipcbiAqIFNldCBhIHBhc3NpdmUgbGlzdGVuZXIgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBzZXQgY3VycmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHBhc3NpdmVMaXN0ZW5lciBOZXcgcGFzc2l2ZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0UGFzc2l2ZUxpc3RlbmVyKGV2ZW50LCBwYXNzaXZlTGlzdGVuZXIpIHtcbiAgICBwZChldmVudCkucGFzc2l2ZUxpc3RlbmVyID0gcGFzc2l2ZUxpc3RlbmVyO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExpc3RlbmVyTm9kZVxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqIEBwcm9wZXJ0eSB7MXwyfDN9IGxpc3RlbmVyVHlwZVxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXNzaXZlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9uY2VcbiAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJOb2RlfG51bGx9IG5leHRcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIExpc3RlbmVyTm9kZT4+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgbGlzdGVuZXJzTWFwID0gbmV3IFdlYWtNYXAoKTtcblxuLy8gTGlzdGVuZXIgdHlwZXNcbmNvbnN0IENBUFRVUkUgPSAxO1xuY29uc3QgQlVCQkxFID0gMjtcbmNvbnN0IEFUVFJJQlVURSA9IDM7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdCBvciBub3QuXG4gKiBAcGFyYW0ge2FueX0geCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbn1cblxuLyoqXG4gKiBHZXQgbGlzdGVuZXJzLlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldCB0byBnZXQuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgTGlzdGVuZXJOb2RlPn0gVGhlIGxpc3RlbmVycy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldExpc3RlbmVycyhldmVudFRhcmdldCkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RlbmVyc01hcC5nZXQoZXZlbnRUYXJnZXQpO1xuICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCIndGhpcycgaXMgZXhwZWN0ZWQgYW4gRXZlbnRUYXJnZXQgb2JqZWN0LCBidXQgZ290IGFub3RoZXIgdmFsdWUuXCJcbiAgICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gbGlzdGVuZXJzXG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgZXZlbnQgYXR0cmlidXRlIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIGdldCBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn0gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVFdmVudEF0dHJpYnV0ZURlc2NyaXB0b3IoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXJUeXBlID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubGlzdGVuZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIgJiYgIWlzT2JqZWN0KGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSB0byB0aGUgdGFpbCB3aGlsZSByZW1vdmluZyBvbGQgdmFsdWUuXG4gICAgICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5saXN0ZW5lclR5cGUgPT09IEFUVFJJQlVURSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgb2xkIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5vZGUubmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgbmV3IHZhbHVlLlxuICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHlwZTogQVRUUklCVVRFLFxuICAgICAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb25jZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbmV3Tm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9XG59XG5cbi8qKlxuICogRGVmaW5lIGFuIGV2ZW50IGF0dHJpYnV0ZSAoZS5nLiBgZXZlbnRUYXJnZXQub25jbGlja2ApLlxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50VGFyZ2V0UHJvdG90eXBlIFRoZSBldmVudCB0YXJnZXQgcHJvdG90eXBlIHRvIGRlZmluZSBhbiBldmVudCBhdHRyYml0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gZGVmaW5lLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZUV2ZW50QXR0cmlidXRlKGV2ZW50VGFyZ2V0UHJvdG90eXBlLCBldmVudE5hbWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGV2ZW50VGFyZ2V0UHJvdG90eXBlLFxuICAgICAgICBgb24ke2V2ZW50TmFtZX1gLFxuICAgICAgICBkZWZpbmVFdmVudEF0dHJpYnV0ZURlc2NyaXB0b3IoZXZlbnROYW1lKVxuICAgICk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgY3VzdG9tIEV2ZW50VGFyZ2V0IHdpdGggZXZlbnQgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGV2ZW50TmFtZXMgRXZlbnQgbmFtZXMgZm9yIGV2ZW50IGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJucyB7RXZlbnRUYXJnZXR9IFRoZSBjdXN0b20gRXZlbnRUYXJnZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZpbmVDdXN0b21FdmVudFRhcmdldChldmVudE5hbWVzKSB7XG4gICAgLyoqIEN1c3RvbUV2ZW50VGFyZ2V0ICovXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnRUYXJnZXQoKSB7XG4gICAgICAgIEV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgQ3VzdG9tRXZlbnRUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudFRhcmdldC5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBDdXN0b21FdmVudFRhcmdldCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGRlZmluZUV2ZW50QXR0cmlidXRlKEN1c3RvbUV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgZXZlbnROYW1lc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50VGFyZ2V0XG59XG5cbi8qKlxuICogRXZlbnRUYXJnZXQuXG4gKlxuICogLSBUaGlzIGlzIGNvbnN0cnVjdG9yIGlmIG5vIGFyZ3VtZW50cy5cbiAqIC0gVGhpcyBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBDdXN0b21FdmVudFRhcmdldCBjb25zdHJ1Y3RvciBpZiB0aGVyZSBhcmUgYXJndW1lbnRzLlxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqICAgICBjbGFzcyBBIGV4dGVuZHMgRXZlbnRUYXJnZXQge31cbiAqICAgICBjbGFzcyBCIGV4dGVuZHMgRXZlbnRUYXJnZXQoXCJtZXNzYWdlXCIpIHt9XG4gKiAgICAgY2xhc3MgQyBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiLCBcImVycm9yXCIpIHt9XG4gKiAgICAgY2xhc3MgRCBleHRlbmRzIEV2ZW50VGFyZ2V0KFtcIm1lc3NhZ2VcIiwgXCJlcnJvclwiXSkge31cbiAqL1xuZnVuY3Rpb24gRXZlbnRUYXJnZXQoKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgbGlzdGVuZXJzTWFwLnNldCh0aGlzLCBuZXcgTWFwKCkpO1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVDdXN0b21FdmVudFRhcmdldChhcmd1bWVudHNbMF0pXG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHR5cGVzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVDdXN0b21FdmVudFRhcmdldCh0eXBlcylcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKVxuICAgIC8qZXNsaW50LWVuYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xufVxuXG4vLyBTaG91bGQgYmUgZW51bWVyYWJsZSwgYnV0IGNsYXNzIG1ldGhvZHMgYXJlIG5vdCBlbnVtZXJhYmxlLlxuRXZlbnRUYXJnZXQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEFkZCBhIGdpdmVuIGxpc3RlbmVyIHRvIHRoaXMgZXZlbnQgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQuXG4gICAgICogQHBhcmFtIHtib29sZWFufHtjYXB0dXJlPzpib29sZWFuLHBhc3NpdmU/OmJvb2xlYW4sb25jZT86Ym9vbGVhbn19IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiAhaXNPYmplY3QobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiJ2xpc3RlbmVyJyBzaG91bGQgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QuXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNJc09iaiA9IGlzT2JqZWN0KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9uc0lzT2JqXG4gICAgICAgICAgICA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKVxuICAgICAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lclR5cGUgPSBjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRTtcbiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHtcbiAgICAgICAgICAgIGxpc3RlbmVyLFxuICAgICAgICAgICAgbGlzdGVuZXJUeXBlLFxuICAgICAgICAgICAgcGFzc2l2ZTogb3B0aW9uc0lzT2JqICYmIEJvb2xlYW4ob3B0aW9ucy5wYXNzaXZlKSxcbiAgICAgICAgICAgIG9uY2U6IG9wdGlvbnNJc09iaiAmJiBCb29sZWFuKG9wdGlvbnMub25jZSksXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCBpdCBhcyB0aGUgZmlyc3Qgbm9kZSBpZiB0aGUgZmlyc3Qgbm9kZSBpcyBudWxsLlxuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ld05vZGUpO1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmF2ZXJzZSB0byB0aGUgdGFpbCB3aGlsZSBjaGVja2luZyBkdXBsaWNhdGlvbi4uXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lclR5cGUgPT09IGxpc3RlbmVyVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBkdXBsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBpdC5cbiAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnx7Y2FwdHVyZT86Ym9vbGVhbixwYXNzaXZlPzpib29sZWFuLG9uY2U/OmJvb2xlYW59fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3QgY2FwdHVyZSA9IGlzT2JqZWN0KG9wdGlvbnMpXG4gICAgICAgICAgICA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKVxuICAgICAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lclR5cGUgPSBjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRTtcblxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lciA9PT0gbGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyVHlwZSA9PT0gbGlzdGVuZXJUeXBlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5vZGUubmV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudHx7dHlwZTpzdHJpbmd9fSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGBmYWxzZWAgaWYgY2FuY2VsZWQuXG4gICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCB8fCB0eXBlb2YgZXZlbnQudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJldmVudC50eXBlXCIgc2hvdWxkIGJlIGEgc3RyaW5nLicpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBsaXN0ZW5lcnMgYXJlbid0IHJlZ2lzdGVyZWQsIHRlcm1pbmF0ZS5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBldmVudC50eXBlO1xuICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmNlIHdlIGNhbm5vdCByZXdyaXRlIHNldmVyYWwgcHJvcGVydGllcywgc28gd3JhcCBvYmplY3QuXG4gICAgICAgIGNvbnN0IHdyYXBwZWRFdmVudCA9IHdyYXBFdmVudCh0aGlzLCBldmVudCk7XG5cbiAgICAgICAgLy8gVGhpcyBkb2Vzbid0IHByb2Nlc3MgY2FwdHVyaW5nIHBoYXNlIGFuZCBidWJibGluZyBwaGFzZS5cbiAgICAgICAgLy8gVGhpcyBpc24ndCBwYXJ0aWNpcGF0aW5nIGluIGEgdHJlZS5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBsaXN0ZW5lciBpZiBpdCdzIG9uY2VcbiAgICAgICAgICAgIGlmIChub2RlLm9uY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5vZGUubmV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbGwgdGhpcyBsaXN0ZW5lclxuICAgICAgICAgICAgc2V0UGFzc2l2ZUxpc3RlbmVyKFxuICAgICAgICAgICAgICAgIHdyYXBwZWRFdmVudCxcbiAgICAgICAgICAgICAgICBub2RlLnBhc3NpdmUgPyBub2RlLmxpc3RlbmVyIDogbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5saXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lci5jYWxsKHRoaXMsIHdyYXBwZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyVHlwZSAhPT0gQVRUUklCVVRFICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG5vZGUubGlzdGVuZXIuaGFuZGxlRXZlbnQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCh3cmFwcGVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCcmVhayBpZiBgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCB3YXMgY2FsbGVkLlxuICAgICAgICAgICAgaWYgKGlzU3RvcHBlZCh3cmFwcGVkRXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBzZXRQYXNzaXZlTGlzdGVuZXIod3JhcHBlZEV2ZW50LCBudWxsKTtcbiAgICAgICAgc2V0RXZlbnRQaGFzZSh3cmFwcGVkRXZlbnQsIDApO1xuICAgICAgICBzZXRDdXJyZW50VGFyZ2V0KHdyYXBwZWRFdmVudCwgbnVsbCk7XG5cbiAgICAgICAgcmV0dXJuICF3cmFwcGVkRXZlbnQuZGVmYXVsdFByZXZlbnRlZFxuICAgIH0sXG59O1xuXG4vLyBgY29uc3RydWN0b3JgIGlzIG5vdCBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEV2ZW50VGFyZ2V0LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbn0pO1xuXG4vLyBFbnN1cmUgYGV2ZW50VGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50VGFyZ2V0YCBpcyBgdHJ1ZWAuXG5pZiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiB3aW5kb3cuRXZlbnRUYXJnZXQgIT09IFwidW5kZWZpbmVkXCJcbikge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihFdmVudFRhcmdldC5wcm90b3R5cGUsIHdpbmRvdy5FdmVudFRhcmdldC5wcm90b3R5cGUpO1xufVxuXG5leHBvcnRzLmRlZmluZUV2ZW50QXR0cmlidXRlID0gZGVmaW5lRXZlbnRBdHRyaWJ1dGU7XG5leHBvcnRzLkV2ZW50VGFyZ2V0ID0gRXZlbnRUYXJnZXQ7XG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudFRhcmdldDtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFRhcmdldFxubW9kdWxlLmV4cG9ydHMuRXZlbnRUYXJnZXQgPSBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudFRhcmdldFxubW9kdWxlLmV4cG9ydHMuZGVmaW5lRXZlbnRBdHRyaWJ1dGUgPSBkZWZpbmVFdmVudEF0dHJpYnV0ZVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnQtdGFyZ2V0LXNoaW0uanMubWFwXG4iLCJjb25zdCB7UmVhZGFibGV9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8QmxvYiwge3R5cGU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBwYXJ0czogKEJsb2IgfCBCdWZmZXIpW10gfT59XG4gKi9cbmNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKTtcblxuYXN5bmMgZnVuY3Rpb24gKiByZWFkKHBhcnRzKSB7XG5cdGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuXHRcdGlmICgnc3RyZWFtJyBpbiBwYXJ0KSB7XG5cdFx0XHR5aWVsZCAqIHBhcnQuc3RyZWFtKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHlpZWxkIHBhcnQ7XG5cdFx0fVxuXHR9XG59XG5cbmNsYXNzIEJsb2Ige1xuXHQvKipcblx0ICogVGhlIEJsb2IoKSBjb25zdHJ1Y3RvciByZXR1cm5zIGEgbmV3IEJsb2Igb2JqZWN0LiBUaGUgY29udGVudFxuXHQgKiBvZiB0aGUgYmxvYiBjb25zaXN0cyBvZiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdmFsdWVzIGdpdmVuXG5cdCAqIGluIHRoZSBwYXJhbWV0ZXIgYXJyYXkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7KEFycmF5QnVmZmVyTGlrZSB8IEFycmF5QnVmZmVyVmlldyB8IEJsb2IgfCBCdWZmZXIgfCBzdHJpbmcpW119IGJsb2JQYXJ0c1xuXHQgKiBAcGFyYW0ge3sgdHlwZT86IHN0cmluZyB9fSBbb3B0aW9uc11cblx0ICovXG5cdGNvbnN0cnVjdG9yKGJsb2JQYXJ0cyA9IFtdLCBvcHRpb25zID0ge30pIHtcblx0XHRsZXQgc2l6ZSA9IDA7XG5cblx0XHRjb25zdCBwYXJ0cyA9IGJsb2JQYXJ0cy5tYXAoZWxlbWVudCA9PiB7XG5cdFx0XHRsZXQgYnVmZmVyO1xuXHRcdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCdWZmZXIpIHtcblx0XHRcdFx0YnVmZmVyID0gZWxlbWVudDtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGVsZW1lbnQpKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGVsZW1lbnQuYnVmZmVyLCBlbGVtZW50LmJ5dGVPZmZzZXQsIGVsZW1lbnQuYnl0ZUxlbmd0aCk7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuXHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShlbGVtZW50KTtcblx0XHRcdH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJsb2IpIHtcblx0XHRcdFx0YnVmZmVyID0gZWxlbWVudDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJyA/IGVsZW1lbnQgOiBTdHJpbmcoZWxlbWVudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9leHBsaWNpdC1sZW5ndGgtY2hlY2tcblx0XHRcdHNpemUgKz0gYnVmZmVyLmxlbmd0aCB8fCBidWZmZXIuc2l6ZSB8fCAwO1xuXHRcdFx0cmV0dXJuIGJ1ZmZlcjtcblx0XHR9KTtcblxuXHRcdGNvbnN0IHR5cGUgPSBvcHRpb25zLnR5cGUgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKG9wdGlvbnMudHlwZSkudG9Mb3dlckNhc2UoKTtcblxuXHRcdHdtLnNldCh0aGlzLCB7XG5cdFx0XHR0eXBlOiAvW15cXHUwMDIwLVxcdTAwN0VdLy50ZXN0KHR5cGUpID8gJycgOiB0eXBlLFxuXHRcdFx0c2l6ZSxcblx0XHRcdHBhcnRzXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJsb2IgaW50ZXJmYWNlJ3Mgc2l6ZSBwcm9wZXJ0eSByZXR1cm5zIHRoZVxuXHQgKiBzaXplIG9mIHRoZSBCbG9iIGluIGJ5dGVzLlxuXHQgKi9cblx0Z2V0IHNpemUoKSB7XG5cdFx0cmV0dXJuIHdtLmdldCh0aGlzKS5zaXplO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0eXBlIHByb3BlcnR5IG9mIGEgQmxvYiBvYmplY3QgcmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0Z2V0IHR5cGUoKSB7XG5cdFx0cmV0dXJuIHdtLmdldCh0aGlzKS50eXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZXh0KCkgbWV0aG9kIGluIHRoZSBCbG9iIGludGVyZmFjZSByZXR1cm5zIGEgUHJvbWlzZVxuXHQgKiB0aGF0IHJlc29sdmVzIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2Zcblx0ICogdGhlIGJsb2IsIGludGVycHJldGVkIGFzIFVURi04LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59XG5cdCAqL1xuXHRhc3luYyB0ZXh0KCkge1xuXHRcdHJldHVybiBCdWZmZXIuZnJvbShhd2FpdCB0aGlzLmFycmF5QnVmZmVyKCkpLnRvU3RyaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGFycmF5QnVmZmVyKCkgbWV0aG9kIGluIHRoZSBCbG9iIGludGVyZmFjZSByZXR1cm5zIGFcblx0ICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9iIGFzXG5cdCAqIGJpbmFyeSBkYXRhIGNvbnRhaW5lZCBpbiBhbiBBcnJheUJ1ZmZlci5cblx0ICpcblx0ICogQHJldHVybiB7UHJvbWlzZTxBcnJheUJ1ZmZlcj59XG5cdCAqL1xuXHRhc3luYyBhcnJheUJ1ZmZlcigpIHtcblx0XHRjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5zaXplKTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblx0XHRmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHRoaXMuc3RyZWFtKCkpIHtcblx0XHRcdGRhdGEuc2V0KGNodW5rLCBvZmZzZXQpO1xuXHRcdFx0b2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YS5idWZmZXI7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJsb2IgaW50ZXJmYWNlJ3Mgc3RyZWFtKCkgbWV0aG9kIGlzIGRpZmZlcmVuY2UgZnJvbSBuYXRpdmVcblx0ICogYW5kIHVzZXMgbm9kZSBzdHJlYW1zIGluc3RlYWQgb2Ygd2hhdHdnIHN0cmVhbXMuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtSZWFkYWJsZX0gTm9kZSByZWFkYWJsZSBzdHJlYW1cblx0ICovXG5cdHN0cmVhbSgpIHtcblx0XHRyZXR1cm4gUmVhZGFibGUuZnJvbShyZWFkKHdtLmdldCh0aGlzKS5wYXJ0cykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCbG9iIGludGVyZmFjZSdzIHNsaWNlKCkgbWV0aG9kIGNyZWF0ZXMgYW5kIHJldHVybnMgYVxuXHQgKiBuZXcgQmxvYiBvYmplY3Qgd2hpY2ggY29udGFpbnMgZGF0YSBmcm9tIGEgc3Vic2V0IG9mIHRoZVxuXHQgKiBibG9iIG9uIHdoaWNoIGl0J3MgY2FsbGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0XVxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2VuZF1cblx0ICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlXVxuXHQgKi9cblx0c2xpY2Uoc3RhcnQgPSAwLCBlbmQgPSB0aGlzLnNpemUsIHR5cGUgPSAnJykge1xuXHRcdGNvbnN0IHtzaXplfSA9IHRoaXM7XG5cblx0XHRsZXQgcmVsYXRpdmVTdGFydCA9IHN0YXJ0IDwgMCA/IE1hdGgubWF4KHNpemUgKyBzdGFydCwgMCkgOiBNYXRoLm1pbihzdGFydCwgc2l6ZSk7XG5cdFx0bGV0IHJlbGF0aXZlRW5kID0gZW5kIDwgMCA/IE1hdGgubWF4KHNpemUgKyBlbmQsIDApIDogTWF0aC5taW4oZW5kLCBzaXplKTtcblxuXHRcdGNvbnN0IHNwYW4gPSBNYXRoLm1heChyZWxhdGl2ZUVuZCAtIHJlbGF0aXZlU3RhcnQsIDApO1xuXHRcdGNvbnN0IHBhcnRzID0gd20uZ2V0KHRoaXMpLnBhcnRzLnZhbHVlcygpO1xuXHRcdGNvbnN0IGJsb2JQYXJ0cyA9IFtdO1xuXHRcdGxldCBhZGRlZCA9IDA7XG5cblx0XHRmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcblx0XHRcdGNvbnN0IHNpemUgPSBBcnJheUJ1ZmZlci5pc1ZpZXcocGFydCkgPyBwYXJ0LmJ5dGVMZW5ndGggOiBwYXJ0LnNpemU7XG5cdFx0XHRpZiAocmVsYXRpdmVTdGFydCAmJiBzaXplIDw9IHJlbGF0aXZlU3RhcnQpIHtcblx0XHRcdFx0Ly8gU2tpcCB0aGUgYmVnaW5uaW5nIGFuZCBjaGFuZ2UgdGhlIHJlbGF0aXZlXG5cdFx0XHRcdC8vIHN0YXJ0ICYgZW5kIHBvc2l0aW9uIGFzIHdlIHNraXAgdGhlIHVud2FudGVkIHBhcnRzXG5cdFx0XHRcdHJlbGF0aXZlU3RhcnQgLT0gc2l6ZTtcblx0XHRcdFx0cmVsYXRpdmVFbmQgLT0gc2l6ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNodW5rID0gcGFydC5zbGljZShyZWxhdGl2ZVN0YXJ0LCBNYXRoLm1pbihzaXplLCByZWxhdGl2ZUVuZCkpO1xuXHRcdFx0XHRibG9iUGFydHMucHVzaChjaHVuayk7XG5cdFx0XHRcdGFkZGVkICs9IEFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykgPyBjaHVuay5ieXRlTGVuZ3RoIDogY2h1bmsuc2l6ZTtcblx0XHRcdFx0cmVsYXRpdmVTdGFydCA9IDA7IC8vIEFsbCBuZXh0IHNlcXVlbnRhbCBwYXJ0cyBzaG91bGQgc3RhcnQgYXQgMFxuXG5cdFx0XHRcdC8vIGRvbid0IGFkZCB0aGUgb3ZlcmZsb3cgdG8gbmV3IGJsb2JQYXJ0c1xuXHRcdFx0XHRpZiAoYWRkZWQgPj0gc3Bhbikge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgYmxvYiA9IG5ldyBCbG9iKFtdLCB7dHlwZTogU3RyaW5nKHR5cGUpLnRvTG93ZXJDYXNlKCl9KTtcblx0XHRPYmplY3QuYXNzaWduKHdtLmdldChibG9iKSwge3NpemU6IHNwYW4sIHBhcnRzOiBibG9iUGFydHN9KTtcblxuXHRcdHJldHVybiBibG9iO1xuXHR9XG5cblx0Z2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuXHRcdHJldHVybiAnQmxvYic7XG5cdH1cblxuXHRzdGF0aWMgW1N5bWJvbC5oYXNJbnN0YW5jZV0ob2JqZWN0KSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9iamVjdCAmJlxuXHRcdFx0dHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG5cdFx0XHRvYmplY3Quc3RyZWFtLmxlbmd0aCA9PT0gMCAmJlxuXHRcdFx0dHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0L14oQmxvYnxGaWxlKSQvLnRlc3Qob2JqZWN0W1N5bWJvbC50b1N0cmluZ1RhZ10pXG5cdFx0KTtcblx0fVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCbG9iLnByb3RvdHlwZSwge1xuXHRzaXplOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHR5cGU6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0c2xpY2U6IHtlbnVtZXJhYmxlOiB0cnVlfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmxvYjtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGZldGNoID0gcmVxdWlyZSgnbm9kZS1mZXRjaCcpO1xuY29uc3QgQWJvcnRDb250cm9sbGVyID0gcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpO1xuXG5jb25zdCBURU5fTUVHQUJZVEVTID0gMTAwMCAqIDEwMDAgKiAxMDtcblxuaWYgKCFnbG9iYWwuZmV0Y2gpIHtcblx0Z2xvYmFsLmZldGNoID0gKHVybCwgb3B0aW9ucykgPT4gZmV0Y2godXJsLCB7aGlnaFdhdGVyTWFyazogVEVOX01FR0FCWVRFUywgLi4ub3B0aW9uc30pO1xufVxuXG5pZiAoIWdsb2JhbC5IZWFkZXJzKSB7XG5cdGdsb2JhbC5IZWFkZXJzID0gZmV0Y2guSGVhZGVycztcbn1cblxuaWYgKCFnbG9iYWwuUmVxdWVzdCkge1xuXHRnbG9iYWwuUmVxdWVzdCA9IGZldGNoLlJlcXVlc3Q7XG59XG5cbmlmICghZ2xvYmFsLlJlc3BvbnNlKSB7XG5cdGdsb2JhbC5SZXNwb25zZSA9IGZldGNoLlJlc3BvbnNlO1xufVxuXG5pZiAoIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIpIHtcblx0Z2xvYmFsLkFib3J0Q29udHJvbGxlciA9IEFib3J0Q29udHJvbGxlcjtcbn1cblxuaWYgKCFnbG9iYWwuUmVhZGFibGVTdHJlYW0pIHtcblx0dHJ5IHtcblx0XHRnbG9iYWwuUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCd3ZWItc3RyZWFtcy1wb2x5ZmlsbC9wb255ZmlsbC9lczIwMTgnKTtcblx0fSBjYXRjaCAoXykge31cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdreS91bWQnKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLmt5ID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cdC8qISBNSVQgTGljZW5zZSDCqSBTaW5kcmUgU29yaHVzICovXG5cblx0Y29uc3QgZ2xvYmFscyA9IHt9O1xuXG5cdGNvbnN0IGdldEdsb2JhbCA9IHByb3BlcnR5ID0+IHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiAmJiBwcm9wZXJ0eSBpbiBzZWxmKSB7XG5cdFx0XHRyZXR1cm4gc2VsZjtcblx0XHR9XG5cblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgJiYgcHJvcGVydHkgaW4gd2luZG93KSB7XG5cdFx0XHRyZXR1cm4gd2luZG93O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwgJiYgcHJvcGVydHkgaW4gZ2xvYmFsKSB7XG5cdFx0XHRyZXR1cm4gZ2xvYmFsO1xuXHRcdH1cblxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzKSB7XG5cdFx0XHRyZXR1cm4gZ2xvYmFsVGhpcztcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZ2xvYmFsUHJvcGVydGllcyA9IFtcblx0XHQnSGVhZGVycycsXG5cdFx0J1JlcXVlc3QnLFxuXHRcdCdSZXNwb25zZScsXG5cdFx0J1JlYWRhYmxlU3RyZWFtJyxcblx0XHQnZmV0Y2gnLFxuXHRcdCdBYm9ydENvbnRyb2xsZXInLFxuXHRcdCdGb3JtRGF0YSdcblx0XTtcblxuXHRmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdsb2JhbFByb3BlcnRpZXMpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFscywgcHJvcGVydHksIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0Y29uc3QgZ2xvYmFsT2JqZWN0ID0gZ2V0R2xvYmFsKHByb3BlcnR5KTtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBnbG9iYWxPYmplY3QgJiYgZ2xvYmFsT2JqZWN0W3Byb3BlcnR5XTtcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmJpbmQoZ2xvYmFsT2JqZWN0KSA6IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Y29uc3QgaXNPYmplY3QgPSB2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuXHRjb25zdCBzdXBwb3J0c0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBnbG9iYWxzLkFib3J0Q29udHJvbGxlciA9PT0gJ2Z1bmN0aW9uJztcblx0Y29uc3Qgc3VwcG9ydHNTdHJlYW1zID0gdHlwZW9mIGdsb2JhbHMuUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cdGNvbnN0IHN1cHBvcnRzRm9ybURhdGEgPSB0eXBlb2YgZ2xvYmFscy5Gb3JtRGF0YSA9PT0gJ2Z1bmN0aW9uJztcblxuXHRjb25zdCBtZXJnZUhlYWRlcnMgPSAoc291cmNlMSwgc291cmNlMikgPT4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBnbG9iYWxzLkhlYWRlcnMoc291cmNlMSB8fCB7fSk7XG5cdFx0Y29uc3QgaXNIZWFkZXJzSW5zdGFuY2UgPSBzb3VyY2UyIGluc3RhbmNlb2YgZ2xvYmFscy5IZWFkZXJzO1xuXHRcdGNvbnN0IHNvdXJjZSA9IG5ldyBnbG9iYWxzLkhlYWRlcnMoc291cmNlMiB8fCB7fSk7XG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzb3VyY2UpIHtcblx0XHRcdGlmICgoaXNIZWFkZXJzSW5zdGFuY2UgJiYgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdC5kZWxldGUoa2V5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5zZXQoa2V5LCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHRjb25zdCBkZWVwTWVyZ2UgPSAoLi4uc291cmNlcykgPT4ge1xuXHRcdGxldCByZXR1cm5WYWx1ZSA9IHt9O1xuXHRcdGxldCBoZWFkZXJzID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG5cdFx0XHRcdGlmICghKEFycmF5LmlzQXJyYXkocmV0dXJuVmFsdWUpKSkge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IFsuLi5yZXR1cm5WYWx1ZSwgLi4uc291cmNlXTtcblx0XHRcdH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuXHRcdFx0XHRmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuXHRcdFx0XHRcdGlmIChpc09iamVjdCh2YWx1ZSkgJiYgKGtleSBpbiByZXR1cm5WYWx1ZSkpIHtcblx0XHRcdFx0XHRcdHZhbHVlID0gZGVlcE1lcmdlKHJldHVyblZhbHVlW2tleV0sIHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHsuLi5yZXR1cm5WYWx1ZSwgW2tleV06IHZhbHVlfTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc09iamVjdChzb3VyY2UuaGVhZGVycykpIHtcblx0XHRcdFx0XHRoZWFkZXJzID0gbWVyZ2VIZWFkZXJzKGhlYWRlcnMsIHNvdXJjZS5oZWFkZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm5WYWx1ZS5oZWFkZXJzID0gaGVhZGVycztcblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdH07XG5cblx0Y29uc3QgcmVxdWVzdE1ldGhvZHMgPSBbXG5cdFx0J2dldCcsXG5cdFx0J3Bvc3QnLFxuXHRcdCdwdXQnLFxuXHRcdCdwYXRjaCcsXG5cdFx0J2hlYWQnLFxuXHRcdCdkZWxldGUnXG5cdF07XG5cblx0Y29uc3QgcmVzcG9uc2VUeXBlcyA9IHtcblx0XHRqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG5cdFx0dGV4dDogJ3RleHQvKicsXG5cdFx0Zm9ybURhdGE6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcblx0XHRhcnJheUJ1ZmZlcjogJyovKicsXG5cdFx0YmxvYjogJyovKidcblx0fTtcblxuXHRjb25zdCByZXRyeU1ldGhvZHMgPSBbXG5cdFx0J2dldCcsXG5cdFx0J3B1dCcsXG5cdFx0J2hlYWQnLFxuXHRcdCdkZWxldGUnLFxuXHRcdCdvcHRpb25zJyxcblx0XHQndHJhY2UnXG5cdF07XG5cblx0Y29uc3QgcmV0cnlTdGF0dXNDb2RlcyA9IFtcblx0XHQ0MDgsXG5cdFx0NDEzLFxuXHRcdDQyOSxcblx0XHQ1MDAsXG5cdFx0NTAyLFxuXHRcdDUwMyxcblx0XHQ1MDRcblx0XTtcblxuXHRjb25zdCByZXRyeUFmdGVyU3RhdHVzQ29kZXMgPSBbXG5cdFx0NDEzLFxuXHRcdDQyOSxcblx0XHQ1MDNcblx0XTtcblxuXHRjb25zdCBzdG9wID0gU3ltYm9sKCdzdG9wJyk7XG5cblx0Y2xhc3MgSFRUUEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRcdGNvbnN0cnVjdG9yKHJlc3BvbnNlKSB7XG5cdFx0XHQvLyBTZXQgdGhlIG1lc3NhZ2UgdG8gdGhlIHN0YXR1cyB0ZXh0LCBzdWNoIGFzIFVuYXV0aG9yaXplZCxcblx0XHRcdC8vIHdpdGggc29tZSBmYWxsYmFja3MuIFRoaXMgbWVzc2FnZSBzaG91bGQgbmV2ZXIgYmUgdW5kZWZpbmVkLlxuXHRcdFx0c3VwZXIoXG5cdFx0XHRcdHJlc3BvbnNlLnN0YXR1c1RleHQgfHxcblx0XHRcdFx0U3RyaW5nKFxuXHRcdFx0XHRcdChyZXNwb25zZS5zdGF0dXMgPT09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzKSA/XG5cdFx0XHRcdFx0XHRyZXNwb25zZS5zdGF0dXMgOiAnVW5rbm93biByZXNwb25zZSBlcnJvcidcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdHRoaXMubmFtZSA9ICdIVFRQRXJyb3InO1xuXHRcdFx0dGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuXHRcdH1cblx0fVxuXG5cdGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0XHRjb25zdHJ1Y3RvcihyZXF1ZXN0KSB7XG5cdFx0XHRzdXBlcignUmVxdWVzdCB0aW1lZCBvdXQnKTtcblx0XHRcdHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuXHRcdFx0dGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBkZWxheSA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG5cdC8vIGBQcm9taXNlLnJhY2UoKWAgd29ya2Fyb3VuZCAoIzkxKVxuXHRjb25zdCB0aW1lb3V0ID0gKHJlcXVlc3QsIGFib3J0Q29udHJvbGxlciwgb3B0aW9ucykgPT5cblx0XHRuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0aWYgKGFib3J0Q29udHJvbGxlcikge1xuXHRcdFx0XHRcdGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVqZWN0KG5ldyBUaW1lb3V0RXJyb3IocmVxdWVzdCkpO1xuXHRcdFx0fSwgb3B0aW9ucy50aW1lb3V0KTtcblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlbiAqL1xuXHRcdFx0b3B0aW9ucy5mZXRjaChyZXF1ZXN0KVxuXHRcdFx0XHQudGhlbihyZXNvbHZlKVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0LyogZXNsaW50LWVuYWJsZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuICovXG5cdFx0fSk7XG5cblx0Y29uc3Qgbm9ybWFsaXplUmVxdWVzdE1ldGhvZCA9IGlucHV0ID0+IHJlcXVlc3RNZXRob2RzLmluY2x1ZGVzKGlucHV0KSA/IGlucHV0LnRvVXBwZXJDYXNlKCkgOiBpbnB1dDtcblxuXHRjb25zdCBkZWZhdWx0UmV0cnlPcHRpb25zID0ge1xuXHRcdGxpbWl0OiAyLFxuXHRcdG1ldGhvZHM6IHJldHJ5TWV0aG9kcyxcblx0XHRzdGF0dXNDb2RlczogcmV0cnlTdGF0dXNDb2Rlcyxcblx0XHRhZnRlclN0YXR1c0NvZGVzOiByZXRyeUFmdGVyU3RhdHVzQ29kZXNcblx0fTtcblxuXHRjb25zdCBub3JtYWxpemVSZXRyeU9wdGlvbnMgPSAocmV0cnkgPSB7fSkgPT4ge1xuXHRcdGlmICh0eXBlb2YgcmV0cnkgPT09ICdudW1iZXInKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQuLi5kZWZhdWx0UmV0cnlPcHRpb25zLFxuXHRcdFx0XHRsaW1pdDogcmV0cnlcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHJldHJ5Lm1ldGhvZHMgJiYgIUFycmF5LmlzQXJyYXkocmV0cnkubWV0aG9kcykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigncmV0cnkubWV0aG9kcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKHJldHJ5LnN0YXR1c0NvZGVzICYmICFBcnJheS5pc0FycmF5KHJldHJ5LnN0YXR1c0NvZGVzKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdyZXRyeS5zdGF0dXNDb2RlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdC4uLmRlZmF1bHRSZXRyeU9wdGlvbnMsXG5cdFx0XHQuLi5yZXRyeSxcblx0XHRcdGFmdGVyU3RhdHVzQ29kZXM6IHJldHJ5QWZ0ZXJTdGF0dXNDb2Rlc1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVGhlIG1heGltdW0gdmFsdWUgb2YgYSAzMmJpdCBpbnQgKHNlZSBpc3N1ZSAjMTE3KVxuXHRjb25zdCBtYXhTYWZlVGltZW91dCA9IDIxNDc0ODM2NDc7XG5cblx0Y2xhc3MgS3kge1xuXHRcdGNvbnN0cnVjdG9yKGlucHV0LCBvcHRpb25zID0ge30pIHtcblx0XHRcdHRoaXMuX3JldHJ5Q291bnQgPSAwO1xuXHRcdFx0dGhpcy5faW5wdXQgPSBpbnB1dDtcblx0XHRcdHRoaXMuX29wdGlvbnMgPSB7XG5cdFx0XHRcdC8vIFRPRE86IGNyZWRlbnRpYWxzIGNhbiBiZSByZW1vdmVkIHdoZW4gdGhlIHNwZWMgY2hhbmdlIGlzIGltcGxlbWVudGVkIGluIGFsbCBicm93c2Vycy4gQ29udGV4dDogaHR0cHM6Ly93d3cuY2hyb21lc3RhdHVzLmNvbS9mZWF0dXJlLzQ1Mzk0NzMzMTIzNTAyMDhcblx0XHRcdFx0Y3JlZGVudGlhbHM6IHRoaXMuX2lucHV0LmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbicsXG5cdFx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRcdGhlYWRlcnM6IG1lcmdlSGVhZGVycyh0aGlzLl9pbnB1dC5oZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpLFxuXHRcdFx0XHRob29rczogZGVlcE1lcmdlKHtcblx0XHRcdFx0XHRiZWZvcmVSZXF1ZXN0OiBbXSxcblx0XHRcdFx0XHRiZWZvcmVSZXRyeTogW10sXG5cdFx0XHRcdFx0YWZ0ZXJSZXNwb25zZTogW11cblx0XHRcdFx0fSwgb3B0aW9ucy5ob29rcyksXG5cdFx0XHRcdG1ldGhvZDogbm9ybWFsaXplUmVxdWVzdE1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLl9pbnB1dC5tZXRob2QpLFxuXHRcdFx0XHRwcmVmaXhVcmw6IFN0cmluZyhvcHRpb25zLnByZWZpeFVybCB8fCAnJyksXG5cdFx0XHRcdHJldHJ5OiBub3JtYWxpemVSZXRyeU9wdGlvbnMob3B0aW9ucy5yZXRyeSksXG5cdFx0XHRcdHRocm93SHR0cEVycm9yczogb3B0aW9ucy50aHJvd0h0dHBFcnJvcnMgIT09IGZhbHNlLFxuXHRcdFx0XHR0aW1lb3V0OiB0eXBlb2Ygb3B0aW9ucy50aW1lb3V0ID09PSAndW5kZWZpbmVkJyA/IDEwMDAwIDogb3B0aW9ucy50aW1lb3V0LFxuXHRcdFx0XHRmZXRjaDogb3B0aW9ucy5mZXRjaCB8fCBnbG9iYWxzLmZldGNoXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAodHlwZW9mIHRoaXMuX2lucHV0ICE9PSAnc3RyaW5nJyAmJiAhKHRoaXMuX2lucHV0IGluc3RhbmNlb2YgVVJMIHx8IHRoaXMuX2lucHV0IGluc3RhbmNlb2YgZ2xvYmFscy5SZXF1ZXN0KSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdgaW5wdXRgIG11c3QgYmUgYSBzdHJpbmcsIFVSTCwgb3IgUmVxdWVzdCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5wcmVmaXhVcmwgJiYgdHlwZW9mIHRoaXMuX2lucHV0ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRpZiAodGhpcy5faW5wdXQuc3RhcnRzV2l0aCgnLycpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdgaW5wdXRgIG11c3Qgbm90IGJlZ2luIHdpdGggYSBzbGFzaCB3aGVuIHVzaW5nIGBwcmVmaXhVcmxgJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXRoaXMuX29wdGlvbnMucHJlZml4VXJsLmVuZHNXaXRoKCcvJykpIHtcblx0XHRcdFx0XHR0aGlzLl9vcHRpb25zLnByZWZpeFVybCArPSAnLyc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9pbnB1dCA9IHRoaXMuX29wdGlvbnMucHJlZml4VXJsICsgdGhpcy5faW5wdXQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdXBwb3J0c0Fib3J0Q29udHJvbGxlcikge1xuXHRcdFx0XHR0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBnbG9iYWxzLkFib3J0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5zaWduYWwpIHtcblx0XHRcdFx0XHR0aGlzLl9vcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9vcHRpb25zLnNpZ25hbCA9IHRoaXMuYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yZXF1ZXN0ID0gbmV3IGdsb2JhbHMuUmVxdWVzdCh0aGlzLl9pbnB1dCwgdGhpcy5fb3B0aW9ucyk7XG5cblx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnNlYXJjaFBhcmFtcykge1xuXHRcdFx0XHRjb25zdCBzZWFyY2hQYXJhbXMgPSAnPycgKyBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuX29wdGlvbnMuc2VhcmNoUGFyYW1zKS50b1N0cmluZygpO1xuXHRcdFx0XHRjb25zdCB1cmwgPSB0aGlzLnJlcXVlc3QudXJsLnJlcGxhY2UoLyg/OlxcPy4qPyk/KD89I3wkKS8sIHNlYXJjaFBhcmFtcyk7XG5cblx0XHRcdFx0Ly8gVG8gcHJvdmlkZSBjb3JyZWN0IGZvcm0gYm91bmRhcnksIENvbnRlbnQtVHlwZSBoZWFkZXIgc2hvdWxkIGJlIGRlbGV0ZWQgZWFjaCB0aW1lIHdoZW4gbmV3IFJlcXVlc3QgaW5zdGFudGlhdGVkIGZyb20gYW5vdGhlciBvbmVcblx0XHRcdFx0aWYgKCgoc3VwcG9ydHNGb3JtRGF0YSAmJiB0aGlzLl9vcHRpb25zLmJvZHkgaW5zdGFuY2VvZiBnbG9iYWxzLkZvcm1EYXRhKSB8fCB0aGlzLl9vcHRpb25zLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpICYmICEodGhpcy5fb3B0aW9ucy5oZWFkZXJzICYmIHRoaXMuX29wdGlvbnMuaGVhZGVyc1snY29udGVudC10eXBlJ10pKSB7XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKCdjb250ZW50LXR5cGUnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMucmVxdWVzdCA9IG5ldyBnbG9iYWxzLlJlcXVlc3QobmV3IGdsb2JhbHMuUmVxdWVzdCh1cmwsIHRoaXMucmVxdWVzdCksIHRoaXMuX29wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5qc29uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb3B0aW9ucy5qc29uKTtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0LmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXHRcdFx0XHR0aGlzLnJlcXVlc3QgPSBuZXcgZ2xvYmFscy5SZXF1ZXN0KHRoaXMucmVxdWVzdCwge2JvZHk6IHRoaXMuX29wdGlvbnMuYm9keX0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmbiA9IGFzeW5jICgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuX29wdGlvbnMudGltZW91dCA+IG1heFNhZmVUaW1lb3V0KSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSBcXGB0aW1lb3V0XFxgIG9wdGlvbiBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICR7bWF4U2FmZVRpbWVvdXR9YCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCBkZWxheSgxKTtcblx0XHRcdFx0bGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fZmV0Y2goKTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5fb3B0aW9ucy5ob29rcy5hZnRlclJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3Bcblx0XHRcdFx0XHRjb25zdCBtb2RpZmllZFJlc3BvbnNlID0gYXdhaXQgaG9vayhcblx0XHRcdFx0XHRcdHRoaXMucmVxdWVzdCxcblx0XHRcdFx0XHRcdHRoaXMuX29wdGlvbnMsXG5cdFx0XHRcdFx0XHR0aGlzLl9kZWNvcmF0ZVJlc3BvbnNlKHJlc3BvbnNlLmNsb25lKCkpXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmIChtb2RpZmllZFJlc3BvbnNlIGluc3RhbmNlb2YgZ2xvYmFscy5SZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBtb2RpZmllZFJlc3BvbnNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX2RlY29yYXRlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG5cdFx0XHRcdGlmICghcmVzcG9uc2Uub2sgJiYgdGhpcy5fb3B0aW9ucy50aHJvd0h0dHBFcnJvcnMpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgSFRUUEVycm9yKHJlc3BvbnNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIGBvbkRvd25sb2FkUHJvZ3Jlc3NgIGlzIHBhc3NlZCwgaXQgdXNlcyB0aGUgc3RyZWFtIEFQSSBpbnRlcm5hbGx5XG5cdFx0XHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0XHRcdGlmICh0aGlzLl9vcHRpb25zLm9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5vbkRvd25sb2FkUHJvZ3Jlc3MgIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBgb25Eb3dubG9hZFByb2dyZXNzYCBvcHRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFzdXBwb3J0c1N0cmVhbXMpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignU3RyZWFtcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB5b3VyIGVudmlyb25tZW50LiBgUmVhZGFibGVTdHJlYW1gIGlzIG1pc3NpbmcuJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3N0cmVhbShyZXNwb25zZS5jbG9uZSgpLCB0aGlzLl9vcHRpb25zLm9uRG93bmxvYWRQcm9ncmVzcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzcG9uc2U7XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBpc1JldHJpYWJsZU1ldGhvZCA9IHRoaXMuX29wdGlvbnMucmV0cnkubWV0aG9kcy5pbmNsdWRlcyh0aGlzLnJlcXVlc3QubWV0aG9kLnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gaXNSZXRyaWFibGVNZXRob2QgPyB0aGlzLl9yZXRyeShmbikgOiBmbigpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IFt0eXBlLCBtaW1lVHlwZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzcG9uc2VUeXBlcykpIHtcblx0XHRcdFx0cmVzdWx0W3R5cGVdID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdC5oZWFkZXJzLnNldCgnYWNjZXB0JywgdGhpcy5yZXF1ZXN0LmhlYWRlcnMuZ2V0KCdhY2NlcHQnKSB8fCBtaW1lVHlwZSk7XG5cblx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IChhd2FpdCByZXN1bHQpLmNsb25lKCk7XG5cblx0XHRcdFx0XHRpZiAodHlwZSA9PT0gJ2pzb24nKSB7XG5cdFx0XHRcdFx0XHRpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5wYXJzZUpzb24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9wdGlvbnMucGFyc2VKc29uKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlW3R5cGVdKCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0X2NhbGN1bGF0ZVJldHJ5RGVsYXkoZXJyb3IpIHtcblx0XHRcdHRoaXMuX3JldHJ5Q291bnQrKztcblxuXHRcdFx0aWYgKHRoaXMuX3JldHJ5Q291bnQgPCB0aGlzLl9vcHRpb25zLnJldHJ5LmxpbWl0ICYmICEoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpKSB7XG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEhUVFBFcnJvcikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5fb3B0aW9ucy5yZXRyeS5zdGF0dXNDb2Rlcy5pbmNsdWRlcyhlcnJvci5yZXNwb25zZS5zdGF0dXMpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCByZXRyeUFmdGVyID0gZXJyb3IucmVzcG9uc2UuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJyk7XG5cdFx0XHRcdFx0aWYgKHJldHJ5QWZ0ZXIgJiYgdGhpcy5fb3B0aW9ucy5yZXRyeS5hZnRlclN0YXR1c0NvZGVzLmluY2x1ZGVzKGVycm9yLnJlc3BvbnNlLnN0YXR1cykpIHtcblx0XHRcdFx0XHRcdGxldCBhZnRlciA9IE51bWJlcihyZXRyeUFmdGVyKTtcblx0XHRcdFx0XHRcdGlmIChOdW1iZXIuaXNOYU4oYWZ0ZXIpKSB7XG5cdFx0XHRcdFx0XHRcdGFmdGVyID0gRGF0ZS5wYXJzZShyZXRyeUFmdGVyKSAtIERhdGUubm93KCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhZnRlciAqPSAxMDAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMucmV0cnkubWF4UmV0cnlBZnRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgYWZ0ZXIgPiB0aGlzLl9vcHRpb25zLnJldHJ5Lm1heFJldHJ5QWZ0ZXIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBhZnRlcjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MTMpIHtcblx0XHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IEJBQ0tPRkZfRkFDVE9SID0gMC4zO1xuXHRcdFx0XHRyZXR1cm4gQkFDS09GRl9GQUNUT1IgKiAoMiAqKiAodGhpcy5fcmV0cnlDb3VudCAtIDEpKSAqIDEwMDA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdF9kZWNvcmF0ZVJlc3BvbnNlKHJlc3BvbnNlKSB7XG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5wYXJzZUpzb24pIHtcblx0XHRcdFx0cmVzcG9uc2UuanNvbiA9IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucy5wYXJzZUpzb24oYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdGFzeW5jIF9yZXRyeShmbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIGF3YWl0IGZuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBtcyA9IE1hdGgubWluKHRoaXMuX2NhbGN1bGF0ZVJldHJ5RGVsYXkoZXJyb3IpLCBtYXhTYWZlVGltZW91dCk7XG5cdFx0XHRcdGlmIChtcyAhPT0gMCAmJiB0aGlzLl9yZXRyeUNvdW50ID4gMCkge1xuXHRcdFx0XHRcdGF3YWl0IGRlbGF5KG1zKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaG9vayBvZiB0aGlzLl9vcHRpb25zLmhvb2tzLmJlZm9yZVJldHJ5KSB7XG5cdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXHRcdFx0XHRcdFx0Y29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2soe1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHRoaXMuX29wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdGVycm9yLFxuXHRcdFx0XHRcdFx0XHRyZXRyeUNvdW50OiB0aGlzLl9yZXRyeUNvdW50XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgYHN0b3BgIGlzIHJldHVybmVkIGZyb20gdGhlIGhvb2ssIHRoZSByZXRyeSBwcm9jZXNzIGlzIHN0b3BwZWRcblx0XHRcdFx0XHRcdGlmIChob29rUmVzdWx0ID09PSBzdG9wKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fcmV0cnkoZm4pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuX29wdGlvbnMudGhyb3dIdHRwRXJyb3JzKSB7XG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRhc3luYyBfZmV0Y2goKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5fb3B0aW9ucy5ob29rcy5iZWZvcmVSZXF1ZXN0KSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhvb2sodGhpcy5yZXF1ZXN0LCB0aGlzLl9vcHRpb25zKTtcblxuXHRcdFx0XHRpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdCA9IHJlc3VsdDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMudGltZW91dCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29wdGlvbnMuZmV0Y2godGhpcy5yZXF1ZXN0LmNsb25lKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGltZW91dCh0aGlzLnJlcXVlc3QuY2xvbmUoKSwgdGhpcy5hYm9ydENvbnRyb2xsZXIsIHRoaXMuX29wdGlvbnMpO1xuXHRcdH1cblxuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0X3N0cmVhbShyZXNwb25zZSwgb25Eb3dubG9hZFByb2dyZXNzKSB7XG5cdFx0XHRjb25zdCB0b3RhbEJ5dGVzID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuXHRcdFx0bGV0IHRyYW5zZmVycmVkQnl0ZXMgPSAwO1xuXG5cdFx0XHRyZXR1cm4gbmV3IGdsb2JhbHMuUmVzcG9uc2UoXG5cdFx0XHRcdG5ldyBnbG9iYWxzLlJlYWRhYmxlU3RyZWFtKHtcblx0XHRcdFx0XHRzdGFydChjb250cm9sbGVyKSB7XG5cdFx0XHRcdFx0XHRjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuXG5cdFx0XHRcdFx0XHRpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG5cdFx0XHRcdFx0XHRcdG9uRG93bmxvYWRQcm9ncmVzcyh7cGVyY2VudDogMCwgdHJhbnNmZXJyZWRCeXRlczogMCwgdG90YWxCeXRlc30sIG5ldyBVaW50OEFycmF5KCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRhc3luYyBmdW5jdGlvbiByZWFkKCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7ZG9uZSwgdmFsdWV9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcblx0XHRcdFx0XHRcdFx0aWYgKGRvbmUpIHtcblx0XHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuXHRcdFx0XHRcdFx0XHRcdHRyYW5zZmVycmVkQnl0ZXMgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwZXJjZW50ID0gdG90YWxCeXRlcyA9PT0gMCA/IDAgOiB0cmFuc2ZlcnJlZEJ5dGVzIC8gdG90YWxCeXRlcztcblx0XHRcdFx0XHRcdFx0XHRvbkRvd25sb2FkUHJvZ3Jlc3Moe3BlcmNlbnQsIHRyYW5zZmVycmVkQnl0ZXMsIHRvdGFsQnl0ZXN9LCB2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmVucXVldWUodmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRyZWFkKCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJlYWQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHZhbGlkYXRlQW5kTWVyZ2UgPSAoLi4uc291cmNlcykgPT4ge1xuXHRcdGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcblx0XHRcdGlmICgoIWlzT2JqZWN0KHNvdXJjZSkgfHwgQXJyYXkuaXNBcnJheShzb3VyY2UpKSAmJiB0eXBlb2Ygc291cmNlICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYG9wdGlvbnNgIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlZXBNZXJnZSh7fSwgLi4uc291cmNlcyk7XG5cdH07XG5cblx0Y29uc3QgY3JlYXRlSW5zdGFuY2UgPSBkZWZhdWx0cyA9PiB7XG5cdFx0Y29uc3Qga3kgPSAoaW5wdXQsIG9wdGlvbnMpID0+IG5ldyBLeShpbnB1dCwgdmFsaWRhdGVBbmRNZXJnZShkZWZhdWx0cywgb3B0aW9ucykpO1xuXG5cdFx0Zm9yIChjb25zdCBtZXRob2Qgb2YgcmVxdWVzdE1ldGhvZHMpIHtcblx0XHRcdGt5W21ldGhvZF0gPSAoaW5wdXQsIG9wdGlvbnMpID0+IG5ldyBLeShpbnB1dCwgdmFsaWRhdGVBbmRNZXJnZShkZWZhdWx0cywgb3B0aW9ucywge21ldGhvZH0pKTtcblx0XHR9XG5cblx0XHRreS5IVFRQRXJyb3IgPSBIVFRQRXJyb3I7XG5cdFx0a3kuVGltZW91dEVycm9yID0gVGltZW91dEVycm9yO1xuXHRcdGt5LmNyZWF0ZSA9IG5ld0RlZmF1bHRzID0+IGNyZWF0ZUluc3RhbmNlKHZhbGlkYXRlQW5kTWVyZ2UobmV3RGVmYXVsdHMpKTtcblx0XHRreS5leHRlbmQgPSBuZXdEZWZhdWx0cyA9PiBjcmVhdGVJbnN0YW5jZSh2YWxpZGF0ZUFuZE1lcmdlKGRlZmF1bHRzLCBuZXdEZWZhdWx0cykpO1xuXHRcdGt5LnN0b3AgPSBzdG9wO1xuXG5cdFx0cmV0dXJuIGt5O1xuXHR9O1xuXG5cdHZhciBpbmRleCA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cblx0cmV0dXJuIGluZGV4O1xuXG59KSkpO1xuIiwiKGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKCk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKGRlZmluaXRpb24pO1xuICBlbHNlIGNvbnRleHRbbmFtZV0gPSBkZWZpbml0aW9uKCk7XG59KSgndXJsam9pbicsIHRoaXMsIGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBub3JtYWxpemUgKHN0ckFycmF5KSB7XG4gICAgdmFyIHJlc3VsdEFycmF5ID0gW107XG4gICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cblxuICAgIGlmICh0eXBlb2Ygc3RyQXJyYXlbMF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVcmwgbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgJyArIHN0ckFycmF5WzBdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZmlyc3QgcGFydCBpcyBhIHBsYWluIHByb3RvY29sLCB3ZSBjb21iaW5lIGl0IHdpdGggdGhlIG5leHQgcGFydC5cbiAgICBpZiAoc3RyQXJyYXlbMF0ubWF0Y2goL15bXi86XSs6XFwvKiQvKSAmJiBzdHJBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICB2YXIgZmlyc3QgPSBzdHJBcnJheS5zaGlmdCgpO1xuICAgICAgc3RyQXJyYXlbMF0gPSBmaXJzdCArIHN0ckFycmF5WzBdO1xuICAgIH1cblxuICAgIC8vIFRoZXJlIG11c3QgYmUgdHdvIG9yIHRocmVlIHNsYXNoZXMgaW4gdGhlIGZpbGUgcHJvdG9jb2wsIHR3byBzbGFzaGVzIGluIGFueXRoaW5nIGVsc2UuXG4gICAgaWYgKHN0ckFycmF5WzBdLm1hdGNoKC9eZmlsZTpcXC9cXC9cXC8vKSkge1xuICAgICAgc3RyQXJyYXlbMF0gPSBzdHJBcnJheVswXS5yZXBsYWNlKC9eKFteLzpdKyk6XFwvKi8sICckMTovLy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyQXJyYXlbMF0gPSBzdHJBcnJheVswXS5yZXBsYWNlKC9eKFteLzpdKyk6XFwvKi8sICckMTovLycpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBzdHJBcnJheVtpXTtcblxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VybCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAnICsgY29tcG9uZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBvbmVudCA9PT0gJycpIHsgY29udGludWU7IH1cblxuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIC8vIFJlbW92aW5nIHRoZSBzdGFydGluZyBzbGFzaGVzIGZvciBlYWNoIGNvbXBvbmVudCBidXQgdGhlIGZpcnN0LlxuICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQucmVwbGFjZSgvXltcXC9dKy8sICcnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpIDwgc3RyQXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgICAvLyBSZW1vdmluZyB0aGUgZW5kaW5nIHNsYXNoZXMgZm9yIGVhY2ggY29tcG9uZW50IGJ1dCB0aGUgbGFzdC5cbiAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LnJlcGxhY2UoL1tcXC9dKyQvLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3IgdGhlIGxhc3QgY29tcG9uZW50IHdlIHdpbGwgY29tYmluZSBtdWx0aXBsZSBzbGFzaGVzIHRvIGEgc2luZ2xlIG9uZS5cbiAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LnJlcGxhY2UoL1tcXC9dKyQvLCAnLycpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRBcnJheS5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICB9XG5cbiAgICB2YXIgc3RyID0gcmVzdWx0QXJyYXkuam9pbignLycpO1xuICAgIC8vIEVhY2ggaW5wdXQgY29tcG9uZW50IGlzIG5vdyBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc2xhc2ggZXhjZXB0IHRoZSBwb3NzaWJsZSBmaXJzdCBwbGFpbiBwcm90b2NvbCBwYXJ0LlxuXG4gICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoIGJlZm9yZSBwYXJhbWV0ZXJzIG9yIGhhc2hcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFwvKFxcP3wmfCNbXiFdKS9nLCAnJDEnKTtcblxuICAgIC8vIHJlcGxhY2UgPyBpbiBwYXJhbWV0ZXJzIHdpdGggJlxuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnPycpO1xuICAgIHN0ciA9IHBhcnRzLnNoaWZ0KCkgKyAocGFydHMubGVuZ3RoID4gMCA/ICc/JzogJycpICsgcGFydHMuam9pbignJicpO1xuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlucHV0O1xuXG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICBpbnB1dCA9IGFyZ3VtZW50c1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZShpbnB1dCk7XG4gIH07XG5cbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImh0dHBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaHR0cHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3RyZWFtXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVybFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1dGlsXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInpsaWJcIik7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmZXRjaDtcblxuY29uc3QgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IGRhdGFVcmlUb0J1ZmZlciA9IHJlcXVpcmUoJ2RhdGEtdXJpLXRvLWJ1ZmZlcicpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IEJsb2IgPSByZXF1aXJlKCdmZXRjaC1ibG9iJyk7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IHVybCA9IHJlcXVpcmUoJ3VybCcpO1xuXG5jbGFzcyBGZXRjaEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgdHlwZSkge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdC8vIEhpZGUgY3VzdG9tIGVycm9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZnJvbSBlbmQtdXNlcnNcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcblxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdH1cblxuXHRnZXQgbmFtZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXHR9XG5cblx0Z2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG5cdH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBhZGRyZXNzPzogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIGRlc3Q/OiBzdHJpbmcsIGVycm5vOiBudW1iZXIsIGluZm8/OiBvYmplY3QsIG1lc3NhZ2U6IHN0cmluZywgcGF0aD86IHN0cmluZywgcG9ydD86IG51bWJlciwgc3lzY2FsbDogc3RyaW5nfX0gU3lzdGVtRXJyb3JcbiovXG5cbi8qKlxuICogRmV0Y2hFcnJvciBpbnRlcmZhY2UgZm9yIG9wZXJhdGlvbmFsIGVycm9yc1xuICovXG5jbGFzcyBGZXRjaEVycm9yIGV4dGVuZHMgRmV0Y2hCYXNlRXJyb3Ige1xuXHQvKipcblx0ICogQHBhcmFtICB7c3RyaW5nfSBtZXNzYWdlIC0gICAgICBFcnJvciBtZXNzYWdlIGZvciBodW1hblxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IFt0eXBlXSAtICAgICAgICBFcnJvciB0eXBlIGZvciBtYWNoaW5lXG5cdCAqIEBwYXJhbSAge1N5c3RlbUVycm9yfSBbc3lzdGVtRXJyb3JdIC0gRm9yIE5vZGUuanMgc3lzdGVtIGVycm9yXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCB0eXBlLCBzeXN0ZW1FcnJvcikge1xuXHRcdHN1cGVyKG1lc3NhZ2UsIHR5cGUpO1xuXHRcdC8vIFdoZW4gZXJyLnR5cGUgaXMgYHN5c3RlbWAsIGVyci5lcnJvcmVkU3lzQ2FsbCBjb250YWlucyBzeXN0ZW0gZXJyb3IgYW5kIGVyci5jb2RlIGNvbnRhaW5zIHN5c3RlbSBlcnJvciBjb2RlXG5cdFx0aWYgKHN5c3RlbUVycm9yKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG5cdFx0XHR0aGlzLmNvZGUgPSB0aGlzLmVycm5vID0gc3lzdGVtRXJyb3IuY29kZTtcblx0XHRcdHRoaXMuZXJyb3JlZFN5c0NhbGwgPSBzeXN0ZW1FcnJvci5zeXNjYWxsO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIElzLmpzXG4gKlxuICogT2JqZWN0IHR5cGUgY2hlY2tzLlxuICovXG5cbmNvbnN0IE5BTUUgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKiByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvaXNzdWVzLzI5NiNpc3N1ZWNvbW1lbnQtMzA3NTk4MTQzXG4gKlxuICogQHBhcmFtICB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtZXRlcnMgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIG9iamVjdC5hcHBlbmQgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmRlbGV0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0ID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5nZXRBbGwgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmhhcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3Quc2V0ID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5zb3J0ID09PSAnZnVuY3Rpb24nICYmXG5cdFx0b2JqZWN0W05BTUVdID09PSAnVVJMU2VhcmNoUGFyYW1zJ1xuXHQpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqZWN0YCBpcyBhIFczQyBgQmxvYmAgb2JqZWN0ICh3aGljaCBgRmlsZWAgaW5oZXJpdHMgZnJvbSlcbiAqXG4gKiBAcGFyYW0gIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQmxvYiA9IG9iamVjdCA9PiB7XG5cdHJldHVybiAoXG5cdFx0dHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC50eXBlID09PSAnc3RyaW5nJyAmJlxuXHRcdHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdC9eKEJsb2J8RmlsZSkkLy50ZXN0KG9iamVjdFtOQU1FXSlcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBzcGVjLWNvbXBsaWFudCBgRm9ybURhdGFgIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKG9iamVjdCkge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIG9iamVjdC5hcHBlbmQgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QuZ2V0ID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5nZXRBbGwgPT09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2Ygb2JqZWN0LmRlbGV0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBvYmplY3QudmFsdWVzID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5lbnRyaWVzID09PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdG9iamVjdFtOQU1FXSA9PT0gJ0Zvcm1EYXRhJ1xuXHQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGFuIGluc3RhbmNlIG9mIEFib3J0U2lnbmFsLlxuICpcbiAqIEBwYXJhbSAgeyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNBYm9ydFNpZ25hbCA9IG9iamVjdCA9PiB7XG5cdHJldHVybiAoXG5cdFx0dHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiZcblx0XHRvYmplY3RbTkFNRV0gPT09ICdBYm9ydFNpZ25hbCdcblx0KTtcbn07XG5cbmNvbnN0IGNhcnJpYWdlID0gJ1xcclxcbic7XG5jb25zdCBkYXNoZXMgPSAnLScucmVwZWF0KDIpO1xuY29uc3QgY2FycmlhZ2VMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChjYXJyaWFnZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGJvdW5kYXJ5XG4gKi9cbmNvbnN0IGdldEZvb3RlciA9IGJvdW5kYXJ5ID0+IGAke2Rhc2hlc30ke2JvdW5kYXJ5fSR7ZGFzaGVzfSR7Y2FycmlhZ2UucmVwZWF0KDIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGJvdW5kYXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSBmaWVsZFxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGVyKGJvdW5kYXJ5LCBuYW1lLCBmaWVsZCkge1xuXHRsZXQgaGVhZGVyID0gJyc7XG5cblx0aGVhZGVyICs9IGAke2Rhc2hlc30ke2JvdW5kYXJ5fSR7Y2FycmlhZ2V9YDtcblx0aGVhZGVyICs9IGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIke25hbWV9XCJgO1xuXG5cdGlmIChpc0Jsb2IoZmllbGQpKSB7XG5cdFx0aGVhZGVyICs9IGA7IGZpbGVuYW1lPVwiJHtmaWVsZC5uYW1lfVwiJHtjYXJyaWFnZX1gO1xuXHRcdGhlYWRlciArPSBgQ29udGVudC1UeXBlOiAke2ZpZWxkLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSd9YDtcblx0fVxuXG5cdHJldHVybiBgJHtoZWFkZXJ9JHtjYXJyaWFnZS5yZXBlYXQoMil9YDtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldEJvdW5kYXJ5ID0gKCkgPT4gY3J5cHRvLnJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gYm91bmRhcnlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gKiBmb3JtRGF0YUl0ZXJhdG9yKGZvcm0sIGJvdW5kYXJ5KSB7XG5cdGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBmb3JtKSB7XG5cdFx0eWllbGQgZ2V0SGVhZGVyKGJvdW5kYXJ5LCBuYW1lLCB2YWx1ZSk7XG5cblx0XHRpZiAoaXNCbG9iKHZhbHVlKSkge1xuXHRcdFx0eWllbGQgKiB2YWx1ZS5zdHJlYW0oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0eWllbGQgdmFsdWU7XG5cdFx0fVxuXG5cdFx0eWllbGQgY2FycmlhZ2U7XG5cdH1cblxuXHR5aWVsZCBnZXRGb290ZXIoYm91bmRhcnkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1cbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiBnZXRGb3JtRGF0YUxlbmd0aChmb3JtLCBib3VuZGFyeSkge1xuXHRsZXQgbGVuZ3RoID0gMDtcblxuXHRmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZm9ybSkge1xuXHRcdGxlbmd0aCArPSBCdWZmZXIuYnl0ZUxlbmd0aChnZXRIZWFkZXIoYm91bmRhcnksIG5hbWUsIHZhbHVlKSk7XG5cblx0XHRpZiAoaXNCbG9iKHZhbHVlKSkge1xuXHRcdFx0bGVuZ3RoICs9IHZhbHVlLnNpemU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxlbmd0aCArPSBCdWZmZXIuYnl0ZUxlbmd0aChTdHJpbmcodmFsdWUpKTtcblx0XHR9XG5cblx0XHRsZW5ndGggKz0gY2FycmlhZ2VMZW5ndGg7XG5cdH1cblxuXHRsZW5ndGggKz0gQnVmZmVyLmJ5dGVMZW5ndGgoZ2V0Rm9vdGVyKGJvdW5kYXJ5KSk7XG5cblx0cmV0dXJuIGxlbmd0aDtcbn1cblxuY29uc3QgSU5URVJOQUxTID0gU3ltYm9sKCdCb2R5IGludGVybmFscycpO1xuXG4vKipcbiAqIEJvZHkgbWl4aW5cbiAqXG4gKiBSZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5XG4gKlxuICogQHBhcmFtICAgU3RyZWFtICBib2R5ICBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSAgIE9iamVjdCAgb3B0cyAgUmVzcG9uc2Ugb3B0aW9uc1xuICogQHJldHVybiAgVm9pZFxuICovXG5jbGFzcyBCb2R5IHtcblx0Y29uc3RydWN0b3IoYm9keSwge1xuXHRcdHNpemUgPSAwXG5cdH0gPSB7fSkge1xuXHRcdGxldCBib3VuZGFyeSA9IG51bGw7XG5cblx0XHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQm9keSBpcyB1bmRlZmluZWQgb3IgbnVsbFxuXHRcdFx0Ym9keSA9IG51bGw7XG5cdFx0fSBlbHNlIGlmIChpc1VSTFNlYXJjaFBhcmFtZXRlcnMoYm9keSkpIHtcblx0XHQvLyBCb2R5IGlzIGEgVVJMU2VhcmNoUGFyYW1zXG5cdFx0XHRib2R5ID0gQnVmZmVyLmZyb20oYm9keS50b1N0cmluZygpKTtcblx0XHR9IGVsc2UgaWYgKGlzQmxvYihib2R5KSkgOyBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIDsgZWxzZSBpZiAodXRpbC50eXBlcy5pc0FueUFycmF5QnVmZmVyKGJvZHkpKSB7XG5cdFx0XHQvLyBCb2R5IGlzIEFycmF5QnVmZmVyXG5cdFx0XHRib2R5ID0gQnVmZmVyLmZyb20oYm9keSk7XG5cdFx0fSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYm9keSkpIHtcblx0XHRcdC8vIEJvZHkgaXMgQXJyYXlCdWZmZXJWaWV3XG5cdFx0XHRib2R5ID0gQnVmZmVyLmZyb20oYm9keS5idWZmZXIsIGJvZHkuYnl0ZU9mZnNldCwgYm9keS5ieXRlTGVuZ3RoKTtcblx0XHR9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pIDsgZWxzZSBpZiAoaXNGb3JtRGF0YShib2R5KSkge1xuXHRcdFx0Ly8gQm9keSBpcyBhbiBpbnN0YW5jZSBvZiBmb3JtZGF0YS1ub2RlXG5cdFx0XHRib3VuZGFyeSA9IGBOb2RlRmV0Y2hGb3JtRGF0YUJvdW5kYXJ5JHtnZXRCb3VuZGFyeSgpfWA7XG5cdFx0XHRib2R5ID0gU3RyZWFtLlJlYWRhYmxlLmZyb20oZm9ybURhdGFJdGVyYXRvcihib2R5LCBib3VuZGFyeSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBOb25lIG9mIHRoZSBhYm92ZVxuXHRcdFx0Ly8gY29lcmNlIHRvIHN0cmluZyB0aGVuIGJ1ZmZlclxuXHRcdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKFN0cmluZyhib2R5KSk7XG5cdFx0fVxuXG5cdFx0dGhpc1tJTlRFUk5BTFNdID0ge1xuXHRcdFx0Ym9keSxcblx0XHRcdGJvdW5kYXJ5LFxuXHRcdFx0ZGlzdHVyYmVkOiBmYWxzZSxcblx0XHRcdGVycm9yOiBudWxsXG5cdFx0fTtcblx0XHR0aGlzLnNpemUgPSBzaXplO1xuXG5cdFx0aWYgKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pIHtcblx0XHRcdGJvZHkub24oJ2Vycm9yJywgZXJyID0+IHtcblx0XHRcdFx0Y29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBGZXRjaEJhc2VFcnJvciA/XG5cdFx0XHRcdFx0ZXJyIDpcblx0XHRcdFx0XHRuZXcgRmV0Y2hFcnJvcihgSW52YWxpZCByZXNwb25zZSBib2R5IHdoaWxlIHRyeWluZyB0byBmZXRjaCAke3RoaXMudXJsfTogJHtlcnIubWVzc2FnZX1gLCAnc3lzdGVtJywgZXJyKTtcblx0XHRcdFx0dGhpc1tJTlRFUk5BTFNdLmVycm9yID0gZXJyb3I7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRnZXQgYm9keSgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFNdLmJvZHk7XG5cdH1cblxuXHRnZXQgYm9keVVzZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTXS5kaXN0dXJiZWQ7XG5cdH1cblxuXHQvKipcblx0ICogRGVjb2RlIHJlc3BvbnNlIGFzIEFycmF5QnVmZmVyXG5cdCAqXG5cdCAqIEByZXR1cm4gIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGFycmF5QnVmZmVyKCkge1xuXHRcdGNvbnN0IHtidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGh9ID0gYXdhaXQgY29uc3VtZUJvZHkodGhpcyk7XG5cdFx0cmV0dXJuIGJ1ZmZlci5zbGljZShieXRlT2Zmc2V0LCBieXRlT2Zmc2V0ICsgYnl0ZUxlbmd0aCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJuIHJhdyByZXNwb25zZSBhcyBCbG9iXG5cdCAqXG5cdCAqIEByZXR1cm4gUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgYmxvYigpIHtcblx0XHRjb25zdCBjdCA9ICh0aGlzLmhlYWRlcnMgJiYgdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHx8ICh0aGlzW0lOVEVSTkFMU10uYm9keSAmJiB0aGlzW0lOVEVSTkFMU10uYm9keS50eXBlKSB8fCAnJztcblx0XHRjb25zdCBidWYgPSBhd2FpdCB0aGlzLmJ1ZmZlcigpO1xuXG5cdFx0cmV0dXJuIG5ldyBCbG9iKFtidWZdLCB7XG5cdFx0XHR0eXBlOiBjdFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY29kZSByZXNwb25zZSBhcyBqc29uXG5cdCAqXG5cdCAqIEByZXR1cm4gIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGpzb24oKSB7XG5cdFx0Y29uc3QgYnVmZmVyID0gYXdhaXQgY29uc3VtZUJvZHkodGhpcyk7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY29kZSByZXNwb25zZSBhcyB0ZXh0XG5cdCAqXG5cdCAqIEByZXR1cm4gIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIHRleHQoKSB7XG5cdFx0Y29uc3QgYnVmZmVyID0gYXdhaXQgY29uc3VtZUJvZHkodGhpcyk7XG5cdFx0cmV0dXJuIGJ1ZmZlci50b1N0cmluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY29kZSByZXNwb25zZSBhcyBidWZmZXIgKG5vbi1zcGVjIGFwaSlcblx0ICpcblx0ICogQHJldHVybiAgUHJvbWlzZVxuXHQgKi9cblx0YnVmZmVyKCkge1xuXHRcdHJldHVybiBjb25zdW1lQm9keSh0aGlzKTtcblx0fVxufVxuXG4vLyBJbiBicm93c2VycywgYWxsIHByb3BlcnRpZXMgYXJlIGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCb2R5LnByb3RvdHlwZSwge1xuXHRib2R5OiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGJvZHlVc2VkOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGFycmF5QnVmZmVyOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGJsb2I6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0anNvbjoge2VudW1lcmFibGU6IHRydWV9LFxuXHR0ZXh0OiB7ZW51bWVyYWJsZTogdHJ1ZX1cbn0pO1xuXG4vKipcbiAqIENvbnN1bWUgYW5kIGNvbnZlcnQgYW4gZW50aXJlIEJvZHkgdG8gYSBCdWZmZXIuXG4gKlxuICogUmVmOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LWNvbnN1bWUtYm9keVxuICpcbiAqIEByZXR1cm4gUHJvbWlzZVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25zdW1lQm9keShkYXRhKSB7XG5cdGlmIChkYXRhW0lOVEVSTkFMU10uZGlzdHVyYmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgYm9keSB1c2VkIGFscmVhZHkgZm9yOiAke2RhdGEudXJsfWApO1xuXHR9XG5cblx0ZGF0YVtJTlRFUk5BTFNdLmRpc3R1cmJlZCA9IHRydWU7XG5cblx0aWYgKGRhdGFbSU5URVJOQUxTXS5lcnJvcikge1xuXHRcdHRocm93IGRhdGFbSU5URVJOQUxTXS5lcnJvcjtcblx0fVxuXG5cdGxldCB7Ym9keX0gPSBkYXRhO1xuXG5cdC8vIEJvZHkgaXMgbnVsbFxuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGJsb2Jcblx0aWYgKGlzQmxvYihib2R5KSkge1xuXHRcdGJvZHkgPSBib2R5LnN0cmVhbSgpO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBidWZmZXJcblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuXHRcdHJldHVybiBib2R5O1xuXHR9XG5cblx0LyogYzggaWdub3JlIG5leHQgMyAqL1xuXHRpZiAoIShib2R5IGluc3RhbmNlb2YgU3RyZWFtKSkge1xuXHRcdHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG5cdH1cblxuXHQvLyBCb2R5IGlzIHN0cmVhbVxuXHQvLyBnZXQgcmVhZHkgdG8gYWN0dWFsbHkgY29uc3VtZSB0aGUgYm9keVxuXHRjb25zdCBhY2N1bSA9IFtdO1xuXHRsZXQgYWNjdW1CeXRlcyA9IDA7XG5cblx0dHJ5IHtcblx0XHRmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcblx0XHRcdGlmIChkYXRhLnNpemUgPiAwICYmIGFjY3VtQnl0ZXMgKyBjaHVuay5sZW5ndGggPiBkYXRhLnNpemUpIHtcblx0XHRcdFx0Y29uc3QgZXJyID0gbmV3IEZldGNoRXJyb3IoYGNvbnRlbnQgc2l6ZSBhdCAke2RhdGEudXJsfSBvdmVyIGxpbWl0OiAke2RhdGEuc2l6ZX1gLCAnbWF4LXNpemUnKTtcblx0XHRcdFx0Ym9keS5kZXN0cm95KGVycik7XG5cdFx0XHRcdHRocm93IGVycjtcblx0XHRcdH1cblxuXHRcdFx0YWNjdW1CeXRlcyArPSBjaHVuay5sZW5ndGg7XG5cdFx0XHRhY2N1bS5wdXNoKGNodW5rKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgRmV0Y2hCYXNlRXJyb3IpIHtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlciBlcnJvcnMsIHN1Y2ggYXMgaW5jb3JyZWN0IGNvbnRlbnQtZW5jb2Rpbmdcblx0XHRcdHRocm93IG5ldyBGZXRjaEVycm9yKGBJbnZhbGlkIHJlc3BvbnNlIGJvZHkgd2hpbGUgdHJ5aW5nIHRvIGZldGNoICR7ZGF0YS51cmx9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoYm9keS5yZWFkYWJsZUVuZGVkID09PSB0cnVlIHx8IGJvZHkuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPT09IHRydWUpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFjY3VtLmV2ZXJ5KGMgPT4gdHlwZW9mIGMgPT09ICdzdHJpbmcnKSkge1xuXHRcdFx0XHRyZXR1cm4gQnVmZmVyLmZyb20oYWNjdW0uam9pbignJykpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gQnVmZmVyLmNvbmNhdChhY2N1bSwgYWNjdW1CeXRlcyk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBGZXRjaEVycm9yKGBDb3VsZCBub3QgY3JlYXRlIEJ1ZmZlciBmcm9tIHJlc3BvbnNlIGJvZHkgZm9yICR7ZGF0YS51cmx9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycm9yKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEZldGNoRXJyb3IoYFByZW1hdHVyZSBjbG9zZSBvZiBzZXJ2ZXIgcmVzcG9uc2Ugd2hpbGUgdHJ5aW5nIHRvIGZldGNoICR7ZGF0YS51cmx9YCk7XG5cdH1cbn1cblxuLyoqXG4gKiBDbG9uZSBib2R5IGdpdmVuIFJlcy9SZXEgaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0gICBNaXhlZCAgIGluc3RhbmNlICAgICAgIFJlc3BvbnNlIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEBwYXJhbSAgIFN0cmluZyAgaGlnaFdhdGVyTWFyayAgaGlnaFdhdGVyTWFyayBmb3IgYm90aCBQYXNzVGhyb3VnaCBib2R5IHN0cmVhbXNcbiAqIEByZXR1cm4gIE1peGVkXG4gKi9cbmNvbnN0IGNsb25lID0gKGluc3RhbmNlLCBoaWdoV2F0ZXJNYXJrKSA9PiB7XG5cdGxldCBwMTtcblx0bGV0IHAyO1xuXHRsZXQge2JvZHl9ID0gaW5zdGFuY2U7XG5cblx0Ly8gRG9uJ3QgYWxsb3cgY2xvbmluZyBhIHVzZWQgYm9keVxuXHRpZiAoaW5zdGFuY2UuYm9keVVzZWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBjbG9uZSBib2R5IGFmdGVyIGl0IGlzIHVzZWQnKTtcblx0fVxuXG5cdC8vIENoZWNrIHRoYXQgYm9keSBpcyBhIHN0cmVhbSBhbmQgbm90IGZvcm0tZGF0YSBvYmplY3Rcblx0Ly8gbm90ZTogd2UgY2FuJ3QgY2xvbmUgdGhlIGZvcm0tZGF0YSBvYmplY3Qgd2l0aG91dCBoYXZpbmcgaXQgYXMgYSBkZXBlbmRlbmN5XG5cdGlmICgoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkgJiYgKHR5cGVvZiBib2R5LmdldEJvdW5kYXJ5ICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdC8vIFRlZSBpbnN0YW5jZSBib2R5XG5cdFx0cDEgPSBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKHtoaWdoV2F0ZXJNYXJrfSk7XG5cdFx0cDIgPSBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKHtoaWdoV2F0ZXJNYXJrfSk7XG5cdFx0Ym9keS5waXBlKHAxKTtcblx0XHRib2R5LnBpcGUocDIpO1xuXHRcdC8vIFNldCBpbnN0YW5jZSBib2R5IHRvIHRlZWQgYm9keSBhbmQgcmV0dXJuIHRoZSBvdGhlciB0ZWVkIGJvZHlcblx0XHRpbnN0YW5jZVtJTlRFUk5BTFNdLmJvZHkgPSBwMTtcblx0XHRib2R5ID0gcDI7XG5cdH1cblxuXHRyZXR1cm4gYm9keTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIG9wZXJhdGlvbiBcImV4dHJhY3QgYSBgQ29udGVudC1UeXBlYCB2YWx1ZSBmcm9tIHxvYmplY3R8XCIgYXNcbiAqIHNwZWNpZmllZCBpbiB0aGUgc3BlY2lmaWNhdGlvbjpcbiAqIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHlpbml0LWV4dHJhY3RcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBpbnN0YW5jZS5ib2R5IGlzIHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHthbnl9IGJvZHkgQW55IG9wdGlvbnMuYm9keSBpbnB1dFxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gKi9cbmNvbnN0IGV4dHJhY3RDb250ZW50VHlwZSA9IChib2R5LCByZXF1ZXN0KSA9PiB7XG5cdC8vIEJvZHkgaXMgbnVsbCBvciB1bmRlZmluZWRcblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgc3RyaW5nXG5cdGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCc7XG5cdH1cblxuXHQvLyBCb2R5IGlzIGEgVVJMU2VhcmNoUGFyYW1zXG5cdGlmIChpc1VSTFNlYXJjaFBhcmFtZXRlcnMoYm9keSkpIHtcblx0XHRyZXR1cm4gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jztcblx0fVxuXG5cdC8vIEJvZHkgaXMgYmxvYlxuXHRpZiAoaXNCbG9iKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGJvZHkudHlwZSB8fCBudWxsO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBhIEJ1ZmZlciAoQnVmZmVyLCBBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkgfHwgdXRpbC50eXBlcy5pc0FueUFycmF5QnVmZmVyKGJvZHkpIHx8IEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gRGV0ZWN0IGZvcm0gZGF0YSBpbnB1dCBmcm9tIGZvcm0tZGF0YSBtb2R1bGVcblx0aWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkuZ2V0Qm91bmRhcnkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gYG11bHRpcGFydC9mb3JtLWRhdGE7Ym91bmRhcnk9JHtib2R5LmdldEJvdW5kYXJ5KCl9YDtcblx0fVxuXG5cdGlmIChpc0Zvcm1EYXRhKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke3JlcXVlc3RbSU5URVJOQUxTXS5ib3VuZGFyeX1gO1xuXHR9XG5cblx0Ly8gQm9keSBpcyBzdHJlYW0gLSBjYW4ndCByZWFsbHkgZG8gbXVjaCBhYm91dCB0aGlzXG5cdGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBCb2R5IGNvbnN0cnVjdG9yIGRlZmF1bHRzIG90aGVyIHRoaW5ncyB0byBzdHJpbmdcblx0cmV0dXJuICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnO1xufTtcblxuLyoqXG4gKiBUaGUgRmV0Y2ggU3RhbmRhcmQgdHJlYXRzIHRoaXMgYXMgaWYgXCJ0b3RhbCBieXRlc1wiIGlzIGEgcHJvcGVydHkgb24gdGhlIGJvZHkuXG4gKiBGb3IgdXMsIHdlIGhhdmUgdG8gZXhwbGljaXRseSBnZXQgaXQgd2l0aCBhIGZ1bmN0aW9uLlxuICpcbiAqIHJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS10b3RhbC1ieXRlc1xuICpcbiAqIEBwYXJhbSB7YW55fSBvYmouYm9keSBCb2R5IG9iamVjdCBmcm9tIHRoZSBCb2R5IGluc3RhbmNlLlxuICogQHJldHVybnMge251bWJlciB8IG51bGx9XG4gKi9cbmNvbnN0IGdldFRvdGFsQnl0ZXMgPSByZXF1ZXN0ID0+IHtcblx0Y29uc3Qge2JvZHl9ID0gcmVxdWVzdDtcblxuXHQvLyBCb2R5IGlzIG51bGwgb3IgdW5kZWZpbmVkXG5cdGlmIChib2R5ID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHQvLyBCb2R5IGlzIEJsb2Jcblx0aWYgKGlzQmxvYihib2R5KSkge1xuXHRcdHJldHVybiBib2R5LnNpemU7XG5cdH1cblxuXHQvLyBCb2R5IGlzIEJ1ZmZlclxuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGJvZHkubGVuZ3RoO1xuXHR9XG5cblx0Ly8gRGV0ZWN0IGZvcm0gZGF0YSBpbnB1dCBmcm9tIGZvcm0tZGF0YSBtb2R1bGVcblx0aWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkuZ2V0TGVuZ3RoU3luYyA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBib2R5Lmhhc0tub3duTGVuZ3RoICYmIGJvZHkuaGFzS25vd25MZW5ndGgoKSA/IGJvZHkuZ2V0TGVuZ3RoU3luYygpIDogbnVsbDtcblx0fVxuXG5cdC8vIEJvZHkgaXMgYSBzcGVjLWNvbXBsaWFudCBmb3JtLWRhdGFcblx0aWYgKGlzRm9ybURhdGEoYm9keSkpIHtcblx0XHRyZXR1cm4gZ2V0Rm9ybURhdGFMZW5ndGgocmVxdWVzdFtJTlRFUk5BTFNdLmJvdW5kYXJ5KTtcblx0fVxuXG5cdC8vIEJvZHkgaXMgc3RyZWFtXG5cdHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBXcml0ZSBhIEJvZHkgdG8gYSBOb2RlLmpzIFdyaXRhYmxlU3RyZWFtIChlLmcuIGh0dHAuUmVxdWVzdCkgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7U3RyZWFtLldyaXRhYmxlfSBkZXN0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uXG4gKiBAcGFyYW0gb2JqLmJvZHkgQm9keSBvYmplY3QgZnJvbSB0aGUgQm9keSBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCB3cml0ZVRvU3RyZWFtID0gKGRlc3QsIHtib2R5fSkgPT4ge1xuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdC8vIEJvZHkgaXMgbnVsbFxuXHRcdGRlc3QuZW5kKCk7XG5cdH0gZWxzZSBpZiAoaXNCbG9iKGJvZHkpKSB7XG5cdFx0Ly8gQm9keSBpcyBCbG9iXG5cdFx0Ym9keS5zdHJlYW0oKS5waXBlKGRlc3QpO1xuXHR9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuXHRcdC8vIEJvZHkgaXMgYnVmZmVyXG5cdFx0ZGVzdC53cml0ZShib2R5KTtcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJvZHkgaXMgc3RyZWFtXG5cdFx0Ym9keS5waXBlKGRlc3QpO1xuXHR9XG59O1xuXG4vKipcbiAqIEhlYWRlcnMuanNcbiAqXG4gKiBIZWFkZXJzIGNsYXNzIG9mZmVycyBjb252ZW5pZW50IGhlbHBlcnNcbiAqL1xuXG5jb25zdCB2YWxpZGF0ZUhlYWRlck5hbWUgPSB0eXBlb2YgaHR0cC52YWxpZGF0ZUhlYWRlck5hbWUgPT09ICdmdW5jdGlvbicgP1xuXHRodHRwLnZhbGlkYXRlSGVhZGVyTmFtZSA6XG5cdG5hbWUgPT4ge1xuXHRcdGlmICghL15bXFxeYFxcLVxcdyEjJCUmJyorLnx+XSskLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zdCBlcnIgPSBuZXcgVHlwZUVycm9yKGBIZWFkZXIgbmFtZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCB0b2tlbiBbJHtuYW1lfV1gKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdjb2RlJywge3ZhbHVlOiAnRVJSX0lOVkFMSURfSFRUUF9UT0tFTid9KTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH07XG5cbmNvbnN0IHZhbGlkYXRlSGVhZGVyVmFsdWUgPSB0eXBlb2YgaHR0cC52YWxpZGF0ZUhlYWRlclZhbHVlID09PSAnZnVuY3Rpb24nID9cblx0aHR0cC52YWxpZGF0ZUhlYWRlclZhbHVlIDpcblx0KG5hbWUsIHZhbHVlKSA9PiB7XG5cdFx0aWYgKC9bXlxcdFxcdTAwMjAtXFx1MDA3RVxcdTAwODAtXFx1MDBGRl0vLnRlc3QodmFsdWUpKSB7XG5cdFx0XHRjb25zdCBlcnIgPSBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgY29udGVudCBbXCIke25hbWV9XCJdYCk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnY29kZScsIHt2YWx1ZTogJ0VSUl9JTlZBTElEX0NIQVInfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIZWFkZXJzIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEl0ZXJhYmxlPHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+IHwgSXRlcmFibGU8SXRlcmFibGU8c3RyaW5nPj59IEhlYWRlcnNJbml0XG4gKi9cblxuLyoqXG4gKiBUaGlzIEZldGNoIEFQSSBpbnRlcmZhY2UgYWxsb3dzIHlvdSB0byBwZXJmb3JtIHZhcmlvdXMgYWN0aW9ucyBvbiBIVFRQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMuXG4gKiBUaGVzZSBhY3Rpb25zIGluY2x1ZGUgcmV0cmlldmluZywgc2V0dGluZywgYWRkaW5nIHRvLCBhbmQgcmVtb3ZpbmcuXG4gKiBBIEhlYWRlcnMgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGhlYWRlciBsaXN0LCB3aGljaCBpcyBpbml0aWFsbHkgZW1wdHkgYW5kIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSBuYW1lIGFuZCB2YWx1ZSBwYWlycy5cbiAqIFlvdSBjYW4gYWRkIHRvIHRoaXMgdXNpbmcgbWV0aG9kcyBsaWtlIGFwcGVuZCgpIChzZWUgRXhhbXBsZXMuKVxuICogSW4gYWxsIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2UsIGhlYWRlciBuYW1lcyBhcmUgbWF0Y2hlZCBieSBjYXNlLWluc2Vuc2l0aXZlIGJ5dGUgc2VxdWVuY2UuXG4gKlxuICovXG5jbGFzcyBIZWFkZXJzIGV4dGVuZHMgVVJMU2VhcmNoUGFyYW1zIHtcblx0LyoqXG5cdCAqIEhlYWRlcnMgY2xhc3Ncblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7SGVhZGVyc0luaXR9IFtpbml0XSAtIFJlc3BvbnNlIGhlYWRlcnNcblx0ICovXG5cdGNvbnN0cnVjdG9yKGluaXQpIHtcblx0XHQvLyBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGluaXQgb2JqZWN0IGluIFtuYW1lLCB2YWx1ZShzKV1bXVxuXHRcdC8qKiBAdHlwZSB7c3RyaW5nW11bXX0gKi9cblx0XHRsZXQgcmVzdWx0ID0gW107XG5cdFx0aWYgKGluaXQgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG5cdFx0XHRjb25zdCByYXcgPSBpbml0LnJhdygpO1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhyYXcpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKC4uLnZhbHVlcy5tYXAodmFsdWUgPT4gW25hbWUsIHZhbHVlXSkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaW5pdCA9PSBudWxsKSA7IGVsc2UgaWYgKHR5cGVvZiBpbml0ID09PSAnb2JqZWN0JyAmJiAhdXRpbC50eXBlcy5pc0JveGVkUHJpbWl0aXZlKGluaXQpKSB7XG5cdFx0XHRjb25zdCBtZXRob2QgPSBpbml0W1N5bWJvbC5pdGVyYXRvcl07XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCwgZXFlcWVxXG5cdFx0XHRpZiAobWV0aG9kID09IG51bGwpIHtcblx0XHRcdFx0Ly8gUmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+XG5cdFx0XHRcdHJlc3VsdC5wdXNoKC4uLk9iamVjdC5lbnRyaWVzKGluaXQpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSGVhZGVyIHBhaXJzIG11c3QgYmUgaXRlcmFibGUnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PlxuXHRcdFx0XHQvLyBOb3RlOiBwZXIgc3BlYyB3ZSBoYXZlIHRvIGZpcnN0IGV4aGF1c3QgdGhlIGxpc3RzIHRoZW4gcHJvY2VzcyB0aGVtXG5cdFx0XHRcdHJlc3VsdCA9IFsuLi5pbml0XVxuXHRcdFx0XHRcdC5tYXAocGFpciA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBwYWlyICE9PSAnb2JqZWN0JyB8fCB1dGlsLnR5cGVzLmlzQm94ZWRQcmltaXRpdmUocGFpcilcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFYWNoIGhlYWRlciBwYWlyIG11c3QgYmUgYW4gaXRlcmFibGUgb2JqZWN0Jyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBbLi4ucGFpcl07XG5cdFx0XHRcdFx0fSkubWFwKHBhaXIgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhaXIubGVuZ3RoICE9PSAyKSB7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0VhY2ggaGVhZGVyIHBhaXIgbXVzdCBiZSBhIG5hbWUvdmFsdWUgdHVwbGUnKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIFsuLi5wYWlyXTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIGNvbnN0cnVjdCBcXCdIZWFkZXJzXFwnOiBUaGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IG9mIHR5cGUgXFwnKHNlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PiBvciByZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4pJyk7XG5cdFx0fVxuXG5cdFx0Ly8gVmFsaWRhdGUgYW5kIGxvd2VyY2FzZVxuXHRcdHJlc3VsdCA9XG5cdFx0XHRyZXN1bHQubGVuZ3RoID4gMCA/XG5cdFx0XHRcdHJlc3VsdC5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IHtcblx0XHRcdFx0XHR2YWxpZGF0ZUhlYWRlck5hbWUobmFtZSk7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJWYWx1ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcblx0XHRcdFx0XHRyZXR1cm4gW1N0cmluZyhuYW1lKS50b0xvd2VyQ2FzZSgpLCBTdHJpbmcodmFsdWUpXTtcblx0XHRcdFx0fSkgOlxuXHRcdFx0XHR1bmRlZmluZWQ7XG5cblx0XHRzdXBlcihyZXN1bHQpO1xuXG5cdFx0Ly8gUmV0dXJuaW5nIGEgUHJveHkgdGhhdCB3aWxsIGxvd2VyY2FzZSBrZXkgbmFtZXMsIHZhbGlkYXRlIHBhcmFtZXRlcnMgYW5kIHNvcnQga2V5c1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cblx0XHRyZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcblx0XHRcdGdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKSB7XG5cdFx0XHRcdHN3aXRjaCAocCkge1xuXHRcdFx0XHRcdGNhc2UgJ2FwcGVuZCc6XG5cdFx0XHRcdFx0Y2FzZSAnc2V0Jzpcblx0XHRcdFx0XHRcdHJldHVybiAobmFtZSwgdmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdFx0XHR2YWxpZGF0ZUhlYWRlclZhbHVlKG5hbWUsIFN0cmluZyh2YWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZVtwXS5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdHJlY2VpdmVyLFxuXHRcdFx0XHRcdFx0XHRcdFN0cmluZyhuYW1lKS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFN0cmluZyh2YWx1ZSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjYXNlICdkZWxldGUnOlxuXHRcdFx0XHRcdGNhc2UgJ2hhcyc6XG5cdFx0XHRcdFx0Y2FzZSAnZ2V0QWxsJzpcblx0XHRcdFx0XHRcdHJldHVybiBuYW1lID0+IHtcblx0XHRcdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJOYW1lKG5hbWUpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZVtwXS5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdHJlY2VpdmVyLFxuXHRcdFx0XHRcdFx0XHRcdFN0cmluZyhuYW1lKS50b0xvd2VyQ2FzZSgpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Y2FzZSAna2V5cyc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQuc29ydCgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFNldChVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmtleXMuY2FsbCh0YXJnZXQpKS5rZXlzKCk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0LyogYzggaWdub3JlIG5leHQgKi9cblx0XHR9KTtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXHR9XG5cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKTtcblx0fVxuXG5cdGdldChuYW1lKSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRBbGwobmFtZSk7XG5cdFx0aWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGxldCB2YWx1ZSA9IHZhbHVlcy5qb2luKCcsICcpO1xuXHRcdGlmICgvXmNvbnRlbnQtZW5jb2RpbmckL2kudGVzdChuYW1lKSkge1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdGZvckVhY2goY2FsbGJhY2spIHtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5rZXlzKCkpIHtcblx0XHRcdGNhbGxiYWNrKHRoaXMuZ2V0KG5hbWUpLCBuYW1lKTtcblx0XHR9XG5cdH1cblxuXHQqIHZhbHVlcygpIHtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5rZXlzKCkpIHtcblx0XHRcdHlpZWxkIHRoaXMuZ2V0KG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAdHlwZSB7KCkgPT4gSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPn1cblx0ICovXG5cdCogZW50cmllcygpIHtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5rZXlzKCkpIHtcblx0XHRcdHlpZWxkIFtuYW1lLCB0aGlzLmdldChuYW1lKV07XG5cdFx0fVxuXHR9XG5cblx0W1N5bWJvbC5pdGVyYXRvcl0oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZW50cmllcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5vZGUtZmV0Y2ggbm9uLXNwZWMgbWV0aG9kXG5cdCAqIHJldHVybmluZyBhbGwgaGVhZGVycyBhbmQgdGhlaXIgdmFsdWVzIGFzIGFycmF5XG5cdCAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59XG5cdCAqL1xuXHRyYXcoKSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLmtleXMoKV0ucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuXHRcdFx0cmVzdWx0W2tleV0gPSB0aGlzLmdldEFsbChrZXkpO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LCB7fSk7XG5cdH1cblxuXHQvKipcblx0ICogRm9yIGJldHRlciBjb25zb2xlLmxvZyhoZWFkZXJzKSBhbmQgYWxzbyB0byBjb252ZXJ0IEhlYWRlcnMgaW50byBOb2RlLmpzIFJlcXVlc3QgY29tcGF0aWJsZSBmb3JtYXRcblx0ICovXG5cdFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSgpIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMua2V5cygpXS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldEFsbChrZXkpO1xuXHRcdFx0Ly8gSHR0cC5yZXF1ZXN0KCkgb25seSBzdXBwb3J0cyBzdHJpbmcgYXMgSG9zdCBoZWFkZXIuXG5cdFx0XHQvLyBUaGlzIGhhY2sgbWFrZXMgc3BlY2lmeWluZyBjdXN0b20gSG9zdCBoZWFkZXIgcG9zc2libGUuXG5cdFx0XHRpZiAoa2V5ID09PSAnaG9zdCcpIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSB2YWx1ZXNbMF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHRba2V5XSA9IHZhbHVlcy5sZW5ndGggPiAxID8gdmFsdWVzIDogdmFsdWVzWzBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0sIHt9KTtcblx0fVxufVxuXG4vKipcbiAqIFJlLXNoYXBpbmcgb2JqZWN0IGZvciBXZWIgSURMIHRlc3RzXG4gKiBPbmx5IG5lZWQgdG8gZG8gaXQgZm9yIG92ZXJyaWRkZW4gbWV0aG9kc1xuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhcblx0SGVhZGVycy5wcm90b3R5cGUsXG5cdFsnZ2V0JywgJ2VudHJpZXMnLCAnZm9yRWFjaCcsICd2YWx1ZXMnXS5yZWR1Y2UoKHJlc3VsdCwgcHJvcGVydHkpID0+IHtcblx0XHRyZXN1bHRbcHJvcGVydHldID0ge2VudW1lcmFibGU6IHRydWV9O1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sIHt9KVxuKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBIZWFkZXJzIG9iamVjdCBmcm9tIGFuIGh0dHAuSW5jb21pbmdNZXNzYWdlLnJhd0hlYWRlcnMsIGlnbm9yaW5nIHRob3NlIHRoYXQgZG9cbiAqIG5vdCBjb25mb3JtIHRvIEhUVFAgZ3JhbW1hciBwcm9kdWN0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KCdodHRwJykuSW5jb21pbmdNZXNzYWdlWydyYXdIZWFkZXJzJ119IGhlYWRlcnNcbiAqL1xuZnVuY3Rpb24gZnJvbVJhd0hlYWRlcnMoaGVhZGVycyA9IFtdKSB7XG5cdHJldHVybiBuZXcgSGVhZGVycyhcblx0XHRoZWFkZXJzXG5cdFx0XHQvLyBTcGxpdCBpbnRvIHBhaXJzXG5cdFx0XHQucmVkdWNlKChyZXN1bHQsIHZhbHVlLCBpbmRleCwgYXJyYXkpID0+IHtcblx0XHRcdFx0aWYgKGluZGV4ICUgMiA9PT0gMCkge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCArIDIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LCBbXSlcblx0XHRcdC5maWx0ZXIoKFtuYW1lLCB2YWx1ZV0pID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR2YWxpZGF0ZUhlYWRlck5hbWUobmFtZSk7XG5cdFx0XHRcdFx0dmFsaWRhdGVIZWFkZXJWYWx1ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXG5cdCk7XG59XG5cbmNvbnN0IHJlZGlyZWN0U3RhdHVzID0gbmV3IFNldChbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdKTtcblxuLyoqXG4gKiBSZWRpcmVjdCBjb2RlIG1hdGNoaW5nXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGUgLSBTdGF0dXMgY29kZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNSZWRpcmVjdCA9IGNvZGUgPT4ge1xuXHRyZXR1cm4gcmVkaXJlY3RTdGF0dXMuaGFzKGNvZGUpO1xufTtcblxuLyoqXG4gKiBSZXNwb25zZS5qc1xuICpcbiAqIFJlc3BvbnNlIGNsYXNzIHByb3ZpZGVzIGNvbnRlbnQgZGVjb2RpbmdcbiAqL1xuXG5jb25zdCBJTlRFUk5BTFMkMSA9IFN5bWJvbCgnUmVzcG9uc2UgaW50ZXJuYWxzJyk7XG5cbi8qKlxuICogUmVzcG9uc2UgY2xhc3NcbiAqXG4gKiBAcGFyYW0gICBTdHJlYW0gIGJvZHkgIFJlYWRhYmxlIHN0cmVhbVxuICogQHBhcmFtICAgT2JqZWN0ICBvcHRzICBSZXNwb25zZSBvcHRpb25zXG4gKiBAcmV0dXJuICBWb2lkXG4gKi9cbmNsYXNzIFJlc3BvbnNlIGV4dGVuZHMgQm9keSB7XG5cdGNvbnN0cnVjdG9yKGJvZHkgPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0XHRzdXBlcihib2R5LCBvcHRpb25zKTtcblxuXHRcdGNvbnN0IHN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzIHx8IDIwMDtcblx0XHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcblxuXHRcdGlmIChib2R5ICE9PSBudWxsICYmICFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gZXh0cmFjdENvbnRlbnRUeXBlKGJvZHkpO1xuXHRcdFx0aWYgKGNvbnRlbnRUeXBlKSB7XG5cdFx0XHRcdGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpc1tJTlRFUk5BTFMkMV0gPSB7XG5cdFx0XHR1cmw6IG9wdGlvbnMudXJsLFxuXHRcdFx0c3RhdHVzLFxuXHRcdFx0c3RhdHVzVGV4dDogb3B0aW9ucy5zdGF0dXNUZXh0IHx8ICcnLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGNvdW50ZXI6IG9wdGlvbnMuY291bnRlcixcblx0XHRcdGhpZ2hXYXRlck1hcms6IG9wdGlvbnMuaGlnaFdhdGVyTWFya1xuXHRcdH07XG5cdH1cblxuXHRnZXQgdXJsKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS51cmwgfHwgJyc7XG5cdH1cblxuXHRnZXQgc3RhdHVzKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXM7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2UgcHJvcGVydHkgcmVwcmVzZW50aW5nIGlmIHRoZSByZXF1ZXN0IGVuZGVkIG5vcm1hbGx5XG5cdCAqL1xuXHRnZXQgb2soKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cyA+PSAyMDAgJiYgdGhpc1tJTlRFUk5BTFMkMV0uc3RhdHVzIDwgMzAwO1xuXHR9XG5cblx0Z2V0IHJlZGlyZWN0ZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLmNvdW50ZXIgPiAwO1xuXHR9XG5cblx0Z2V0IHN0YXR1c1RleHQoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1c1RleHQ7XG5cdH1cblxuXHRnZXQgaGVhZGVycygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uaGVhZGVycztcblx0fVxuXG5cdGdldCBoaWdoV2F0ZXJNYXJrKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5oaWdoV2F0ZXJNYXJrO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb25lIHRoaXMgcmVzcG9uc2Vcblx0ICpcblx0ICogQHJldHVybiAgUmVzcG9uc2Vcblx0ICovXG5cdGNsb25lKCkge1xuXHRcdHJldHVybiBuZXcgUmVzcG9uc2UoY2xvbmUodGhpcywgdGhpcy5oaWdoV2F0ZXJNYXJrKSwge1xuXHRcdFx0dXJsOiB0aGlzLnVybCxcblx0XHRcdHN0YXR1czogdGhpcy5zdGF0dXMsXG5cdFx0XHRzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRvazogdGhpcy5vayxcblx0XHRcdHJlZGlyZWN0ZWQ6IHRoaXMucmVkaXJlY3RlZCxcblx0XHRcdHNpemU6IHRoaXMuc2l6ZVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgICAgVGhlIFVSTCB0aGF0IHRoZSBuZXcgcmVzcG9uc2UgaXMgdG8gb3JpZ2luYXRlIGZyb20uXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXMgQW4gb3B0aW9uYWwgc3RhdHVzIGNvZGUgZm9yIHRoZSByZXNwb25zZSAoZS5nLiwgMzAyLilcblx0ICogQHJldHVybnMge1Jlc3BvbnNlfSAgICBBIFJlc3BvbnNlIG9iamVjdC5cblx0ICovXG5cdHN0YXRpYyByZWRpcmVjdCh1cmwsIHN0YXR1cyA9IDMwMikge1xuXHRcdGlmICghaXNSZWRpcmVjdChzdGF0dXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcignRmFpbGVkIHRvIGV4ZWN1dGUgXCJyZWRpcmVjdFwiIG9uIFwicmVzcG9uc2VcIjogSW52YWxpZCBzdGF0dXMgY29kZScpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge1xuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRsb2NhdGlvbjogbmV3IFVSTCh1cmwpLnRvU3RyaW5nKClcblx0XHRcdH0sXG5cdFx0XHRzdGF0dXNcblx0XHR9KTtcblx0fVxuXG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0XHRyZXR1cm4gJ1Jlc3BvbnNlJztcblx0fVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZS5wcm90b3R5cGUsIHtcblx0dXJsOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHN0YXR1czoge2VudW1lcmFibGU6IHRydWV9LFxuXHRvazoge2VudW1lcmFibGU6IHRydWV9LFxuXHRyZWRpcmVjdGVkOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdHN0YXR1c1RleHQ6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0aGVhZGVyczoge2VudW1lcmFibGU6IHRydWV9LFxuXHRjbG9uZToge2VudW1lcmFibGU6IHRydWV9XG59KTtcblxuY29uc3QgZ2V0U2VhcmNoID0gcGFyc2VkVVJMID0+IHtcblx0aWYgKHBhcnNlZFVSTC5zZWFyY2gpIHtcblx0XHRyZXR1cm4gcGFyc2VkVVJMLnNlYXJjaDtcblx0fVxuXG5cdGNvbnN0IGxhc3RPZmZzZXQgPSBwYXJzZWRVUkwuaHJlZi5sZW5ndGggLSAxO1xuXHRjb25zdCBoYXNoID0gcGFyc2VkVVJMLmhhc2ggfHwgKHBhcnNlZFVSTC5ocmVmW2xhc3RPZmZzZXRdID09PSAnIycgPyAnIycgOiAnJyk7XG5cdHJldHVybiBwYXJzZWRVUkwuaHJlZltsYXN0T2Zmc2V0IC0gaGFzaC5sZW5ndGhdID09PSAnPycgPyAnPycgOiAnJztcbn07XG5cbmNvbnN0IElOVEVSTkFMUyQyID0gU3ltYm9sKCdSZXF1ZXN0IGludGVybmFscycpO1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGFuIGluc3RhbmNlIG9mIFJlcXVlc3QuXG4gKlxuICogQHBhcmFtICB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5jb25zdCBpc1JlcXVlc3QgPSBvYmplY3QgPT4ge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIG9iamVjdFtJTlRFUk5BTFMkMl0gPT09ICdvYmplY3QnXG5cdCk7XG59O1xuXG4vKipcbiAqIFJlcXVlc3QgY2xhc3NcbiAqXG4gKiBAcGFyYW0gICBNaXhlZCAgIGlucHV0ICBVcmwgb3IgUmVxdWVzdCBpbnN0YW5jZVxuICogQHBhcmFtICAgT2JqZWN0ICBpbml0ICAgQ3VzdG9tIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgUmVxdWVzdCBleHRlbmRzIEJvZHkge1xuXHRjb25zdHJ1Y3RvcihpbnB1dCwgaW5pdCA9IHt9KSB7XG5cdFx0bGV0IHBhcnNlZFVSTDtcblxuXHRcdC8vIE5vcm1hbGl6ZSBpbnB1dCBhbmQgZm9yY2UgVVJMIHRvIGJlIGVuY29kZWQgYXMgVVRGLTggKGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvaXNzdWVzLzI0NSlcblx0XHRpZiAoaXNSZXF1ZXN0KGlucHV0KSkge1xuXHRcdFx0cGFyc2VkVVJMID0gbmV3IFVSTChpbnB1dC51cmwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJzZWRVUkwgPSBuZXcgVVJMKGlucHV0KTtcblx0XHRcdGlucHV0ID0ge307XG5cdFx0fVxuXG5cdFx0bGV0IG1ldGhvZCA9IGluaXQubWV0aG9kIHx8IGlucHV0Lm1ldGhvZCB8fCAnR0VUJztcblx0XHRtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLCBlcWVxZXFcblx0XHRpZiAoKChpbml0LmJvZHkgIT0gbnVsbCB8fCBpc1JlcXVlc3QoaW5wdXQpKSAmJiBpbnB1dC5ib2R5ICE9PSBudWxsKSAmJlxuXHRcdFx0KG1ldGhvZCA9PT0gJ0dFVCcgfHwgbWV0aG9kID09PSAnSEVBRCcpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1ZXN0IHdpdGggR0VUL0hFQUQgbWV0aG9kIGNhbm5vdCBoYXZlIGJvZHknKTtcblx0XHR9XG5cblx0XHRjb25zdCBpbnB1dEJvZHkgPSBpbml0LmJvZHkgP1xuXHRcdFx0aW5pdC5ib2R5IDpcblx0XHRcdChpc1JlcXVlc3QoaW5wdXQpICYmIGlucHV0LmJvZHkgIT09IG51bGwgP1xuXHRcdFx0XHRjbG9uZShpbnB1dCkgOlxuXHRcdFx0XHRudWxsKTtcblxuXHRcdHN1cGVyKGlucHV0Qm9keSwge1xuXHRcdFx0c2l6ZTogaW5pdC5zaXplIHx8IGlucHV0LnNpemUgfHwgMFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyB8fCBpbnB1dC5oZWFkZXJzIHx8IHt9KTtcblxuXHRcdGlmIChpbnB1dEJvZHkgIT09IG51bGwgJiYgIWhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSkge1xuXHRcdFx0Y29uc3QgY29udGVudFR5cGUgPSBleHRyYWN0Q29udGVudFR5cGUoaW5wdXRCb2R5LCB0aGlzKTtcblx0XHRcdGlmIChjb250ZW50VHlwZSkge1xuXHRcdFx0XHRoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzaWduYWwgPSBpc1JlcXVlc3QoaW5wdXQpID9cblx0XHRcdGlucHV0LnNpZ25hbCA6XG5cdFx0XHRudWxsO1xuXHRcdGlmICgnc2lnbmFsJyBpbiBpbml0KSB7XG5cdFx0XHRzaWduYWwgPSBpbml0LnNpZ25hbDtcblx0XHR9XG5cblx0XHRpZiAoc2lnbmFsICE9PSBudWxsICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHNpZ25hbCB0byBiZSBhbiBpbnN0YW5jZW9mIEFib3J0U2lnbmFsJyk7XG5cdFx0fVxuXG5cdFx0dGhpc1tJTlRFUk5BTFMkMl0gPSB7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHRyZWRpcmVjdDogaW5pdC5yZWRpcmVjdCB8fCBpbnB1dC5yZWRpcmVjdCB8fCAnZm9sbG93Jyxcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRwYXJzZWRVUkwsXG5cdFx0XHRzaWduYWxcblx0XHR9O1xuXG5cdFx0Ly8gTm9kZS1mZXRjaC1vbmx5IG9wdGlvbnNcblx0XHR0aGlzLmZvbGxvdyA9IGluaXQuZm9sbG93ID09PSB1bmRlZmluZWQgPyAoaW5wdXQuZm9sbG93ID09PSB1bmRlZmluZWQgPyAyMCA6IGlucHV0LmZvbGxvdykgOiBpbml0LmZvbGxvdztcblx0XHR0aGlzLmNvbXByZXNzID0gaW5pdC5jb21wcmVzcyA9PT0gdW5kZWZpbmVkID8gKGlucHV0LmNvbXByZXNzID09PSB1bmRlZmluZWQgPyB0cnVlIDogaW5wdXQuY29tcHJlc3MpIDogaW5pdC5jb21wcmVzcztcblx0XHR0aGlzLmNvdW50ZXIgPSBpbml0LmNvdW50ZXIgfHwgaW5wdXQuY291bnRlciB8fCAwO1xuXHRcdHRoaXMuYWdlbnQgPSBpbml0LmFnZW50IHx8IGlucHV0LmFnZW50O1xuXHRcdHRoaXMuaGlnaFdhdGVyTWFyayA9IGluaXQuaGlnaFdhdGVyTWFyayB8fCBpbnB1dC5oaWdoV2F0ZXJNYXJrIHx8IDE2Mzg0O1xuXHRcdHRoaXMuaW5zZWN1cmVIVFRQUGFyc2VyID0gaW5pdC5pbnNlY3VyZUhUVFBQYXJzZXIgfHwgaW5wdXQuaW5zZWN1cmVIVFRQUGFyc2VyIHx8IGZhbHNlO1xuXHR9XG5cblx0Z2V0IG1ldGhvZCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMl0ubWV0aG9kO1xuXHR9XG5cblx0Z2V0IHVybCgpIHtcblx0XHRyZXR1cm4gdXJsLmZvcm1hdCh0aGlzW0lOVEVSTkFMUyQyXS5wYXJzZWRVUkwpO1xuXHR9XG5cblx0Z2V0IGhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLmhlYWRlcnM7XG5cdH1cblxuXHRnZXQgcmVkaXJlY3QoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLnJlZGlyZWN0O1xuXHR9XG5cblx0Z2V0IHNpZ25hbCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMl0uc2lnbmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb25lIHRoaXMgcmVxdWVzdFxuXHQgKlxuXHQgKiBAcmV0dXJuICBSZXF1ZXN0XG5cdCAqL1xuXHRjbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFJlcXVlc3QodGhpcyk7XG5cdH1cblxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG5cdFx0cmV0dXJuICdSZXF1ZXN0Jztcblx0fVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuXHRtZXRob2Q6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0dXJsOiB7ZW51bWVyYWJsZTogdHJ1ZX0sXG5cdGhlYWRlcnM6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0cmVkaXJlY3Q6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0Y2xvbmU6IHtlbnVtZXJhYmxlOiB0cnVlfSxcblx0c2lnbmFsOiB7ZW51bWVyYWJsZTogdHJ1ZX1cbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBSZXF1ZXN0IHRvIE5vZGUuanMgaHR0cCByZXF1ZXN0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtICAgUmVxdWVzdCAgQSBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcmV0dXJuICBPYmplY3QgICBUaGUgb3B0aW9ucyBvYmplY3QgdG8gYmUgcGFzc2VkIHRvIGh0dHAucmVxdWVzdFxuICovXG5jb25zdCBnZXROb2RlUmVxdWVzdE9wdGlvbnMgPSByZXF1ZXN0ID0+IHtcblx0Y29uc3Qge3BhcnNlZFVSTH0gPSByZXF1ZXN0W0lOVEVSTkFMUyQyXTtcblx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RbSU5URVJOQUxTJDJdLmhlYWRlcnMpO1xuXG5cdC8vIEZldGNoIHN0ZXAgMS4zXG5cdGlmICghaGVhZGVycy5oYXMoJ0FjY2VwdCcpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0FjY2VwdCcsICcqLyonKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBzdGVwcyAyLjQtMi43XG5cdGxldCBjb250ZW50TGVuZ3RoVmFsdWUgPSBudWxsO1xuXHRpZiAocmVxdWVzdC5ib2R5ID09PSBudWxsICYmIC9eKHBvc3R8cHV0KSQvaS50ZXN0KHJlcXVlc3QubWV0aG9kKSkge1xuXHRcdGNvbnRlbnRMZW5ndGhWYWx1ZSA9ICcwJztcblx0fVxuXG5cdGlmIChyZXF1ZXN0LmJvZHkgIT09IG51bGwpIHtcblx0XHRjb25zdCB0b3RhbEJ5dGVzID0gZ2V0VG90YWxCeXRlcyhyZXF1ZXN0KTtcblx0XHQvLyBTZXQgQ29udGVudC1MZW5ndGggaWYgdG90YWxCeXRlcyBpcyBhIG51bWJlciAodGhhdCBpcyBub3QgTmFOKVxuXHRcdGlmICh0eXBlb2YgdG90YWxCeXRlcyA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTih0b3RhbEJ5dGVzKSkge1xuXHRcdFx0Y29udGVudExlbmd0aFZhbHVlID0gU3RyaW5nKHRvdGFsQnl0ZXMpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChjb250ZW50TGVuZ3RoVmFsdWUpIHtcblx0XHRoZWFkZXJzLnNldCgnQ29udGVudC1MZW5ndGgnLCBjb250ZW50TGVuZ3RoVmFsdWUpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIHN0ZXAgMi4xMVxuXHRpZiAoIWhlYWRlcnMuaGFzKCdVc2VyLUFnZW50JykpIHtcblx0XHRoZWFkZXJzLnNldCgnVXNlci1BZ2VudCcsICdub2RlLWZldGNoJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggc3RlcCAyLjE1XG5cdGlmIChyZXF1ZXN0LmNvbXByZXNzICYmICFoZWFkZXJzLmhhcygnQWNjZXB0LUVuY29kaW5nJykpIHtcblx0XHRoZWFkZXJzLnNldCgnQWNjZXB0LUVuY29kaW5nJywgJ2d6aXAsZGVmbGF0ZSxicicpO1xuXHR9XG5cblx0bGV0IHthZ2VudH0gPSByZXF1ZXN0O1xuXHRpZiAodHlwZW9mIGFnZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0YWdlbnQgPSBhZ2VudChwYXJzZWRVUkwpO1xuXHR9XG5cblx0aWYgKCFoZWFkZXJzLmhhcygnQ29ubmVjdGlvbicpICYmICFhZ2VudCkge1xuXHRcdGhlYWRlcnMuc2V0KCdDb25uZWN0aW9uJywgJ2Nsb3NlJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmsgZmV0Y2ggc3RlcCA0LjJcblx0Ly8gY2h1bmtlZCBlbmNvZGluZyBpcyBoYW5kbGVkIGJ5IE5vZGUuanNcblxuXHRjb25zdCBzZWFyY2ggPSBnZXRTZWFyY2gocGFyc2VkVVJMKTtcblxuXHQvLyBNYW51YWxseSBzcHJlYWQgdGhlIFVSTCBvYmplY3QgaW5zdGVhZCBvZiBzcHJlYWQgc3ludGF4XG5cdGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuXHRcdHBhdGg6IHBhcnNlZFVSTC5wYXRobmFtZSArIHNlYXJjaCxcblx0XHRwYXRobmFtZTogcGFyc2VkVVJMLnBhdGhuYW1lLFxuXHRcdGhvc3RuYW1lOiBwYXJzZWRVUkwuaG9zdG5hbWUsXG5cdFx0cHJvdG9jb2w6IHBhcnNlZFVSTC5wcm90b2NvbCxcblx0XHRwb3J0OiBwYXJzZWRVUkwucG9ydCxcblx0XHRoYXNoOiBwYXJzZWRVUkwuaGFzaCxcblx0XHRzZWFyY2g6IHBhcnNlZFVSTC5zZWFyY2gsXG5cdFx0cXVlcnk6IHBhcnNlZFVSTC5xdWVyeSxcblx0XHRocmVmOiBwYXJzZWRVUkwuaHJlZixcblx0XHRtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuXHRcdGhlYWRlcnM6IGhlYWRlcnNbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0oKSxcblx0XHRpbnNlY3VyZUhUVFBQYXJzZXI6IHJlcXVlc3QuaW5zZWN1cmVIVFRQUGFyc2VyLFxuXHRcdGFnZW50XG5cdH07XG5cblx0cmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufTtcblxuLyoqXG4gKiBBYm9ydEVycm9yIGludGVyZmFjZSBmb3IgY2FuY2VsbGVkIHJlcXVlc3RzXG4gKi9cbmNsYXNzIEFib3J0RXJyb3IgZXh0ZW5kcyBGZXRjaEJhc2VFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHR5cGUgPSAnYWJvcnRlZCcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCB0eXBlKTtcblx0fVxufVxuXG4vKipcbiAqIEluZGV4LmpzXG4gKlxuICogYSByZXF1ZXN0IEFQSSBjb21wYXRpYmxlIHdpdGggd2luZG93LmZldGNoXG4gKlxuICogQWxsIHNwZWMgYWxnb3JpdGhtIHN0ZXAgbnVtYmVycyBhcmUgYmFzZWQgb24gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvY29tbWl0LXNuYXBzaG90cy9hZTcxNjgyMmNiM2E2MTg0MzIyNmNkMDkwZWVmYzY1ODk0NDZjMWQyLy5cbiAqL1xuXG5jb25zdCBzdXBwb3J0ZWRTY2hlbWFzID0gbmV3IFNldChbJ2RhdGE6JywgJ2h0dHA6JywgJ2h0dHBzOiddKTtcblxuLyoqXG4gKiBGZXRjaCBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSAgIHtzdHJpbmcgfCBVUkwgfCBpbXBvcnQoJy4vcmVxdWVzdCcpLmRlZmF1bHR9IHVybCAtIEFic29sdXRlIHVybCBvciBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcGFyYW0gICB7Kn0gW29wdGlvbnNfXSAtIEZldGNoIG9wdGlvbnNcbiAqIEByZXR1cm4gIHtQcm9taXNlPGltcG9ydCgnLi9yZXNwb25zZScpLmRlZmF1bHQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaCh1cmwsIG9wdGlvbnNfKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Ly8gQnVpbGQgcmVxdWVzdCBvYmplY3Rcblx0XHRjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCBvcHRpb25zXyk7XG5cdFx0Y29uc3Qgb3B0aW9ucyA9IGdldE5vZGVSZXF1ZXN0T3B0aW9ucyhyZXF1ZXN0KTtcblx0XHRpZiAoIXN1cHBvcnRlZFNjaGVtYXMuaGFzKG9wdGlvbnMucHJvdG9jb2wpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBub2RlLWZldGNoIGNhbm5vdCBsb2FkICR7dXJsfS4gVVJMIHNjaGVtZSBcIiR7b3B0aW9ucy5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKX1cIiBpcyBub3Qgc3VwcG9ydGVkLmApO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnByb3RvY29sID09PSAnZGF0YTonKSB7XG5cdFx0XHRjb25zdCBkYXRhID0gZGF0YVVyaVRvQnVmZmVyKHJlcXVlc3QudXJsKTtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGRhdGEsIHtoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6IGRhdGEudHlwZUZ1bGx9fSk7XG5cdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBXcmFwIGh0dHAucmVxdWVzdCBpbnRvIGZldGNoXG5cdFx0Y29uc3Qgc2VuZCA9IChvcHRpb25zLnByb3RvY29sID09PSAnaHR0cHM6JyA/IGh0dHBzIDogaHR0cCkucmVxdWVzdDtcblx0XHRjb25zdCB7c2lnbmFsfSA9IHJlcXVlc3Q7XG5cdFx0bGV0IHJlc3BvbnNlID0gbnVsbDtcblxuXHRcdGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBuZXcgQWJvcnRFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nKTtcblx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRpZiAocmVxdWVzdC5ib2R5ICYmIHJlcXVlc3QuYm9keSBpbnN0YW5jZW9mIFN0cmVhbS5SZWFkYWJsZSkge1xuXHRcdFx0XHRyZXF1ZXN0LmJvZHkuZGVzdHJveShlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLmJvZHkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZS5ib2R5LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuXHRcdH07XG5cblx0XHRpZiAoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSB7XG5cdFx0XHRhYm9ydCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFib3J0QW5kRmluYWxpemUgPSAoKSA9PiB7XG5cdFx0XHRhYm9ydCgpO1xuXHRcdFx0ZmluYWxpemUoKTtcblx0XHR9O1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0XG5cdFx0Y29uc3QgcmVxdWVzdF8gPSBzZW5kKG9wdGlvbnMpO1xuXG5cdFx0aWYgKHNpZ25hbCkge1xuXHRcdFx0c2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmluYWxpemUgPSAoKSA9PiB7XG5cdFx0XHRyZXF1ZXN0Xy5hYm9ydCgpO1xuXHRcdFx0aWYgKHNpZ25hbCkge1xuXHRcdFx0XHRzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFuZEZpbmFsaXplKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmVxdWVzdF8ub24oJ2Vycm9yJywgZXJyID0+IHtcblx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgcmVxdWVzdCB0byAke3JlcXVlc3QudXJsfSBmYWlsZWQsIHJlYXNvbjogJHtlcnIubWVzc2FnZX1gLCAnc3lzdGVtJywgZXJyKSk7XG5cdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdH0pO1xuXG5cdFx0cmVxdWVzdF8ub24oJ3Jlc3BvbnNlJywgcmVzcG9uc2VfID0+IHtcblx0XHRcdHJlcXVlc3RfLnNldFRpbWVvdXQoMCk7XG5cdFx0XHRjb25zdCBoZWFkZXJzID0gZnJvbVJhd0hlYWRlcnMocmVzcG9uc2VfLnJhd0hlYWRlcnMpO1xuXG5cdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNVxuXHRcdFx0aWYgKGlzUmVkaXJlY3QocmVzcG9uc2VfLnN0YXR1c0NvZGUpKSB7XG5cdFx0XHRcdC8vIEhUVFAgZmV0Y2ggc3RlcCA1LjJcblx0XHRcdFx0Y29uc3QgbG9jYXRpb24gPSBoZWFkZXJzLmdldCgnTG9jYXRpb24nKTtcblxuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS4zXG5cdFx0XHRcdGNvbnN0IGxvY2F0aW9uVVJMID0gbG9jYXRpb24gPT09IG51bGwgPyBudWxsIDogbmV3IFVSTChsb2NhdGlvbiwgcmVxdWVzdC51cmwpO1xuXG5cdFx0XHRcdC8vIEhUVFAgZmV0Y2ggc3RlcCA1LjVcblx0XHRcdFx0c3dpdGNoIChyZXF1ZXN0LnJlZGlyZWN0KSB7XG5cdFx0XHRcdFx0Y2FzZSAnZXJyb3InOlxuXHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGB1cmkgcmVxdWVzdGVkIHJlc3BvbmRzIHdpdGggYSByZWRpcmVjdCwgcmVkaXJlY3QgbW9kZSBpcyBzZXQgdG8gZXJyb3I6ICR7cmVxdWVzdC51cmx9YCwgJ25vLXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRjYXNlICdtYW51YWwnOlxuXHRcdFx0XHRcdFx0Ly8gTm9kZS1mZXRjaC1zcGVjaWZpYyBzdGVwOiBtYWtlIG1hbnVhbCByZWRpcmVjdCBhIGJpdCBlYXNpZXIgdG8gdXNlIGJ5IHNldHRpbmcgdGhlIExvY2F0aW9uIGhlYWRlciB2YWx1ZSB0byB0aGUgcmVzb2x2ZWQgVVJMLlxuXHRcdFx0XHRcdFx0aWYgKGxvY2F0aW9uVVJMICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBjb3JydXB0ZWQgaGVhZGVyXG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVycy5zZXQoJ0xvY2F0aW9uJywgbG9jYXRpb25VUkwpO1xuXHRcdFx0XHRcdFx0XHRcdC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZvbGxvdyc6IHtcblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCAyXG5cdFx0XHRcdFx0XHRpZiAobG9jYXRpb25VUkwgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA1XG5cdFx0XHRcdFx0XHRpZiAocmVxdWVzdC5jb3VudGVyID49IHJlcXVlc3QuZm9sbG93KSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgbWF4aW11bSByZWRpcmVjdCByZWFjaGVkIGF0OiAke3JlcXVlc3QudXJsfWAsICdtYXgtcmVkaXJlY3QnKSk7XG5cdFx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSFRUUC1yZWRpcmVjdCBmZXRjaCBzdGVwIDYgKGNvdW50ZXIgaW5jcmVtZW50KVxuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IFJlcXVlc3Qgb2JqZWN0LlxuXHRcdFx0XHRcdFx0Y29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRcdGhlYWRlcnM6IG5ldyBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyksXG5cdFx0XHRcdFx0XHRcdGZvbGxvdzogcmVxdWVzdC5mb2xsb3csXG5cdFx0XHRcdFx0XHRcdGNvdW50ZXI6IHJlcXVlc3QuY291bnRlciArIDEsXG5cdFx0XHRcdFx0XHRcdGFnZW50OiByZXF1ZXN0LmFnZW50LFxuXHRcdFx0XHRcdFx0XHRjb21wcmVzczogcmVxdWVzdC5jb21wcmVzcyxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcblx0XHRcdFx0XHRcdFx0Ym9keTogcmVxdWVzdC5ib2R5LFxuXHRcdFx0XHRcdFx0XHRzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuXHRcdFx0XHRcdFx0XHRzaXplOiByZXF1ZXN0LnNpemVcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA5XG5cdFx0XHRcdFx0XHRpZiAocmVzcG9uc2VfLnN0YXR1c0NvZGUgIT09IDMwMyAmJiByZXF1ZXN0LmJvZHkgJiYgb3B0aW9uc18uYm9keSBpbnN0YW5jZW9mIFN0cmVhbS5SZWFkYWJsZSkge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoJ0Nhbm5vdCBmb2xsb3cgcmVkaXJlY3Qgd2l0aCBib2R5IGJlaW5nIGEgcmVhZGFibGUgc3RyZWFtJywgJ3Vuc3VwcG9ydGVkLXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCAxMVxuXHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlXy5zdGF0dXNDb2RlID09PSAzMDMgfHwgKChyZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlc3BvbnNlXy5zdGF0dXNDb2RlID09PSAzMDIpICYmIHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpKSB7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RPcHRpb25zLm1ldGhvZCA9ICdHRVQnO1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0aW9ucy5ib2R5ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnY29udGVudC1sZW5ndGgnKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSFRUUC1yZWRpcmVjdCBmZXRjaCBzdGVwIDE1XG5cdFx0XHRcdFx0XHRyZXNvbHZlKGZldGNoKG5ldyBSZXF1ZXN0KGxvY2F0aW9uVVJMLCByZXF1ZXN0T3B0aW9ucykpKTtcblx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBQcmVwYXJlIHJlc3BvbnNlXG5cdFx0XHRyZXNwb25zZV8ub25jZSgnZW5kJywgKCkgPT4ge1xuXHRcdFx0XHRpZiAoc2lnbmFsKSB7XG5cdFx0XHRcdFx0c2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgYm9keSA9IFN0cmVhbS5waXBlbGluZShyZXNwb25zZV8sIG5ldyBTdHJlYW0uUGFzc1Rocm91Z2goKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0XHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMjkzNzZcblx0XHRcdGlmIChwcm9jZXNzLnZlcnNpb24gPCAndjEyLjEwJykge1xuXHRcdFx0XHRyZXNwb25zZV8ub24oJ2Fib3J0ZWQnLCBhYm9ydEFuZEZpbmFsaXplKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzcG9uc2VPcHRpb25zID0ge1xuXHRcdFx0XHR1cmw6IHJlcXVlc3QudXJsLFxuXHRcdFx0XHRzdGF0dXM6IHJlc3BvbnNlXy5zdGF0dXNDb2RlLFxuXHRcdFx0XHRzdGF0dXNUZXh0OiByZXNwb25zZV8uc3RhdHVzTWVzc2FnZSxcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0c2l6ZTogcmVxdWVzdC5zaXplLFxuXHRcdFx0XHRjb3VudGVyOiByZXF1ZXN0LmNvdW50ZXIsXG5cdFx0XHRcdGhpZ2hXYXRlck1hcms6IHJlcXVlc3QuaGlnaFdhdGVyTWFya1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgMTIuMS4xLjNcblx0XHRcdGNvbnN0IGNvZGluZ3MgPSBoZWFkZXJzLmdldCgnQ29udGVudC1FbmNvZGluZycpO1xuXG5cdFx0XHQvLyBIVFRQLW5ldHdvcmsgZmV0Y2ggc3RlcCAxMi4xLjEuNDogaGFuZGxlIGNvbnRlbnQgY29kaW5nc1xuXG5cdFx0XHQvLyBpbiBmb2xsb3dpbmcgc2NlbmFyaW9zIHdlIGlnbm9yZSBjb21wcmVzc2lvbiBzdXBwb3J0XG5cdFx0XHQvLyAxLiBjb21wcmVzc2lvbiBzdXBwb3J0IGlzIGRpc2FibGVkXG5cdFx0XHQvLyAyLiBIRUFEIHJlcXVlc3Rcblx0XHRcdC8vIDMuIG5vIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyXG5cdFx0XHQvLyA0LiBubyBjb250ZW50IHJlc3BvbnNlICgyMDQpXG5cdFx0XHQvLyA1LiBjb250ZW50IG5vdCBtb2RpZmllZCByZXNwb25zZSAoMzA0KVxuXHRcdFx0aWYgKCFyZXF1ZXN0LmNvbXByZXNzIHx8IHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgfHwgY29kaW5ncyA9PT0gbnVsbCB8fCByZXNwb25zZV8uc3RhdHVzQ29kZSA9PT0gMjA0IHx8IHJlc3BvbnNlXy5zdGF0dXNDb2RlID09PSAzMDQpIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VPcHRpb25zKTtcblx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIE5vZGUgdjYrXG5cdFx0XHQvLyBCZSBsZXNzIHN0cmljdCB3aGVuIGRlY29kaW5nIGNvbXByZXNzZWQgcmVzcG9uc2VzLCBzaW5jZSBzb21ldGltZXNcblx0XHRcdC8vIHNlcnZlcnMgc2VuZCBzbGlnaHRseSBpbnZhbGlkIHJlc3BvbnNlcyB0aGF0IGFyZSBzdGlsbCBhY2NlcHRlZFxuXHRcdFx0Ly8gYnkgY29tbW9uIGJyb3dzZXJzLlxuXHRcdFx0Ly8gQWx3YXlzIHVzaW5nIFpfU1lOQ19GTFVTSCBpcyB3aGF0IGNVUkwgZG9lcy5cblx0XHRcdGNvbnN0IHpsaWJPcHRpb25zID0ge1xuXHRcdFx0XHRmbHVzaDogemxpYi5aX1NZTkNfRkxVU0gsXG5cdFx0XHRcdGZpbmlzaEZsdXNoOiB6bGliLlpfU1lOQ19GTFVTSFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gRm9yIGd6aXBcblx0XHRcdGlmIChjb2RpbmdzID09PSAnZ3ppcCcgfHwgY29kaW5ncyA9PT0gJ3gtZ3ppcCcpIHtcblx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUd1bnppcCh6bGliT3B0aW9ucyksIGVycm9yID0+IHtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VPcHRpb25zKTtcblx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIGRlZmxhdGVcblx0XHRcdGlmIChjb2RpbmdzID09PSAnZGVmbGF0ZScgfHwgY29kaW5ncyA9PT0gJ3gtZGVmbGF0ZScpIHtcblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBpbmZhbW91cyByYXcgZGVmbGF0ZSByZXNwb25zZSBmcm9tIG9sZCBzZXJ2ZXJzXG5cdFx0XHRcdC8vIGEgaGFjayBmb3Igb2xkIElJUyBhbmQgQXBhY2hlIHNlcnZlcnNcblx0XHRcdFx0Y29uc3QgcmF3ID0gU3RyZWFtLnBpcGVsaW5lKHJlc3BvbnNlXywgbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCgpLCBlcnJvciA9PiB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJhdy5vbmNlKCdkYXRhJywgY2h1bmsgPT4ge1xuXHRcdFx0XHRcdC8vIFNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3NTE5ODI4XG5cdFx0XHRcdFx0aWYgKChjaHVua1swXSAmIDB4MEYpID09PSAweDA4KSB7XG5cdFx0XHRcdFx0XHRib2R5ID0gU3RyZWFtLnBpcGVsaW5lKGJvZHksIHpsaWIuY3JlYXRlSW5mbGF0ZSgpLCBlcnJvciA9PiB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ym9keSA9IFN0cmVhbS5waXBlbGluZShib2R5LCB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKSwgZXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VPcHRpb25zKTtcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIGJyXG5cdFx0XHRpZiAoY29kaW5ncyA9PT0gJ2JyJykge1xuXHRcdFx0XHRib2R5ID0gU3RyZWFtLnBpcGVsaW5lKGJvZHksIHpsaWIuY3JlYXRlQnJvdGxpRGVjb21wcmVzcygpLCBlcnJvciA9PiB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlT3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSwgdXNlIHJlc3BvbnNlIGFzLWlzXG5cdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZU9wdGlvbnMpO1xuXHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0fSk7XG5cblx0XHR3cml0ZVRvU3RyZWFtKHJlcXVlc3RfLCByZXF1ZXN0KTtcblx0fSk7XG59XG5cbmV4cG9ydHMuQWJvcnRFcnJvciA9IEFib3J0RXJyb3I7XG5leHBvcnRzLkZldGNoRXJyb3IgPSBGZXRjaEVycm9yO1xuZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycztcbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5leHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5leHBvcnRzLmRlZmF1bHQgPSBmZXRjaDtcbmV4cG9ydHMuaXNSZWRpcmVjdCA9IGlzUmVkaXJlY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5janMubWFwXG4iLCIvKipcbiAqIHdlYi1zdHJlYW1zLXBvbHlmaWxsIHYzLjIuMFxuICovXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTUuc3ltYm9sXCIgLz5cbmNvbnN0IFN5bWJvbFBvbHlmaWxsID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/XG4gICAgU3ltYm9sIDpcbiAgICBkZXNjcmlwdGlvbiA9PiBgU3ltYm9sKCR7ZGVzY3JpcHRpb259KWA7XG5cbi8vLyA8cmVmZXJlbmNlIGxpYj1cImRvbVwiIC8+XG5mdW5jdGlvbiBub29wKCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBnZXRHbG9iYWxzKCkge1xuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5jb25zdCBnbG9iYWxzID0gZ2V0R2xvYmFscygpO1xuXG5mdW5jdGlvbiB0eXBlSXNPYmplY3QoeCkge1xuICAgIHJldHVybiAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpIHx8IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuY29uc3QgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uID0gbm9vcDtcblxuY29uc3Qgb3JpZ2luYWxQcm9taXNlID0gUHJvbWlzZTtcbmNvbnN0IG9yaWdpbmFsUHJvbWlzZVRoZW4gPSBQcm9taXNlLnByb3RvdHlwZS50aGVuO1xuY29uc3Qgb3JpZ2luYWxQcm9taXNlUmVzb2x2ZSA9IFByb21pc2UucmVzb2x2ZS5iaW5kKG9yaWdpbmFsUHJvbWlzZSk7XG5jb25zdCBvcmlnaW5hbFByb21pc2VSZWplY3QgPSBQcm9taXNlLnJlamVjdC5iaW5kKG9yaWdpbmFsUHJvbWlzZSk7XG5mdW5jdGlvbiBuZXdQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgcmV0dXJuIG5ldyBvcmlnaW5hbFByb21pc2UoZXhlY3V0b3IpO1xufVxuZnVuY3Rpb24gcHJvbWlzZVJlc29sdmVkV2l0aCh2YWx1ZSkge1xuICAgIHJldHVybiBvcmlnaW5hbFByb21pc2VSZXNvbHZlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHByb21pc2VSZWplY3RlZFdpdGgocmVhc29uKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsUHJvbWlzZVJlamVjdChyZWFzb24pO1xufVxuZnVuY3Rpb24gUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgLy8gVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHdheSB0byBjb3JyZWN0bHkgZW11bGF0ZSB0aGUgYmVoYXZpb3VyIGZyb20gSmF2YVNjcmlwdCwgc28gdGhpcyBpcyBqdXN0IGFuXG4gICAgLy8gYXBwcm94aW1hdGlvbi5cbiAgICByZXR1cm4gb3JpZ2luYWxQcm9taXNlVGhlbi5jYWxsKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbn1cbmZ1bmN0aW9uIHVwb25Qcm9taXNlKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgUGVyZm9ybVByb21pc2VUaGVuKFBlcmZvcm1Qcm9taXNlVGhlbihwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCksIHVuZGVmaW5lZCwgcmV0aHJvd0Fzc2VydGlvbkVycm9yUmVqZWN0aW9uKTtcbn1cbmZ1bmN0aW9uIHVwb25GdWxmaWxsbWVudChwcm9taXNlLCBvbkZ1bGZpbGxlZCkge1xuICAgIHVwb25Qcm9taXNlKHByb21pc2UsIG9uRnVsZmlsbGVkKTtcbn1cbmZ1bmN0aW9uIHVwb25SZWplY3Rpb24ocHJvbWlzZSwgb25SZWplY3RlZCkge1xuICAgIHVwb25Qcm9taXNlKHByb21pc2UsIHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm1Qcm9taXNlV2l0aChwcm9taXNlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHByb21pc2UsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG59XG5mdW5jdGlvbiBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHByb21pc2UpIHtcbiAgICBQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgdW5kZWZpbmVkLCByZXRocm93QXNzZXJ0aW9uRXJyb3JSZWplY3Rpb24pO1xufVxuY29uc3QgcXVldWVNaWNyb3Rhc2sgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGdsb2JhbFF1ZXVlTWljcm90YXNrID0gZ2xvYmFscyAmJiBnbG9iYWxzLnF1ZXVlTWljcm90YXNrO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsUXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbFF1ZXVlTWljcm90YXNrO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZFByb21pc2UgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIChmbikgPT4gUGVyZm9ybVByb21pc2VUaGVuKHJlc29sdmVkUHJvbWlzZSwgZm4pO1xufSkoKTtcbmZ1bmN0aW9uIHJlZmxlY3RDYWxsKEYsIFYsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIEYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKEYsIFYsIGFyZ3MpO1xufVxuZnVuY3Rpb24gcHJvbWlzZUNhbGwoRiwgViwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHJlZmxlY3RDYWxsKEYsIFYsIGFyZ3MpKTtcbiAgICB9XG4gICAgY2F0Y2ggKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHZhbHVlKTtcbiAgICB9XG59XG5cbi8vIE9yaWdpbmFsIGZyb20gQ2hyb21pdW1cbi8vIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy8wYWVlNDQzNGE0ZGJhNDJhNDJhYmFlYTliZmJjMGNkMTk2YTYzYmMxL3RoaXJkX3BhcnR5L2JsaW5rL3JlbmRlcmVyL2NvcmUvc3RyZWFtcy9TaW1wbGVRdWV1ZS5qc1xuY29uc3QgUVVFVUVfTUFYX0FSUkFZX1NJWkUgPSAxNjM4NDtcbi8qKlxuICogU2ltcGxlIHF1ZXVlIHN0cnVjdHVyZS5cbiAqXG4gKiBBdm9pZHMgc2NhbGFiaWxpdHkgaXNzdWVzIHdpdGggdXNpbmcgYSBwYWNrZWQgYXJyYXkgZGlyZWN0bHkgYnkgdXNpbmdcbiAqIG11bHRpcGxlIGFycmF5cyBpbiBhIGxpbmtlZCBsaXN0IGFuZCBrZWVwaW5nIHRoZSBhcnJheSBzaXplIGJvdW5kZWQuXG4gKi9cbmNsYXNzIFNpbXBsZVF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fY3Vyc29yID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIC8vIF9mcm9udCBhbmQgX2JhY2sgYXJlIGFsd2F5cyBkZWZpbmVkLlxuICAgICAgICB0aGlzLl9mcm9udCA9IHtcbiAgICAgICAgICAgIF9lbGVtZW50czogW10sXG4gICAgICAgICAgICBfbmV4dDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JhY2sgPSB0aGlzLl9mcm9udDtcbiAgICAgICAgLy8gVGhlIGN1cnNvciBpcyB1c2VkIHRvIGF2b2lkIGNhbGxpbmcgQXJyYXkuc2hpZnQoKS5cbiAgICAgICAgLy8gSXQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBmcm9udCBlbGVtZW50IG9mIHRoZSBhcnJheSBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGZyb250LW1vc3Qgbm9kZS4gSXQgaXMgYWx3YXlzIGluIHRoZSByYW5nZSBbMCwgUVVFVUVfTUFYX0FSUkFZX1NJWkUpLlxuICAgICAgICB0aGlzLl9jdXJzb3IgPSAwO1xuICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUsIHNpemUgPT09IGVsZW1lbnRzLmxlbmd0aCAtIGN1cnNvci5cbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICAvLyBGb3IgZXhjZXB0aW9uIHNhZmV0eSwgdGhpcyBtZXRob2QgaXMgc3RydWN0dXJlZCBpbiBvcmRlcjpcbiAgICAvLyAxLiBSZWFkIHN0YXRlXG4gICAgLy8gMi4gQ2FsY3VsYXRlIHJlcXVpcmVkIHN0YXRlIG11dGF0aW9uc1xuICAgIC8vIDMuIFBlcmZvcm0gc3RhdGUgbXV0YXRpb25zXG4gICAgcHVzaChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IG9sZEJhY2sgPSB0aGlzLl9iYWNrO1xuICAgICAgICBsZXQgbmV3QmFjayA9IG9sZEJhY2s7XG4gICAgICAgIGlmIChvbGRCYWNrLl9lbGVtZW50cy5sZW5ndGggPT09IFFVRVVFX01BWF9BUlJBWV9TSVpFIC0gMSkge1xuICAgICAgICAgICAgbmV3QmFjayA9IHtcbiAgICAgICAgICAgICAgICBfZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgICAgIF9uZXh0OiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHVzaCgpIGlzIHRoZSBtdXRhdGlvbiBtb3N0IGxpa2VseSB0byB0aHJvdyBhbiBleGNlcHRpb24sIHNvIGl0XG4gICAgICAgIC8vIGdvZXMgZmlyc3QuXG4gICAgICAgIG9sZEJhY2suX2VsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChuZXdCYWNrICE9PSBvbGRCYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9iYWNrID0gbmV3QmFjaztcbiAgICAgICAgICAgIG9sZEJhY2suX25leHQgPSBuZXdCYWNrO1xuICAgICAgICB9XG4gICAgICAgICsrdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgLy8gTGlrZSBwdXNoKCksIHNoaWZ0KCkgZm9sbG93cyB0aGUgcmVhZCAtPiBjYWxjdWxhdGUgLT4gbXV0YXRlIHBhdHRlcm4gZm9yXG4gICAgLy8gZXhjZXB0aW9uIHNhZmV0eS5cbiAgICBzaGlmdCgpIHsgLy8gbXVzdCBub3QgYmUgY2FsbGVkIG9uIGFuIGVtcHR5IHF1ZXVlXG4gICAgICAgIGNvbnN0IG9sZEZyb250ID0gdGhpcy5fZnJvbnQ7XG4gICAgICAgIGxldCBuZXdGcm9udCA9IG9sZEZyb250O1xuICAgICAgICBjb25zdCBvbGRDdXJzb3IgPSB0aGlzLl9jdXJzb3I7XG4gICAgICAgIGxldCBuZXdDdXJzb3IgPSBvbGRDdXJzb3IgKyAxO1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG9sZEZyb250Ll9lbGVtZW50cztcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW29sZEN1cnNvcl07XG4gICAgICAgIGlmIChuZXdDdXJzb3IgPT09IFFVRVVFX01BWF9BUlJBWV9TSVpFKSB7XG4gICAgICAgICAgICBuZXdGcm9udCA9IG9sZEZyb250Ll9uZXh0O1xuICAgICAgICAgICAgbmV3Q3Vyc29yID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBtdXRhdGlvbnMgYmVmb3JlIHRoaXMgcG9pbnQuXG4gICAgICAgIC0tdGhpcy5fc2l6ZTtcbiAgICAgICAgdGhpcy5fY3Vyc29yID0gbmV3Q3Vyc29yO1xuICAgICAgICBpZiAob2xkRnJvbnQgIT09IG5ld0Zyb250KSB7XG4gICAgICAgICAgICB0aGlzLl9mcm9udCA9IG5ld0Zyb250O1xuICAgICAgICB9XG4gICAgICAgIC8vIFBlcm1pdCBzaGlmdGVkIGVsZW1lbnQgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgIGVsZW1lbnRzW29sZEN1cnNvcl0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICAvLyBUaGUgdHJpY2t5IHRoaW5nIGFib3V0IGZvckVhY2goKSBpcyB0aGF0IGl0IGNhbiBiZSBjYWxsZWRcbiAgICAvLyByZS1lbnRyYW50bHkuIFRoZSBxdWV1ZSBtYXkgYmUgbXV0YXRlZCBpbnNpZGUgdGhlIGNhbGxiYWNrLiBJdCBpcyBlYXN5IHRvXG4gICAgLy8gc2VlIHRoYXQgcHVzaCgpIHdpdGhpbiB0aGUgY2FsbGJhY2sgaGFzIG5vIG5lZ2F0aXZlIGVmZmVjdHMgc2luY2UgdGhlIGVuZFxuICAgIC8vIG9mIHRoZSBxdWV1ZSBpcyBjaGVja2VkIGZvciBvbiBldmVyeSBpdGVyYXRpb24uIElmIHNoaWZ0KCkgaXMgY2FsbGVkXG4gICAgLy8gcmVwZWF0ZWRseSB3aXRoaW4gdGhlIGNhbGxiYWNrIHRoZW4gdGhlIG5leHQgaXRlcmF0aW9uIG1heSByZXR1cm4gYW5cbiAgICAvLyBlbGVtZW50IHRoYXQgaGFzIGJlZW4gcmVtb3ZlZC4gSW4gdGhpcyBjYXNlIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZFxuICAgIC8vIHdpdGggdW5kZWZpbmVkIHZhbHVlcyB1bnRpbCB3ZSBlaXRoZXIgXCJjYXRjaCB1cFwiIHdpdGggZWxlbWVudHMgdGhhdCBzdGlsbFxuICAgIC8vIGV4aXN0IG9yIHJlYWNoIHRoZSBiYWNrIG9mIHRoZSBxdWV1ZS5cbiAgICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX2Zyb250O1xuICAgICAgICBsZXQgZWxlbWVudHMgPSBub2RlLl9lbGVtZW50cztcbiAgICAgICAgd2hpbGUgKGkgIT09IGVsZW1lbnRzLmxlbmd0aCB8fCBub2RlLl9uZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChpID09PSBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5fbmV4dDtcbiAgICAgICAgICAgICAgICBlbGVtZW50cyA9IG5vZGUuX2VsZW1lbnRzO1xuICAgICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2soZWxlbWVudHNbaV0pO1xuICAgICAgICAgICAgKytpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGlmIHNoaWZ0KCkgd2FzIGNhbGxlZCBub3csXG4gICAgLy8gd2l0aG91dCBtb2RpZnlpbmcgdGhlIHF1ZXVlLlxuICAgIHBlZWsoKSB7IC8vIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhbiBlbXB0eSBxdWV1ZVxuICAgICAgICBjb25zdCBmcm9udCA9IHRoaXMuX2Zyb250O1xuICAgICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLl9jdXJzb3I7XG4gICAgICAgIHJldHVybiBmcm9udC5fZWxlbWVudHNbY3Vyc29yXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUocmVhZGVyLCBzdHJlYW0pIHtcbiAgICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgc3RyZWFtLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQocmVhZGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQocmVhZGVyLCBzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG59XG4vLyBBIGNsaWVudCBvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgYW5kIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGVcbi8vIGNoZWNrLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHJlYWRlciwgcmVhc29uKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gcmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtO1xuICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIHJlYXNvbik7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcikge1xuICAgIGlmIChyZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0uX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgbmV3IFR5cGVFcnJvcihgUmVhZGVyIHdhcyByZWxlYXNlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbSdzIGNsb3NlZG5lc3NgKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZChyZWFkZXIsIG5ldyBUeXBlRXJyb3IoYFJlYWRlciB3YXMgcmVsZWFzZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBtb25pdG9yIHRoZSBzdHJlYW0ncyBjbG9zZWRuZXNzYCkpO1xuICAgIH1cbiAgICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0uX3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPSB1bmRlZmluZWQ7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgcmVhZGVycy5cbmZ1bmN0aW9uIHJlYWRlckxvY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdDYW5ub3QgJyArIG5hbWUgKyAnIGEgc3RyZWFtIHVzaW5nIGEgcmVsZWFzZWQgcmVhZGVyJyk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLlxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcikge1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHJlYWRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHJlYWRlcik7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZXNvbHZlZChyZWFkZXIpIHtcbiAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUocmVhZGVyKTtcbiAgICBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVqZWN0KHJlYWRlciwgcmVhc29uKSB7XG4gICAgaWYgKHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFByb21pc2VJc0hhbmRsZWRUb1RydWUocmVhZGVyLl9jbG9zZWRQcm9taXNlKTtcbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0KHJlYXNvbik7XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgcmVhZGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzZXRUb1JlamVjdGVkKHJlYWRlciwgcmVhc29uKSB7XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZChyZWFkZXIsIHJlYXNvbik7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUocmVhZGVyKSB7XG4gICAgaWYgKHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWFkZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHJlYWRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IEFib3J0U3RlcHMgPSBTeW1ib2xQb2x5ZmlsbCgnW1tBYm9ydFN0ZXBzXV0nKTtcbmNvbnN0IEVycm9yU3RlcHMgPSBTeW1ib2xQb2x5ZmlsbCgnW1tFcnJvclN0ZXBzXV0nKTtcbmNvbnN0IENhbmNlbFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbQ2FuY2VsU3RlcHNdXScpO1xuY29uc3QgUHVsbFN0ZXBzID0gU3ltYm9sUG9seWZpbGwoJ1tbUHVsbFN0ZXBzXV0nKTtcblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZXMyMDE1LmNvcmVcIiAvPlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzRmluaXRlI1BvbHlmaWxsXG5jb25zdCBOdW1iZXJJc0Zpbml0ZSA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoeCk7XG59O1xuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTUuY29yZVwiIC8+XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3RydW5jI1BvbHlmaWxsXG5jb25zdCBNYXRoVHJ1bmMgPSBNYXRoLnRydW5jIHx8IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHYgPCAwID8gTWF0aC5jZWlsKHYpIDogTWF0aC5mbG9vcih2KTtcbn07XG5cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC1kaWN0aW9uYXJpZXNcbmZ1bmN0aW9uIGlzRGljdGlvbmFyeSh4KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFzc2VydERpY3Rpb25hcnkob2JqLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiAhPT0gdW5kZWZpbmVkICYmICFpc0RpY3Rpb25hcnkob2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhbiBvYmplY3QuYCk7XG4gICAgfVxufVxuLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jaWRsLWNhbGxiYWNrLWZ1bmN0aW9uc1xuZnVuY3Rpb24gYXNzZXJ0RnVuY3Rpb24oeCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgeCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC1vYmplY3RcbmZ1bmN0aW9uIGlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFzc2VydE9iamVjdCh4LCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc09iamVjdCh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhbiBvYmplY3QuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVxdWlyZWRBcmd1bWVudCh4LCBwb3NpdGlvbiwgY29udGV4dCkge1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUGFyYW1ldGVyICR7cG9zaXRpb259IGlzIHJlcXVpcmVkIGluICcke2NvbnRleHR9Jy5gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnRSZXF1aXJlZEZpZWxkKHgsIGZpZWxkLCBjb250ZXh0KSB7XG4gICAgaWYgKHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2ZpZWxkfSBpcyByZXF1aXJlZCBpbiAnJHtjb250ZXh0fScuYCk7XG4gICAgfVxufVxuLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jaWRsLXVucmVzdHJpY3RlZC1kb3VibGVcbmZ1bmN0aW9uIGNvbnZlcnRVbnJlc3RyaWN0ZWREb3VibGUodmFsdWUpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGNlbnNvck5lZ2F0aXZlWmVybyh4KSB7XG4gICAgcmV0dXJuIHggPT09IDAgPyAwIDogeDtcbn1cbmZ1bmN0aW9uIGludGVnZXJQYXJ0KHgpIHtcbiAgICByZXR1cm4gY2Vuc29yTmVnYXRpdmVaZXJvKE1hdGhUcnVuYyh4KSk7XG59XG4vLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtdW5zaWduZWQtbG9uZy1sb25nXG5mdW5jdGlvbiBjb252ZXJ0VW5zaWduZWRMb25nTG9uZ1dpdGhFbmZvcmNlUmFuZ2UodmFsdWUsIGNvbnRleHQpIHtcbiAgICBjb25zdCBsb3dlckJvdW5kID0gMDtcbiAgICBjb25zdCB1cHBlckJvdW5kID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgbGV0IHggPSBOdW1iZXIodmFsdWUpO1xuICAgIHggPSBjZW5zb3JOZWdhdGl2ZVplcm8oeCk7XG4gICAgaWYgKCFOdW1iZXJJc0Zpbml0ZSh4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhIGZpbml0ZSBudW1iZXJgKTtcbiAgICB9XG4gICAgeCA9IGludGVnZXJQYXJ0KHgpO1xuICAgIGlmICh4IDwgbG93ZXJCb3VuZCB8fCB4ID4gdXBwZXJCb3VuZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG91dHNpZGUgdGhlIGFjY2VwdGVkIHJhbmdlIG9mICR7bG93ZXJCb3VuZH0gdG8gJHt1cHBlckJvdW5kfSwgaW5jbHVzaXZlYCk7XG4gICAgfVxuICAgIGlmICghTnVtYmVySXNGaW5pdGUoeCkgfHwgeCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLy8gVE9ETyBVc2UgQmlnSW50IGlmIHN1cHBvcnRlZD9cbiAgICAvLyBsZXQgeEJpZ0ludCA9IEJpZ0ludChpbnRlZ2VyUGFydCh4KSk7XG4gICAgLy8geEJpZ0ludCA9IEJpZ0ludC5hc1VpbnROKDY0LCB4QmlnSW50KTtcbiAgICAvLyByZXR1cm4gTnVtYmVyKHhCaWdJbnQpO1xuICAgIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWFkYWJsZVN0cmVhbSh4LCBjb250ZXh0KSB7XG4gICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHgpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7Y29udGV4dH0gaXMgbm90IGEgUmVhZGFibGVTdHJlYW0uYCk7XG4gICAgfVxufVxuXG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG5mdW5jdGlvbiBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSkge1xuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG59XG4vLyBSZWFkYWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUFkZFJlYWRSZXF1ZXN0KHN0cmVhbSwgcmVhZFJlcXVlc3QpIHtcbiAgICBzdHJlYW0uX3JlYWRlci5fcmVhZFJlcXVlc3RzLnB1c2gocmVhZFJlcXVlc3QpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZG9uZSkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgIGNvbnN0IHJlYWRSZXF1ZXN0ID0gcmVhZGVyLl9yZWFkUmVxdWVzdHMuc2hpZnQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgICByZWFkUmVxdWVzdC5fY2xvc2VTdGVwcygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2NodW5rU3RlcHMoY2h1bmspO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkge1xuICAgIHJldHVybiBzdHJlYW0uX3JlYWRlci5fcmVhZFJlcXVlc3RzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihzdHJlYW0pIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uX3JlYWRlcjtcbiAgICBpZiAocmVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQSBkZWZhdWx0IHJlYWRlciB2ZW5kZWQgYnkgYSB7QGxpbmsgUmVhZGFibGVTdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChzdHJlYW0sIDEsICdSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXInKTtcbiAgICAgICAgYXNzZXJ0UmVhZGFibGVTdHJlYW0oc3RyZWFtLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgcmVhZGluZyBieSBhbm90aGVyIHJlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUodGhpcywgc3RyZWFtKTtcbiAgICAgICAgdGhpcy5fcmVhZFJlcXVlc3RzID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc3RyZWFtIGJlY29tZXMgY2xvc2VkLFxuICAgICAqIG9yIHJlamVjdGVkIGlmIHRoZSBzdHJlYW0gZXZlciBlcnJvcnMgb3IgdGhlIHJlYWRlcidzIGxvY2sgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBzdHJlYW0gZmluaXNoZXMgY2xvc2luZy5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2xvc2VkJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVhZGVyIGlzIGFjdGl2ZSwgYmVoYXZlcyB0aGUgc2FtZSBhcyB7QGxpbmsgUmVhZGFibGVTdHJlYW0uY2FuY2VsIHwgc3RyZWFtLmNhbmNlbChyZWFzb24pfS5cbiAgICAgKi9cbiAgICBjYW5jZWwocmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjYW5jZWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBuZXh0IGNodW5rIGZyb20gdGhlIHN0cmVhbSdzIGludGVybmFsIHF1ZXVlLCBpZiBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBJZiByZWFkaW5nIGEgY2h1bmsgY2F1c2VzIHRoZSBxdWV1ZSB0byBiZWNvbWUgZW1wdHksIG1vcmUgZGF0YSB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvdXJjZS5cbiAgICAgKi9cbiAgICByZWFkKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0UmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVhZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChyZWFkZXJMb2NrRXhjZXB0aW9uKCdyZWFkIGZyb20nKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVQcm9taXNlO1xuICAgICAgICBsZXQgcmVqZWN0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlYWRSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHJlc29sdmVQcm9taXNlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiAoKSA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICBfZXJyb3JTdGVwczogZSA9PiByZWplY3RQcm9taXNlKGUpXG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQodGhpcywgcmVhZFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIHJlYWRlcidzIGxvY2sgb24gdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtLiBBZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIHJlYWRlciBpcyBubyBsb25nZXIgYWN0aXZlLlxuICAgICAqIElmIHRoZSBhc3NvY2lhdGVkIHN0cmVhbSBpcyBlcnJvcmVkIHdoZW4gdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgd2lsbCBhcHBlYXIgZXJyb3JlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgKiBmcm9tIG5vdyBvbjsgb3RoZXJ3aXNlLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIEEgcmVhZGVyJ3MgbG9jayBjYW5ub3QgYmUgcmVsZWFzZWQgd2hpbGUgaXQgc3RpbGwgaGFzIGEgcGVuZGluZyByZWFkIHJlcXVlc3QsIGkuZS4sIGlmIGEgcHJvbWlzZSByZXR1cm5lZCBieVxuICAgICAqIHRoZSByZWFkZXIncyB7QGxpbmsgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLnJlYWQgfCByZWFkKCl9IG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIHNldHRsZWQuIEF0dGVtcHRpbmcgdG9cbiAgICAgKiBkbyBzbyB3aWxsIHRocm93IGEgYFR5cGVFcnJvcmAgYW5kIGxlYXZlIHRoZSByZWFkZXIgbG9ja2VkIHRvIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgcmVsZWFzZUxvY2soKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWxlYXNlTG9jaycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmVhZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIHJlbGVhc2UgYSByZWFkZXIgbG9jayB3aGVuIHRoYXQgcmVhZGVyIGhhcyBwZW5kaW5nIHJlYWQoKSBjYWxscyB1bi1zZXR0bGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZSh0aGlzKTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLCB7XG4gICAgY2FuY2VsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICByZWFkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICByZWxlYXNlTG9jazogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgY2xvc2VkOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcicsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIHJlYWRlcnMuXG5mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcih4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX3JlYWRSZXF1ZXN0cycpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXJSZWFkKHJlYWRlciwgcmVhZFJlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07XG4gICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZWFkUmVxdWVzdC5fY2xvc2VTdGVwcygpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmVhZFJlcXVlc3QuX2Vycm9yU3RlcHMoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcltQdWxsU3RlcHNdKHJlYWRSZXF1ZXN0KTtcbiAgICB9XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyLlxuZnVuY3Rpb24gZGVmYXVsdFJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcmApO1xufVxuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTguYXN5bmNpdGVyYWJsZVwiIC8+XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24gKi9cbmNvbnN0IEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uKiAoKSB7IH0pLnByb3RvdHlwZSk7XG5cbi8vLyA8cmVmZXJlbmNlIGxpYj1cImVzMjAxOC5hc3luY2l0ZXJhYmxlXCIgLz5cbmNsYXNzIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvckltcGwge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRlciwgcHJldmVudENhbmNlbCkge1xuICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5faXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSByZWFkZXI7XG4gICAgICAgIHRoaXMuX3ByZXZlbnRDYW5jZWwgPSBwcmV2ZW50Q2FuY2VsO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCBuZXh0U3RlcHMgPSAoKSA9PiB0aGlzLl9uZXh0U3RlcHMoKTtcbiAgICAgICAgdGhpcy5fb25nb2luZ1Byb21pc2UgPSB0aGlzLl9vbmdvaW5nUHJvbWlzZSA/XG4gICAgICAgICAgICB0cmFuc2Zvcm1Qcm9taXNlV2l0aCh0aGlzLl9vbmdvaW5nUHJvbWlzZSwgbmV4dFN0ZXBzLCBuZXh0U3RlcHMpIDpcbiAgICAgICAgICAgIG5leHRTdGVwcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fb25nb2luZ1Byb21pc2U7XG4gICAgfVxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICBjb25zdCByZXR1cm5TdGVwcyA9ICgpID0+IHRoaXMuX3JldHVyblN0ZXBzKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uZ29pbmdQcm9taXNlID9cbiAgICAgICAgICAgIHRyYW5zZm9ybVByb21pc2VXaXRoKHRoaXMuX29uZ29pbmdQcm9taXNlLCByZXR1cm5TdGVwcywgcmV0dXJuU3RlcHMpIDpcbiAgICAgICAgICAgIHJldHVyblN0ZXBzKCk7XG4gICAgfVxuICAgIF9uZXh0U3RlcHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkZXIgPSB0aGlzLl9yZWFkZXI7XG4gICAgICAgIGlmIChyZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgocmVhZGVyTG9ja0V4Y2VwdGlvbignaXRlcmF0ZScpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZVByb21pc2U7XG4gICAgICAgIGxldCByZWplY3RQcm9taXNlO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgICAgICByZWplY3RQcm9taXNlID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVhZFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfY2h1bmtTdGVwczogY2h1bmsgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uZ29pbmdQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZGVsYXllZCBieSBvbmUgbWljcm90YXNrLCBvdGhlcndpc2Ugd2Ugc3RvcCBwdWxsaW5nIHRvbyBlYXJseSB3aGljaCBicmVha3MgYSB0ZXN0LlxuICAgICAgICAgICAgICAgIC8vIEZJWE1FIElzIHRoaXMgYSBidWcgaW4gdGhlIHNwZWNpZmljYXRpb24sIG9yIGluIHRoZSB0ZXN0P1xuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHJlc29sdmVQcm9taXNlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmdvaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiByZWFzb24gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uZ29pbmdQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UocmVhZGVyKTtcbiAgICAgICAgICAgICAgICByZWplY3RQcm9taXNlKHJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyLCByZWFkUmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICBfcmV0dXJuU3RlcHModmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gdGhpcy5fcmVhZGVyO1xuICAgICAgICBpZiAocmVhZGVyLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2ZpbmlzaCBpdGVyYXRpbmcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50Q2FuY2VsKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNDYW5jZWwocmVhZGVyLCB2YWx1ZSk7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgocmVzdWx0LCAoKSA9PiAoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljUmVsZWFzZShyZWFkZXIpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh7IHZhbHVlLCBkb25lOiB0cnVlIH0pO1xuICAgIH1cbn1cbmNvbnN0IFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IHtcbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbignbmV4dCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYXN5bmNJdGVyYXRvckltcGwubmV4dCgpO1xuICAgIH0sXG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uKCdyZXR1cm4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FzeW5jSXRlcmF0b3JJbXBsLnJldHVybih2YWx1ZSk7XG4gICAgfVxufTtcbmlmIChBc3luY0l0ZXJhdG9yUHJvdG90eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBBc3luY0l0ZXJhdG9yUHJvdG90eXBlKTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbS5cbmZ1bmN0aW9uIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3Ioc3RyZWFtLCBwcmV2ZW50Q2FuY2VsKSB7XG4gICAgY29uc3QgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xuICAgIGNvbnN0IGltcGwgPSBuZXcgUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9ySW1wbChyZWFkZXIsIHByZXZlbnRDYW5jZWwpO1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgIGl0ZXJhdG9yLl9hc3luY0l0ZXJhdG9ySW1wbCA9IGltcGw7XG4gICAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19hc3luY0l0ZXJhdG9ySW1wbCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFN1c3BpY2lvdXNUeXBlT2ZHdWFyZFxuICAgICAgICByZXR1cm4geC5fYXN5bmNJdGVyYXRvckltcGwgaW5zdGFuY2VvZlxuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9ySW1wbDtcbiAgICB9XG4gICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG5mdW5jdGlvbiBzdHJlYW1Bc3luY0l0ZXJhdG9yQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvci4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0ZWFtQXN5bmNJdGVyYXRvcmApO1xufVxuXG4vLy8gPHJlZmVyZW5jZSBsaWI9XCJlczIwMTUuY29yZVwiIC8+XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9OdW1iZXIvaXNOYU4jUG9seWZpbGxcbmNvbnN0IE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uICh4KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB4ICE9PSB4O1xufTtcblxuZnVuY3Rpb24gQ3JlYXRlQXJyYXlGcm9tTGlzdChlbGVtZW50cykge1xuICAgIC8vIFdlIHVzZSBhcnJheXMgdG8gcmVwcmVzZW50IGxpc3RzLCBzbyB0aGlzIGlzIGJhc2ljYWxseSBhIG5vLW9wLlxuICAgIC8vIERvIGEgc2xpY2UgdGhvdWdoIGp1c3QgaW4gY2FzZSB3ZSBoYXBwZW4gdG8gZGVwZW5kIG9uIHRoZSB1bmlxdWUtbmVzcy5cbiAgICByZXR1cm4gZWxlbWVudHMuc2xpY2UoKTtcbn1cbmZ1bmN0aW9uIENvcHlEYXRhQmxvY2tCeXRlcyhkZXN0LCBkZXN0T2Zmc2V0LCBzcmMsIHNyY09mZnNldCwgbikge1xuICAgIG5ldyBVaW50OEFycmF5KGRlc3QpLnNldChuZXcgVWludDhBcnJheShzcmMsIHNyY09mZnNldCwgbiksIGRlc3RPZmZzZXQpO1xufVxuLy8gTm90IGltcGxlbWVudGVkIGNvcnJlY3RseVxuZnVuY3Rpb24gVHJhbnNmZXJBcnJheUJ1ZmZlcihPKSB7XG4gICAgcmV0dXJuIE87XG59XG4vLyBOb3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBJc0RldGFjaGVkQnVmZmVyKE8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBBcnJheUJ1ZmZlclNsaWNlKGJ1ZmZlciwgYmVnaW4sIGVuZCkge1xuICAgIC8vIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSBpcyBub3QgYXZhaWxhYmxlIG9uIElFMTBcbiAgICAvLyBodHRwczovL3d3dy5jYW5pdXNlLmNvbS9tZG4tamF2YXNjcmlwdF9idWlsdGluc19hcnJheWJ1ZmZlcl9zbGljZVxuICAgIGlmIChidWZmZXIuc2xpY2UpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZShiZWdpbiwgZW5kKTtcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gZW5kIC0gYmVnaW47XG4gICAgY29uc3Qgc2xpY2UgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKTtcbiAgICBDb3B5RGF0YUJsb2NrQnl0ZXMoc2xpY2UsIDAsIGJ1ZmZlciwgYmVnaW4sIGxlbmd0aCk7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBJc05vbk5lZ2F0aXZlTnVtYmVyKHYpIHtcbiAgICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKE51bWJlcklzTmFOKHYpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHYgPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBDbG9uZUFzVWludDhBcnJheShPKSB7XG4gICAgY29uc3QgYnVmZmVyID0gQXJyYXlCdWZmZXJTbGljZShPLmJ1ZmZlciwgTy5ieXRlT2Zmc2V0LCBPLmJ5dGVPZmZzZXQgKyBPLmJ5dGVMZW5ndGgpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIpO1xufVxuXG5mdW5jdGlvbiBEZXF1ZXVlVmFsdWUoY29udGFpbmVyKSB7XG4gICAgY29uc3QgcGFpciA9IGNvbnRhaW5lci5fcXVldWUuc2hpZnQoKTtcbiAgICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplIC09IHBhaXIuc2l6ZTtcbiAgICBpZiAoY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA8IDApIHtcbiAgICAgICAgY29udGFpbmVyLl9xdWV1ZVRvdGFsU2l6ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiBwYWlyLnZhbHVlO1xufVxuZnVuY3Rpb24gRW5xdWV1ZVZhbHVlV2l0aFNpemUoY29udGFpbmVyLCB2YWx1ZSwgc2l6ZSkge1xuICAgIGlmICghSXNOb25OZWdhdGl2ZU51bWJlcihzaXplKSB8fCBzaXplID09PSBJbmZpbml0eSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignU2l6ZSBtdXN0IGJlIGEgZmluaXRlLCBub24tTmFOLCBub24tbmVnYXRpdmUgbnVtYmVyLicpO1xuICAgIH1cbiAgICBjb250YWluZXIuX3F1ZXVlLnB1c2goeyB2YWx1ZSwgc2l6ZSB9KTtcbiAgICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplICs9IHNpemU7XG59XG5mdW5jdGlvbiBQZWVrUXVldWVWYWx1ZShjb250YWluZXIpIHtcbiAgICBjb25zdCBwYWlyID0gY29udGFpbmVyLl9xdWV1ZS5wZWVrKCk7XG4gICAgcmV0dXJuIHBhaXIudmFsdWU7XG59XG5mdW5jdGlvbiBSZXNldFF1ZXVlKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5fcXVldWUgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICBjb250YWluZXIuX3F1ZXVlVG90YWxTaXplID0gMDtcbn1cblxuLyoqXG4gKiBBIHB1bGwtaW50byByZXF1ZXN0IGluIGEge0BsaW5rIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmlldyBmb3Igd3JpdGluZyBpbiB0bywgb3IgYG51bGxgIGlmIHRoZSBCWU9CIHJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiByZXNwb25kZWQgdG8uXG4gICAgICovXG4gICAgZ2V0IHZpZXcoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3ZpZXcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgICB9XG4gICAgcmVzcG9uZChieXRlc1dyaXR0ZW4pIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigncmVzcG9uZCcpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoYnl0ZXNXcml0dGVuLCAxLCAncmVzcG9uZCcpO1xuICAgICAgICBieXRlc1dyaXR0ZW4gPSBjb252ZXJ0VW5zaWduZWRMb25nTG9uZ1dpdGhFbmZvcmNlUmFuZ2UoYnl0ZXNXcml0dGVuLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmICh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIEJZT0IgcmVxdWVzdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHRoaXMuX3ZpZXcuYnVmZmVyKSkgO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZCh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciwgYnl0ZXNXcml0dGVuKTtcbiAgICB9XG4gICAgcmVzcG9uZFdpdGhOZXdWaWV3KHZpZXcpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5b2JSZXF1ZXN0QnJhbmRDaGVja0V4Y2VwdGlvbigncmVzcG9uZFdpdGhOZXdWaWV3Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudCh2aWV3LCAxLCAncmVzcG9uZFdpdGhOZXdWaWV3Jyk7XG4gICAgICAgIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KHZpZXcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgY2FuIG9ubHkgcmVzcG9uZCB3aXRoIGFycmF5IGJ1ZmZlciB2aWV3cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGlzIEJZT0IgcmVxdWVzdCBoYXMgYmVlbiBpbnZhbGlkYXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKHZpZXcuYnVmZmVyKSkgO1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KHRoaXMuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLCB2aWV3KTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIHJlc3BvbmQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHJlc3BvbmRXaXRoTmV3VmlldzogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgdmlldzogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdCcsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLyoqXG4gKiBBbGxvd3MgY29udHJvbCBvZiBhIHtAbGluayBSZWFkYWJsZVN0cmVhbSB8IHJlYWRhYmxlIGJ5dGUgc3RyZWFtfSdzIHN0YXRlIGFuZCBpbnRlcm5hbCBxdWV1ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQllPQiBwdWxsIHJlcXVlc3QsIG9yIGBudWxsYCBpZiB0aGVyZSBpc24ndCBvbmUuXG4gICAgICovXG4gICAgZ2V0IGJ5b2JSZXF1ZXN0KCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdieW9iUmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0QllPQlJlcXVlc3QodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBjb250cm9sbGVkIHN0cmVhbSdzIGludGVybmFsIHF1ZXVlLiBJdCBjYW4gYmUgbmVnYXRpdmUsIGlmIHRoZSBxdWV1ZSBpc1xuICAgICAqIG92ZXItZnVsbC4gQW4gdW5kZXJseWluZyBieXRlIHNvdXJjZSBvdWdodCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hlbiBhbmQgaG93IHRvIGFwcGx5IGJhY2twcmVzc3VyZS5cbiAgICAgKi9cbiAgICBnZXQgZGVzaXJlZFNpemUoKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBieXRlU3RyZWFtQ29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Rlc2lyZWRTaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjb250cm9sbGVkIHJlYWRhYmxlIHN0cmVhbS4gQ29uc3VtZXJzIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWFkIGFueSBwcmV2aW91c2x5LWVucXVldWVkIGNodW5rcyBmcm9tXG4gICAgICogdGhlIHN0cmVhbSwgYnV0IG9uY2UgdGhvc2UgYXJlIHJlYWQsIHRoZSBzdHJlYW0gd2lsbCBiZWNvbWUgY2xvc2VkLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jbG9zZVJlcXVlc3RlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZDsgZG8gbm90IGNsb3NlIGl0IGFnYWluIScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlIHN0cmVhbSAoaW4gJHtzdGF0ZX0gc3RhdGUpIGlzIG5vdCBpbiB0aGUgcmVhZGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBjbG9zZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UodGhpcyk7XG4gICAgfVxuICAgIGVucXVldWUoY2h1bmspIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQoY2h1bmssIDEsICdlbnF1ZXVlJyk7XG4gICAgICAgIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2h1bmsgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjaHVuayBtdXN0IGhhdmUgbm9uLXplcm8gYnl0ZUxlbmd0aCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaHVuay5idWZmZXIuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgY2h1bmsncyBidWZmZXIgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGhgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0cmVhbSBpcyBjbG9zZWQgb3IgZHJhaW5pbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBzdHJlYW0gKGluICR7c3RhdGV9IHN0YXRlKSBpcyBub3QgaW4gdGhlIHJlYWRhYmxlIHN0YXRlIGFuZCBjYW5ub3QgYmUgZW5xdWV1ZWQgdG9gKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVycm9ycyB0aGUgY29udHJvbGxlZCByZWFkYWJsZSBzdHJlYW0sIG1ha2luZyBhbGwgZnV0dXJlIGludGVyYWN0aW9ucyB3aXRoIGl0IGZhaWwgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgYGVgLlxuICAgICAqL1xuICAgIGVycm9yKGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbQ2FuY2VsU3RlcHNdKHJlYXNvbikge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJQZW5kaW5nUHVsbEludG9zKHRoaXMpO1xuICAgICAgICBSZXNldFF1ZXVlKHRoaXMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jYW5jZWxBbGdvcml0aG0ocmVhc29uKTtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtQdWxsU3RlcHNdKHJlYWRSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZVRvdGFsU2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlVG90YWxTaXplIC09IGVudHJ5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbih0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShlbnRyeS5idWZmZXIsIGVudHJ5LmJ5dGVPZmZzZXQsIGVudHJ5LmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgcmVhZFJlcXVlc3QuX2NodW5rU3RlcHModmlldyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gdGhpcy5fYXV0b0FsbG9jYXRlQ2h1bmtTaXplO1xuICAgICAgICBpZiAoYXV0b0FsbG9jYXRlQ2h1bmtTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihhdXRvQWxsb2NhdGVDaHVua1NpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGJ1ZmZlckUpIHtcbiAgICAgICAgICAgICAgICByZWFkUmVxdWVzdC5fZXJyb3JTdGVwcyhidWZmZXJFKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwdWxsSW50b0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgICAgICAgIGJ1ZmZlckJ5dGVMZW5ndGg6IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBieXRlT2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGg6IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBieXRlc0ZpbGxlZDogMCxcbiAgICAgICAgICAgICAgICBlbGVtZW50U2l6ZTogMSxcbiAgICAgICAgICAgICAgICB2aWV3Q29uc3RydWN0b3I6IFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgcmVhZGVyVHlwZTogJ2RlZmF1bHQnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgIH1cbiAgICAgICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkUmVxdWVzdChzdHJlYW0sIHJlYWRSZXF1ZXN0KTtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUsIHtcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZW5xdWV1ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgZXJyb3I6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGJ5b2JSZXF1ZXN0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBkZXNpcmVkU2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcicsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIuXG5mdW5jdGlvbiBJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXI7XG59XG5mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19hc3NvY2lhdGVkUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0O1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNob3VsZFB1bGwgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hvdWxkQ2FsbFB1bGwoY29udHJvbGxlcik7XG4gICAgaWYgKCFzaG91bGRQdWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3B1bGxpbmcpIHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gdHJ1ZTtcbiAgICAvLyBUT0RPOiBUZXN0IGNvbnRyb2xsZXIgYXJndW1lbnRcbiAgICBjb25zdCBwdWxsUHJvbWlzZSA9IGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0oKTtcbiAgICB1cG9uUHJvbWlzZShwdWxsUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9wdWxsQWdhaW4pIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICB9LCBlID0+IHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyhjb250cm9sbGVyKSB7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29tbWl0UHVsbEludG9EZXNjcmlwdG9yKHN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGZpbGxlZFZpZXcgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IucmVhZGVyVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgZmlsbGVkVmlldywgZG9uZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCBmaWxsZWRWaWV3LCBkb25lKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ29udmVydFB1bGxJbnRvRGVzY3JpcHRvcihwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICBjb25zdCBieXRlc0ZpbGxlZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZDtcbiAgICBjb25zdCBlbGVtZW50U2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTtcbiAgICByZXR1cm4gbmV3IHB1bGxJbnRvRGVzY3JpcHRvci52aWV3Q29uc3RydWN0b3IocHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlciwgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVPZmZzZXQsIGJ5dGVzRmlsbGVkIC8gZWxlbWVudFNpemUpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgY29udHJvbGxlci5fcXVldWUucHVzaCh7IGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCB9KTtcbiAgICBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSArPSBieXRlTGVuZ3RoO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgZWxlbWVudFNpemUgPSBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemU7XG4gICAgY29uc3QgY3VycmVudEFsaWduZWRCeXRlcyA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAtIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAlIGVsZW1lbnRTaXplO1xuICAgIGNvbnN0IG1heEJ5dGVzVG9Db3B5ID0gTWF0aC5taW4oY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICBjb25zdCBtYXhCeXRlc0ZpbGxlZCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCArIG1heEJ5dGVzVG9Db3B5O1xuICAgIGNvbnN0IG1heEFsaWduZWRCeXRlcyA9IG1heEJ5dGVzRmlsbGVkIC0gbWF4Qnl0ZXNGaWxsZWQgJSBlbGVtZW50U2l6ZTtcbiAgICBsZXQgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyA9IG1heEJ5dGVzVG9Db3B5O1xuICAgIGxldCByZWFkeSA9IGZhbHNlO1xuICAgIGlmIChtYXhBbGlnbmVkQnl0ZXMgPiBjdXJyZW50QWxpZ25lZEJ5dGVzKSB7XG4gICAgICAgIHRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmcgPSBtYXhBbGlnbmVkQnl0ZXMgLSBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7XG4gICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcXVldWUgPSBjb250cm9sbGVyLl9xdWV1ZTtcbiAgICB3aGlsZSAodG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgY29uc3QgaGVhZE9mUXVldWUgPSBxdWV1ZS5wZWVrKCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzVG9Db3B5ID0gTWF0aC5taW4odG90YWxCeXRlc1RvQ29weVJlbWFpbmluZywgaGVhZE9mUXVldWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGRlc3RTdGFydCA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0ICsgcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVzRmlsbGVkO1xuICAgICAgICBDb3B5RGF0YUJsb2NrQnl0ZXMocHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlciwgZGVzdFN0YXJ0LCBoZWFkT2ZRdWV1ZS5idWZmZXIsIGhlYWRPZlF1ZXVlLmJ5dGVPZmZzZXQsIGJ5dGVzVG9Db3B5KTtcbiAgICAgICAgaWYgKGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGggPT09IGJ5dGVzVG9Db3B5KSB7XG4gICAgICAgICAgICBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVhZE9mUXVldWUuYnl0ZU9mZnNldCArPSBieXRlc1RvQ29weTtcbiAgICAgICAgICAgIGhlYWRPZlF1ZXVlLmJ5dGVMZW5ndGggLT0gYnl0ZXNUb0NvcHk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgLT0gYnl0ZXNUb0NvcHk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLCBieXRlc1RvQ29weSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgdG90YWxCeXRlc1RvQ29weVJlbWFpbmluZyAtPSBieXRlc1RvQ29weTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWR5O1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxIZWFkUHVsbEludG9EZXNjcmlwdG9yKGNvbnRyb2xsZXIsIHNpemUsIHB1bGxJbnRvRGVzY3JpcHRvcikge1xuICAgIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCArPSBzaXplO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckhhbmRsZVF1ZXVlRHJhaW4oY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9PT0gMCAmJiBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCkge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdChjb250cm9sbGVyKSB7XG4gICAgaWYgKGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QuX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0Ll92aWV3ID0gbnVsbDtcbiAgICBjb250cm9sbGVyLl9ieW9iUmVxdWVzdCA9IG51bGw7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICB3aGlsZSAoY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB1bGxJbnRvRGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSkge1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbW1pdFB1bGxJbnRvRGVzY3JpcHRvcihjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclB1bGxJbnRvKGNvbnRyb2xsZXIsIHZpZXcsIHJlYWRJbnRvUmVxdWVzdCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgbGV0IGVsZW1lbnRTaXplID0gMTtcbiAgICBpZiAodmlldy5jb25zdHJ1Y3RvciAhPT0gRGF0YVZpZXcpIHtcbiAgICAgICAgZWxlbWVudFNpemUgPSB2aWV3LmNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgIH1cbiAgICBjb25zdCBjdG9yID0gdmlldy5jb25zdHJ1Y3RvcjtcbiAgICAvLyB0cnkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIodmlldy5idWZmZXIpO1xuICAgIC8vIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgIHJlYWRJbnRvUmVxdWVzdC5fZXJyb3JTdGVwcyhlKTtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgY29uc3QgcHVsbEludG9EZXNjcmlwdG9yID0ge1xuICAgICAgICBidWZmZXIsXG4gICAgICAgIGJ1ZmZlckJ5dGVMZW5ndGg6IGJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgICBieXRlT2Zmc2V0OiB2aWV3LmJ5dGVPZmZzZXQsXG4gICAgICAgIGJ5dGVMZW5ndGg6IHZpZXcuYnl0ZUxlbmd0aCxcbiAgICAgICAgYnl0ZXNGaWxsZWQ6IDAsXG4gICAgICAgIGVsZW1lbnRTaXplLFxuICAgICAgICB2aWV3Q29uc3RydWN0b3I6IGN0b3IsXG4gICAgICAgIHJlYWRlclR5cGU6ICdieW9iJ1xuICAgIH07XG4gICAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnB1c2gocHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICAgICAgLy8gTm8gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoKSBjYWxsIHNpbmNlOlxuICAgICAgICAvLyAtIE5vIGNoYW5nZSBoYXBwZW5zIG9uIGRlc2lyZWRTaXplXG4gICAgICAgIC8vIC0gVGhlIHNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIG5vdGlmaWVkIG9mIHRoYXQgdGhlcmUncyBhdCBsZWFzdCAxIHBlbmRpbmcgcmVhZCh2aWV3KVxuICAgICAgICBSZWFkYWJsZVN0cmVhbUFkZFJlYWRJbnRvUmVxdWVzdChzdHJlYW0sIHJlYWRJbnRvUmVxdWVzdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5VmlldyA9IG5ldyBjdG9yKHB1bGxJbnRvRGVzY3JpcHRvci5idWZmZXIsIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlT2Zmc2V0LCAwKTtcbiAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9jbG9zZVN0ZXBzKGVtcHR5Vmlldyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID4gMCkge1xuICAgICAgICBpZiAoUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUoY29udHJvbGxlciwgcHVsbEludG9EZXNjcmlwdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsbGVkVmlldyA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb252ZXJ0UHVsbEludG9EZXNjcmlwdG9yKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbihjb250cm9sbGVyKTtcbiAgICAgICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2h1bmtTdGVwcyhmaWxsZWRWaWV3KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgVHlwZUVycm9yKCdJbnN1ZmZpY2llbnQgYnl0ZXMgdG8gZmlsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gYnVmZmVyJyk7XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoY29udHJvbGxlciwgZSk7XG4gICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wdXNoKHB1bGxJbnRvRGVzY3JpcHRvcik7XG4gICAgUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCByZWFkSW50b1JlcXVlc3QpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbkNsb3NlZFN0YXRlKGNvbnRyb2xsZXIsIGZpcnN0RGVzY3JpcHRvcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW07XG4gICAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlcihzdHJlYW0pKSB7XG4gICAgICAgIHdoaWxlIChSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRJbnRvUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHB1bGxJbnRvRGVzY3JpcHRvciA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3Ioc3RyZWFtLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJblJlYWRhYmxlU3RhdGUoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBwdWxsSW50b0Rlc2NyaXB0b3IpIHtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRmlsbEhlYWRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlciwgYnl0ZXNXcml0dGVuLCBwdWxsSW50b0Rlc2NyaXB0b3IpO1xuICAgIGlmIChwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQgPCBwdWxsSW50b0Rlc2NyaXB0b3IuZWxlbWVudFNpemUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyU2hpZnRQZW5kaW5nUHVsbEludG8oY29udHJvbGxlcik7XG4gICAgY29uc3QgcmVtYWluZGVyU2l6ZSA9IHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAlIHB1bGxJbnRvRGVzY3JpcHRvci5lbGVtZW50U2l6ZTtcbiAgICBpZiAocmVtYWluZGVyU2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZW5kID0gcHVsbEludG9EZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBwdWxsSW50b0Rlc2NyaXB0b3IuYnl0ZXNGaWxsZWQ7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IEFycmF5QnVmZmVyU2xpY2UocHVsbEludG9EZXNjcmlwdG9yLmJ1ZmZlciwgZW5kIC0gcmVtYWluZGVyU2l6ZSwgZW5kKTtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgcmVtYWluZGVyLCAwLCByZW1haW5kZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIHB1bGxJbnRvRGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAtPSByZW1haW5kZXJTaXplO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3IoY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSwgcHVsbEludG9EZXNjcmlwdG9yKTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pIHtcbiAgICBjb25zdCBmaXJzdERlc2NyaXB0b3IgPSBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLnBlZWsoKTtcbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluQ2xvc2VkU3RhdGUoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluUmVhZGFibGVTdGF0ZShjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4sIGZpcnN0RGVzY3JpcHRvcik7XG4gICAgfVxuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5zaGlmdCgpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFjb250cm9sbGVyLl9zdGFydGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlcihzdHJlYW0pICYmIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZFJlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkSW50b1JlcXVlc3RzKHN0cmVhbSkgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkZXNpcmVkU2l6ZSA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtcbiAgICBpZiAoZGVzaXJlZFNpemUgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbn1cbi8vIEEgY2xpZW50IG9mIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgbWF5IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdG8gYnlwYXNzIHN0YXRlIGNoZWNrLlxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCB8fCBzdHJlYW0uX3N0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdFBlbmRpbmdQdWxsSW50byA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBpZiAoZmlyc3RQZW5kaW5nUHVsbEludG8uYnl0ZXNGaWxsZWQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFR5cGVFcnJvcignSW5zdWZmaWNpZW50IGJ5dGVzIHRvIGZpbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGJ1ZmZlcicpO1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbTtcbiAgICBpZiAoY29udHJvbGxlci5fY2xvc2VSZXF1ZXN0ZWQgfHwgc3RyZWFtLl9zdGF0ZSAhPT0gJ3JlYWRhYmxlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IGNodW5rLmJ1ZmZlcjtcbiAgICBjb25zdCBieXRlT2Zmc2V0ID0gY2h1bmsuYnl0ZU9mZnNldDtcbiAgICBjb25zdCBieXRlTGVuZ3RoID0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICBjb25zdCB0cmFuc2ZlcnJlZEJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoYnVmZmVyKTtcbiAgICBpZiAoY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0UGVuZGluZ1B1bGxJbnRvID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgICAgIGlmIChJc0RldGFjaGVkQnVmZmVyKGZpcnN0UGVuZGluZ1B1bGxJbnRvLmJ1ZmZlcikpIDtcbiAgICAgICAgZmlyc3RQZW5kaW5nUHVsbEludG8uYnVmZmVyID0gVHJhbnNmZXJBcnJheUJ1ZmZlcihmaXJzdFBlbmRpbmdQdWxsSW50by5idWZmZXIpO1xuICAgIH1cbiAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySW52YWxpZGF0ZUJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChSZWFkYWJsZVN0cmVhbUhhc0RlZmF1bHRSZWFkZXIoc3RyZWFtKSkge1xuICAgICAgICBpZiAoUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA9PT0gMCkge1xuICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWVDaHVua1RvUXVldWUoY29udHJvbGxlciwgdHJhbnNmZXJyZWRCdWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaGlmdFBlbmRpbmdQdWxsSW50byhjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVycmVkVmlldyA9IG5ldyBVaW50OEFycmF5KHRyYW5zZmVycmVkQnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRSZXF1ZXN0KHN0cmVhbSwgdHJhbnNmZXJyZWRWaWV3LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkpIHtcbiAgICAgICAgLy8gVE9ETzogSWRlYWxseSBpbiB0aGlzIGJyYW5jaCBkZXRhY2hpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IGlmIHRoZSBidWZmZXIgaXMgbm90IGNvbnN1bWVkIGZ1bGx5LlxuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQcm9jZXNzUHVsbEludG9EZXNjcmlwdG9yc1VzaW5nUXVldWUoY29udHJvbGxlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZUNodW5rVG9RdWV1ZShjb250cm9sbGVyLCB0cmFuc2ZlcnJlZEJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlICE9PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyhjb250cm9sbGVyKTtcbiAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0KGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPT09IG51bGwgJiYgY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciwgZmlyc3REZXNjcmlwdG9yLmJ5dGVPZmZzZXQgKyBmaXJzdERlc2NyaXB0b3IuYnl0ZXNGaWxsZWQsIGZpcnN0RGVzY3JpcHRvci5ieXRlTGVuZ3RoIC0gZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkKTtcbiAgICAgICAgY29uc3QgYnlvYlJlcXVlc3QgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QucHJvdG90eXBlKTtcbiAgICAgICAgU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0KGJ5b2JSZXF1ZXN0LCBjb250cm9sbGVyLCB2aWV3KTtcbiAgICAgICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBieW9iUmVxdWVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuX2J5b2JSZXF1ZXN0O1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZUJ5dGVTdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5fc3RyYXRlZ3lIV00gLSBjb250cm9sbGVyLl9xdWV1ZVRvdGFsU2l6ZTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGNvbnRyb2xsZXIsIGJ5dGVzV3JpdHRlbikge1xuICAgIGNvbnN0IGZpcnN0RGVzY3JpcHRvciA9IGNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MucGVlaygpO1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICBpZiAoYnl0ZXNXcml0dGVuICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1dyaXR0ZW4gbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSBjbG9zZWQgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J5dGVzV3JpdHRlbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHdoZW4gY2FsbGluZyByZXNwb25kKCkgb24gYSByZWFkYWJsZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgYnl0ZXNXcml0dGVuID4gZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdieXRlc1dyaXR0ZW4gb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIoZmlyc3REZXNjcmlwdG9yLmJ1ZmZlcik7XG4gICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbChjb250cm9sbGVyLCBieXRlc1dyaXR0ZW4pO1xufVxuZnVuY3Rpb24gUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRXaXRoTmV3Vmlldyhjb250cm9sbGVyLCB2aWV3KSB7XG4gICAgY29uc3QgZmlyc3REZXNjcmlwdG9yID0gY29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5wZWVrKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVCeXRlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2aWV3XFwncyBsZW5ndGggbXVzdCBiZSAwIHdoZW4gY2FsbGluZyByZXNwb25kV2l0aE5ld1ZpZXcoKSBvbiBhIGNsb3NlZCBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZpZXcuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZpZXdcXCdzIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHdoZW4gY2FsbGluZyByZXNwb25kV2l0aE5ld1ZpZXcoKSBvbiBhIHJlYWRhYmxlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmaXJzdERlc2NyaXB0b3IuYnl0ZU9mZnNldCArIGZpcnN0RGVzY3JpcHRvci5ieXRlc0ZpbGxlZCAhPT0gdmlldy5ieXRlT2Zmc2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgcmVnaW9uIHNwZWNpZmllZCBieSB2aWV3IGRvZXMgbm90IG1hdGNoIGJ5b2JSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGlmIChmaXJzdERlc2NyaXB0b3IuYnVmZmVyQnl0ZUxlbmd0aCAhPT0gdmlldy5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGJ1ZmZlciBvZiB2aWV3IGhhcyBkaWZmZXJlbnQgY2FwYWNpdHkgdGhhbiBieW9iUmVxdWVzdCcpO1xuICAgIH1cbiAgICBpZiAoZmlyc3REZXNjcmlwdG9yLmJ5dGVzRmlsbGVkICsgdmlldy5ieXRlTGVuZ3RoID4gZmlyc3REZXNjcmlwdG9yLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSByZWdpb24gc3BlY2lmaWVkIGJ5IHZpZXcgaXMgbGFyZ2VyIHRoYW4gYnlvYlJlcXVlc3QnKTtcbiAgICB9XG4gICAgY29uc3Qgdmlld0J5dGVMZW5ndGggPSB2aWV3LmJ5dGVMZW5ndGg7XG4gICAgZmlyc3REZXNjcmlwdG9yLmJ1ZmZlciA9IFRyYW5zZmVyQXJyYXlCdWZmZXIodmlldy5idWZmZXIpO1xuICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW50ZXJuYWwoY29udHJvbGxlciwgdmlld0J5dGVMZW5ndGgpO1xufVxuZnVuY3Rpb24gU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKSB7XG4gICAgY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSA9IHN0cmVhbTtcbiAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9wdWxsaW5nID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fYnlvYlJlcXVlc3QgPSBudWxsO1xuICAgIC8vIE5lZWQgdG8gc2V0IHRoZSBzbG90cyBzbyB0aGF0IHRoZSBhc3NlcnQgZG9lc24ndCBmaXJlLiBJbiB0aGUgc3BlYyB0aGUgc2xvdHMgYWxyZWFkeSBleGlzdCBpbXBsaWNpdGx5LlxuICAgIGNvbnRyb2xsZXIuX3F1ZXVlID0gY29udHJvbGxlci5fcXVldWVUb3RhbFNpemUgPSB1bmRlZmluZWQ7XG4gICAgUmVzZXRRdWV1ZShjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLl9jbG9zZVJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyLl9zdHJhdGVneUhXTSA9IGhpZ2hXYXRlck1hcms7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHB1bGxBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fY2FuY2VsQWxnb3JpdGhtID0gY2FuY2VsQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2F1dG9BbGxvY2F0ZUNodW5rU2l6ZSA9IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICBjb250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zID0gbmV3IFNpbXBsZVF1ZXVlKCk7XG4gICAgc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KSwgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQoY29udHJvbGxlcik7XG4gICAgfSwgciA9PiB7XG4gICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCByKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlKHN0cmVhbSwgdW5kZXJseWluZ0J5dGVTb3VyY2UsIGhpZ2hXYXRlck1hcmspIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgbGV0IHN0YXJ0QWxnb3JpdGhtID0gKCkgPT4gdW5kZWZpbmVkO1xuICAgIGxldCBwdWxsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGxldCBjYW5jZWxBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgaWYgKHVuZGVybHlpbmdCeXRlU291cmNlLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRBbGdvcml0aG0gPSAoKSA9PiB1bmRlcmx5aW5nQnl0ZVNvdXJjZS5zdGFydChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdCeXRlU291cmNlLnB1bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwdWxsQWxnb3JpdGhtID0gKCkgPT4gdW5kZXJseWluZ0J5dGVTb3VyY2UucHVsbChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdCeXRlU291cmNlLmNhbmNlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbmNlbEFsZ29yaXRobSA9IHJlYXNvbiA9PiB1bmRlcmx5aW5nQnl0ZVNvdXJjZS5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgY29uc3QgYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gdW5kZXJseWluZ0J5dGVTb3VyY2UuYXV0b0FsbG9jYXRlQ2h1bmtTaXplO1xuICAgIGlmIChhdXRvQWxsb2NhdGVDaHVua1NpemUgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXV0b0FsbG9jYXRlQ2h1bmtTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG4gICAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKTtcbn1cbmZ1bmN0aW9uIFNldFVwUmVhZGFibGVTdHJlYW1CWU9CUmVxdWVzdChyZXF1ZXN0LCBjb250cm9sbGVyLCB2aWV3KSB7XG4gICAgcmVxdWVzdC5fYXNzb2NpYXRlZFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHJlcXVlc3QuX3ZpZXcgPSB2aWV3O1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QuXG5mdW5jdGlvbiBieW9iUmVxdWVzdEJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0YCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlci5cbmZ1bmN0aW9uIGJ5dGVTdHJlYW1Db250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJgKTtcbn1cblxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihzdHJlYW0pO1xufVxuLy8gUmVhZGFibGVTdHJlYW0gQVBJIGV4cG9zZWQgZm9yIGNvbnRyb2xsZXJzLlxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1BZGRSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCByZWFkSW50b1JlcXVlc3QpIHtcbiAgICBzdHJlYW0uX3JlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5wdXNoKHJlYWRJbnRvUmVxdWVzdCk7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkSW50b1JlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZG9uZSkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgIGNvbnN0IHJlYWRJbnRvUmVxdWVzdCA9IHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5zaGlmdCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICAgIHJlYWRJbnRvUmVxdWVzdC5fY2xvc2VTdGVwcyhjaHVuayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZWFkSW50b1JlcXVlc3QuX2NodW5rU3RlcHMoY2h1bmspO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyhzdHJlYW0pIHtcbiAgICByZXR1cm4gc3RyZWFtLl9yZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMubGVuZ3RoO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1IYXNCWU9CUmVhZGVyKHN0cmVhbSkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgIGlmIChyZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBBIEJZT0IgcmVhZGVyIHZlbmRlZCBieSBhIHtAbGluayBSZWFkYWJsZVN0cmVhbX0uXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KHN0cmVhbSwgMSwgJ1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcicpO1xuICAgICAgICBhc3NlcnRSZWFkYWJsZVN0cmVhbShzdHJlYW0sICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgZm9yIGV4Y2x1c2l2ZSByZWFkaW5nIGJ5IGFub3RoZXIgcmVhZGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29uc3RydWN0IGEgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyIGZvciBhIHN0cmVhbSBub3QgY29uc3RydWN0ZWQgd2l0aCBhIGJ5dGUgJyArXG4gICAgICAgICAgICAgICAgJ3NvdXJjZScpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY0luaXRpYWxpemUodGhpcywgc3RyZWFtKTtcbiAgICAgICAgdGhpcy5fcmVhZEludG9SZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdoZW4gdGhlIHN0cmVhbSBiZWNvbWVzIGNsb3NlZCwgb3IgcmVqZWN0ZWQgaWYgdGhlIHN0cmVhbSBldmVyIGVycm9ycyBvclxuICAgICAqIHRoZSByZWFkZXIncyBsb2NrIGlzIHJlbGVhc2VkIGJlZm9yZSB0aGUgc3RyZWFtIGZpbmlzaGVzIGNsb3NpbmcuXG4gICAgICovXG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcih0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYnlvYlJlYWRlckJyYW5kQ2hlY2tFeGNlcHRpb24oJ2Nsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFJlYWRhYmxlU3RyZWFtLmNhbmNlbCB8IHN0cmVhbS5jYW5jZWwocmVhc29uKX0uXG4gICAgICovXG4gICAgY2FuY2VsKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbignY2FuY2VsJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ2NhbmNlbCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIHJlYWRzIGJ5dGVzIGludG8gdmlldywgYW5kIHJldHVybnMgYSBwcm9taXNlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIElmIHJlYWRpbmcgYSBjaHVuayBjYXVzZXMgdGhlIHF1ZXVlIHRvIGJlY29tZSBlbXB0eSwgbW9yZSBkYXRhIHdpbGwgYmUgcHVsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgc291cmNlLlxuICAgICAqL1xuICAgIHJlYWQodmlldykge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVhZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyh2aWV3KSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcigndmlldyBtdXN0IGJlIGFuIGFycmF5IGJ1ZmZlciB2aWV3JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aWV3LmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ3ZpZXcgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpZXcuYnVmZmVyLmJ5dGVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoYHZpZXcncyBidWZmZXIgbXVzdCBoYXZlIG5vbi16ZXJvIGJ5dGVMZW5ndGhgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzRGV0YWNoZWRCdWZmZXIodmlldy5idWZmZXIpKSA7XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHJlYWRlckxvY2tFeGNlcHRpb24oJ3JlYWQgZnJvbScpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZVByb21pc2U7XG4gICAgICAgIGxldCByZWplY3RQcm9taXNlO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgICAgICByZWplY3RQcm9taXNlID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVhZEludG9SZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHJlc29sdmVQcm9taXNlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KSxcbiAgICAgICAgICAgIF9jbG9zZVN0ZXBzOiBjaHVuayA9PiByZXNvbHZlUHJvbWlzZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgIF9lcnJvclN0ZXBzOiBlID0+IHJlamVjdFByb21pc2UoZSlcbiAgICAgICAgfTtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyUmVhZCh0aGlzLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIHJlYWRlcidzIGxvY2sgb24gdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtLiBBZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIHJlYWRlciBpcyBubyBsb25nZXIgYWN0aXZlLlxuICAgICAqIElmIHRoZSBhc3NvY2lhdGVkIHN0cmVhbSBpcyBlcnJvcmVkIHdoZW4gdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZWFkZXIgd2lsbCBhcHBlYXIgZXJyb3JlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgKiBmcm9tIG5vdyBvbjsgb3RoZXJ3aXNlLCB0aGUgcmVhZGVyIHdpbGwgYXBwZWFyIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIEEgcmVhZGVyJ3MgbG9jayBjYW5ub3QgYmUgcmVsZWFzZWQgd2hpbGUgaXQgc3RpbGwgaGFzIGEgcGVuZGluZyByZWFkIHJlcXVlc3QsIGkuZS4sIGlmIGEgcHJvbWlzZSByZXR1cm5lZCBieVxuICAgICAqIHRoZSByZWFkZXIncyB7QGxpbmsgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnJlYWQgfCByZWFkKCl9IG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIHNldHRsZWQuIEF0dGVtcHRpbmcgdG9cbiAgICAgKiBkbyBzbyB3aWxsIHRocm93IGEgYFR5cGVFcnJvcmAgYW5kIGxlYXZlIHRoZSByZWFkZXIgbG9ja2VkIHRvIHRoZSBzdHJlYW0uXG4gICAgICovXG4gICAgcmVsZWFzZUxvY2soKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5b2JSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdyZWxlYXNlTG9jaycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vd25lclJlYWRhYmxlU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmVhZEludG9SZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byByZWxlYXNlIGEgcmVhZGVyIGxvY2sgd2hlbiB0aGF0IHJlYWRlciBoYXMgcGVuZGluZyByZWFkKCkgY2FsbHMgdW4tc2V0dGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtUmVhZGVyR2VuZXJpY1JlbGVhc2UodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZSwge1xuICAgIGNhbmNlbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVhZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVsZWFzZUxvY2s6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGNsb3NlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSByZWFkZXJzLlxuZnVuY3Rpb24gSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkSW50b1JlcXVlc3RzJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlcjtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpIHtcbiAgICBjb25zdCBzdHJlYW0gPSByZWFkZXIuX293bmVyUmVhZGFibGVTdHJlYW07XG4gICAgc3RyZWFtLl9kaXN0dXJiZWQgPSB0cnVlO1xuICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmVhZEludG9SZXF1ZXN0Ll9lcnJvclN0ZXBzKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclB1bGxJbnRvKHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpO1xuICAgIH1cbn1cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIuXG5mdW5jdGlvbiBieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyYCk7XG59XG5cbmZ1bmN0aW9uIEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHN0cmF0ZWd5LCBkZWZhdWx0SFdNKSB7XG4gICAgY29uc3QgeyBoaWdoV2F0ZXJNYXJrIH0gPSBzdHJhdGVneTtcbiAgICBpZiAoaGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0SFdNO1xuICAgIH1cbiAgICBpZiAoTnVtYmVySXNOYU4oaGlnaFdhdGVyTWFyaykgfHwgaGlnaFdhdGVyTWFyayA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgaGlnaFdhdGVyTWFyaycpO1xuICAgIH1cbiAgICByZXR1cm4gaGlnaFdhdGVyTWFyaztcbn1cbmZ1bmN0aW9uIEV4dHJhY3RTaXplQWxnb3JpdGhtKHN0cmF0ZWd5KSB7XG4gICAgY29uc3QgeyBzaXplIH0gPSBzdHJhdGVneTtcbiAgICBpZiAoIXNpemUpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IDE7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5KGluaXQsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KGluaXQsIGNvbnRleHQpO1xuICAgIGNvbnN0IGhpZ2hXYXRlck1hcmsgPSBpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuaGlnaFdhdGVyTWFyaztcbiAgICBjb25zdCBzaXplID0gaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LnNpemU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGlnaFdhdGVyTWFyazogaGlnaFdhdGVyTWFyayA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY29udmVydFVucmVzdHJpY3RlZERvdWJsZShoaWdoV2F0ZXJNYXJrKSxcbiAgICAgICAgc2l6ZTogc2l6ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY29udmVydFF1ZXVpbmdTdHJhdGVneVNpemUoc2l6ZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnc2l6ZScgdGhhdGApXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRRdWV1aW5nU3RyYXRlZ3lTaXplKGZuLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiBjaHVuayA9PiBjb252ZXJ0VW5yZXN0cmljdGVkRG91YmxlKGZuKGNodW5rKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU2luayhvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkob3JpZ2luYWwsIGNvbnRleHQpO1xuICAgIGNvbnN0IGFib3J0ID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLmFib3J0O1xuICAgIGNvbnN0IGNsb3NlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLmNsb3NlO1xuICAgIGNvbnN0IHN0YXJ0ID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnN0YXJ0O1xuICAgIGNvbnN0IHR5cGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwudHlwZTtcbiAgICBjb25zdCB3cml0ZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC53cml0ZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhYm9ydDogYWJvcnQgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTaW5rQWJvcnRDYWxsYmFjayhhYm9ydCwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ2Fib3J0JyB0aGF0YCksXG4gICAgICAgIGNsb3NlOiBjbG9zZSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VW5kZXJseWluZ1NpbmtDbG9zZUNhbGxiYWNrKGNsb3NlLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnY2xvc2UnIHRoYXRgKSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU2lua1N0YXJ0Q2FsbGJhY2soc3RhcnQsIG9yaWdpbmFsLCBgJHtjb250ZXh0fSBoYXMgbWVtYmVyICdzdGFydCcgdGhhdGApLFxuICAgICAgICB3cml0ZTogd3JpdGUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTaW5rV3JpdGVDYWxsYmFjayh3cml0ZSwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3dyaXRlJyB0aGF0YCksXG4gICAgICAgIHR5cGVcbiAgICB9O1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTaW5rQWJvcnRDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChyZWFzb24pID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW3JlYXNvbl0pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTaW5rQ2xvc2VDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuICgpID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW10pO1xufVxuZnVuY3Rpb24gY29udmVydFVuZGVybHlpbmdTaW5rU3RhcnRDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjb250cm9sbGVyKSA9PiByZWZsZWN0Q2FsbChmbiwgb3JpZ2luYWwsIFtjb250cm9sbGVyXSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VW5kZXJseWluZ1NpbmtXcml0ZUNhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNodW5rLCBjb250cm9sbGVyKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtjaHVuaywgY29udHJvbGxlcl0pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRXcml0YWJsZVN0cmVhbSh4LCBjb250ZXh0KSB7XG4gICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtKHgpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7Y29udGV4dH0gaXMgbm90IGEgV3JpdGFibGVTdHJlYW0uYCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0Fib3J0U2lnbmFsKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlLmFib3J0ZWQgPT09ICdib29sZWFuJztcbiAgICB9XG4gICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgIC8vIEFib3J0U2lnbmFsLnByb3RvdHlwZS5hYm9ydGVkIHRocm93cyBpZiBpdHMgYnJhbmQgY2hlY2sgZmFpbHNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmNvbnN0IHN1cHBvcnRzQWJvcnRDb250cm9sbGVyID0gdHlwZW9mIEFib3J0Q29udHJvbGxlciA9PT0gJ2Z1bmN0aW9uJztcbi8qKlxuICogQ29uc3RydWN0IGEgbmV3IEFib3J0Q29udHJvbGxlciwgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQWJvcnRDb250cm9sbGVyKCkge1xuICAgIGlmIChzdXBwb3J0c0Fib3J0Q29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgd3JpdGFibGUgc3RyZWFtIHJlcHJlc2VudHMgYSBkZXN0aW5hdGlvbiBmb3IgZGF0YSwgaW50byB3aGljaCB5b3UgY2FuIHdyaXRlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgV3JpdGFibGVTdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHJhd1VuZGVybHlpbmdTaW5rID0ge30sIHJhd1N0cmF0ZWd5ID0ge30pIHtcbiAgICAgICAgaWYgKHJhd1VuZGVybHlpbmdTaW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJhd1VuZGVybHlpbmdTaW5rID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydE9iamVjdChyYXdVbmRlcmx5aW5nU2luaywgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gY29udmVydFF1ZXVpbmdTdHJhdGVneShyYXdTdHJhdGVneSwgJ1NlY29uZCBwYXJhbWV0ZXInKTtcbiAgICAgICAgY29uc3QgdW5kZXJseWluZ1NpbmsgPSBjb252ZXJ0VW5kZXJseWluZ1NpbmsocmF3VW5kZXJseWluZ1NpbmssICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgSW5pdGlhbGl6ZVdyaXRhYmxlU3RyZWFtKHRoaXMpO1xuICAgICAgICBjb25zdCB0eXBlID0gdW5kZXJseWluZ1NpbmsudHlwZTtcbiAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZSBpcyBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaXplQWxnb3JpdGhtID0gRXh0cmFjdFNpemVBbGdvcml0aG0oc3RyYXRlZ3kpO1xuICAgICAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gRXh0cmFjdEhpZ2hXYXRlck1hcmsoc3RyYXRlZ3ksIDEpO1xuICAgICAgICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NpbmsodGhpcywgdW5kZXJseWluZ1NpbmssIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB3cml0YWJsZSBzdHJlYW0gaXMgbG9ja2VkIHRvIGEgd3JpdGVyLlxuICAgICAqL1xuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdsb2NrZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnRzIHRoZSBzdHJlYW0sIHNpZ25hbGluZyB0aGF0IHRoZSBwcm9kdWNlciBjYW4gbm8gbG9uZ2VyIHN1Y2Nlc3NmdWxseSB3cml0ZSB0byB0aGUgc3RyZWFtIGFuZCBpdCBpcyB0byBiZVxuICAgICAqIGltbWVkaWF0ZWx5IG1vdmVkIHRvIGFuIGVycm9yZWQgc3RhdGUsIHdpdGggYW55IHF1ZXVlZC11cCB3cml0ZXMgZGlzY2FyZGVkLiBUaGlzIHdpbGwgYWxzbyBleGVjdXRlIGFueSBhYm9ydFxuICAgICAqIG1lY2hhbmlzbSBvZiB0aGUgdW5kZXJseWluZyBzaW5rLlxuICAgICAqXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBmdWxmaWxsIGlmIHRoZSBzdHJlYW0gc2h1dHMgZG93biBzdWNjZXNzZnVsbHksIG9yIHJlamVjdCBpZiB0aGUgdW5kZXJseWluZyBzaW5rIHNpZ25hbGVkXG4gICAgICogdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IgZG9pbmcgc28uIEFkZGl0aW9uYWxseSwgaXQgd2lsbCByZWplY3Qgd2l0aCBhIGBUeXBlRXJyb3JgICh3aXRob3V0IGF0dGVtcHRpbmcgdG8gY2FuY2VsXG4gICAgICogdGhlIHN0cmVhbSkgaWYgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICAgICAqL1xuICAgIGFib3J0KHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignYWJvcnQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBhYm9ydCBhIHN0cmVhbSB0aGF0IGFscmVhZHkgaGFzIGEgd3JpdGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgc3RyZWFtLiBUaGUgdW5kZXJseWluZyBzaW5rIHdpbGwgZmluaXNoIHByb2Nlc3NpbmcgYW55IHByZXZpb3VzbHktd3JpdHRlbiBjaHVua3MsIGJlZm9yZSBpbnZva2luZyBpdHNcbiAgICAgKiBjbG9zZSBiZWhhdmlvci4gRHVyaW5nIHRoaXMgdGltZSBhbnkgZnVydGhlciBhdHRlbXB0cyB0byB3cml0ZSB3aWxsIGZhaWwgKHdpdGhvdXQgZXJyb3JpbmcgdGhlIHN0cmVhbSkuXG4gICAgICpcbiAgICAgKiBUaGUgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCBmdWxmaWxsIGlmIGFsbCByZW1haW5pbmcgY2h1bmtzIGFyZSBzdWNjZXNzZnVsbHkgd3JpdHRlbiBhbmQgdGhlIHN0cmVhbVxuICAgICAqIHN1Y2Nlc3NmdWxseSBjbG9zZXMsIG9yIHJlamVjdHMgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoaXMgcHJvY2Vzcy4gQWRkaXRpb25hbGx5LCBpdCB3aWxsIHJlamVjdCB3aXRoXG4gICAgICogYSBgVHlwZUVycm9yYCAod2l0aG91dCBhdHRlbXB0aW5nIHRvIGNhbmNlbCB0aGUgc3RyZWFtKSBpZiB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdjbG9zZScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXNXcml0YWJsZVN0cmVhbUxvY2tlZCh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSB3cml0ZXInKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2xvc2UgYW4gYWxyZWFkeS1jbG9zaW5nIHN0cmVhbScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1DbG9zZSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgfCB3cml0ZXJ9IGFuZCBsb2NrcyB0aGUgc3RyZWFtIHRvIHRoZSBuZXcgd3JpdGVyLiBXaGlsZSB0aGUgc3RyZWFtXG4gICAgICogaXMgbG9ja2VkLCBubyBvdGhlciB3cml0ZXIgY2FuIGJlIGFjcXVpcmVkIHVudGlsIHRoaXMgb25lIGlzIHJlbGVhc2VkLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBjcmVhdGluZyBhYnN0cmFjdGlvbnMgdGhhdCBkZXNpcmUgdGhlIGFiaWxpdHkgdG8gd3JpdGUgdG8gYSBzdHJlYW1cbiAgICAgKiB3aXRob3V0IGludGVycnVwdGlvbiBvciBpbnRlcmxlYXZpbmcuIEJ5IGdldHRpbmcgYSB3cml0ZXIgZm9yIHRoZSBzdHJlYW0sIHlvdSBjYW4gZW5zdXJlIG5vYm9keSBlbHNlIGNhbiB3cml0ZSBhdFxuICAgICAqIHRoZSBzYW1lIHRpbWUsIHdoaWNoIHdvdWxkIGNhdXNlIHRoZSByZXN1bHRpbmcgd3JpdHRlbiBkYXRhIHRvIGJlIHVucHJlZGljdGFibGUgYW5kIHByb2JhYmx5IHVzZWxlc3MuXG4gICAgICovXG4gICAgZ2V0V3JpdGVyKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMignZ2V0V3JpdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFjcXVpcmVXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGNsb3NlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBnZXRXcml0ZXI6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGxvY2tlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1dyaXRhYmxlU3RyZWFtJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW0uXG5mdW5jdGlvbiBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSkge1xuICAgIHJldHVybiBuZXcgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHN0cmVhbSk7XG59XG4vLyBUaHJvd3MgaWYgYW5kIG9ubHkgaWYgc3RhcnRBbGdvcml0aG0gdGhyb3dzLlxuZnVuY3Rpb24gQ3JlYXRlV3JpdGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmsgPSAxLCBzaXplQWxnb3JpdGhtID0gKCkgPT4gMSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlKTtcbiAgICBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0oc3RyZWFtKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xuICAgIHJldHVybiBzdHJlYW07XG59XG5mdW5jdGlvbiBJbml0aWFsaXplV3JpdGFibGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICd3cml0YWJsZSc7XG4gICAgLy8gVGhlIGVycm9yIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBieSBuZXcgbWV0aG9kIGNhbGxzIG9uY2UgdGhlIHN0YXRlIGJlY29tZXMgZXJyb3JlZC4gT25seSBzZXQgd2hlbiBbW3N0YXRlXV0gaXNcbiAgICAvLyAnZXJyb3JpbmcnIG9yICdlcnJvcmVkJy4gTWF5IGJlIHNldCB0byBhbiB1bmRlZmluZWQgdmFsdWUuXG4gICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW0uX3dyaXRlciA9IHVuZGVmaW5lZDtcbiAgICAvLyBJbml0aWFsaXplIHRvIHVuZGVmaW5lZCBmaXJzdCBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY29udHJvbGxlciBjaGVja3MgdGhpc1xuICAgIC8vIHZhcmlhYmxlIHRvIHZhbGlkYXRlIHRoZSBjYWxsZXIuXG4gICAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgLy8gVGhpcyBxdWV1ZSBpcyBwbGFjZWQgaGVyZSBpbnN0ZWFkIG9mIHRoZSB3cml0ZXIgY2xhc3MgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHBhc3NpbmcgYSB3cml0ZXIgdG8gdGhlIG5leHQgZGF0YVxuICAgIC8vIHByb2R1Y2VyIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHF1ZXVlZCB3cml0ZXMgdG8gZmluaXNoLlxuICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIC8vIFdyaXRlIHJlcXVlc3RzIGFyZSByZW1vdmVkIGZyb20gX3dyaXRlUmVxdWVzdHMgd2hlbiB3cml0ZSgpIGlzIGNhbGxlZCBvbiB0aGUgdW5kZXJseWluZyBzaW5rLiBUaGlzIHByZXZlbnRzXG4gICAgLy8gdGhlbSBmcm9tIGJlaW5nIGVycm9uZW91c2x5IHJlamVjdGVkIG9uIGVycm9yLiBJZiBhIHdyaXRlKCkgY2FsbCBpcyBpbi1mbGlnaHQsIHRoZSByZXF1ZXN0IGlzIHN0b3JlZCBoZXJlLlxuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHByb21pc2UgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB3cml0ZXIuY2xvc2UoKS4gU3RvcmVkIGhlcmUgYmVjYXVzZSBpdCBtYXkgYmUgZnVsZmlsbGVkIGFmdGVyIHRoZSB3cml0ZXJcbiAgICAvLyBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICBzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAvLyBDbG9zZSByZXF1ZXN0IGlzIHJlbW92ZWQgZnJvbSBfY2xvc2VSZXF1ZXN0IHdoZW4gY2xvc2UoKSBpcyBjYWxsZWQgb24gdGhlIHVuZGVybHlpbmcgc2luay4gVGhpcyBwcmV2ZW50cyBpdFxuICAgIC8vIGZyb20gYmVpbmcgZXJyb25lb3VzbHkgcmVqZWN0ZWQgb24gZXJyb3IuIElmIGEgY2xvc2UoKSBjYWxsIGlzIGluLWZsaWdodCwgdGhlIHJlcXVlc3QgaXMgc3RvcmVkIGhlcmUuXG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgcHJvbWlzZSB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHdyaXRlci5hYm9ydCgpLiBUaGlzIG1heSBhbHNvIGJlIGZ1bGZpbGxlZCBhZnRlciB0aGUgd3JpdGVyIGhhcyBkZXRhY2hlZC5cbiAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIGJhY2twcmVzc3VyZSBzaWduYWwgc2V0IGJ5IHRoZSBjb250cm9sbGVyLlxuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfd3JpdGFibGVTdHJlYW1Db250cm9sbGVyJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFdyaXRhYmxlU3RyZWFtO1xufVxuZnVuY3Rpb24gSXNXcml0YWJsZVN0cmVhbUxvY2tlZChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl93cml0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1BYm9ydChzdHJlYW0sIHJlYXNvbikge1xuICAgIHZhciBfYTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcgfHwgc3RyZWFtLl9zdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyLl9hYm9ydFJlYXNvbiA9IHJlYXNvbjtcbiAgICAoX2EgPSBzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlci5fYWJvcnRDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWJvcnQoKTtcbiAgICAvLyBUeXBlU2NyaXB0IG5hcnJvd3MgdGhlIHR5cGUgb2YgYHN0cmVhbS5fc3RhdGVgIGRvd24gdG8gJ3dyaXRhYmxlJyB8ICdlcnJvcmluZycsXG4gICAgLy8gYnV0IGl0IGRvZXNuJ3Qga25vdyB0aGF0IHNpZ25hbGluZyBhYm9ydCBydW5zIGF1dGhvciBjb2RlIHRoYXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZSBzdGF0ZS5cbiAgICAvLyBXaWRlbiB0aGUgdHlwZSBhZ2FpbiBieSBjYXN0aW5nIHRvIFdyaXRhYmxlU3RyZWFtU3RhdGUuXG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcgfHwgc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcHJvbWlzZTtcbiAgICB9XG4gICAgbGV0IHdhc0FscmVhZHlFcnJvcmluZyA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICB3YXNBbHJlYWR5RXJyb3JpbmcgPSB0cnVlO1xuICAgICAgICAvLyByZWFzb24gd2lsbCBub3QgYmUgdXNlZCwgc28gZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZSB0byBpdC5cbiAgICAgICAgcmVhc29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9wcm9taXNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgIF9yZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICAgIF9yZWFzb246IHJlYXNvbixcbiAgICAgICAgICAgIF93YXNBbHJlYWR5RXJyb3Jpbmc6IHdhc0FscmVhZHlFcnJvcmluZ1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdC5fcHJvbWlzZSA9IHByb21pc2U7XG4gICAgaWYgKCF3YXNBbHJlYWR5RXJyb3JpbmcpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgcmVhc29uKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUNsb3NlKHN0cmVhbSkge1xuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnIHx8IHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcihgVGhlIHN0cmVhbSAoaW4gJHtzdGF0ZX0gc3RhdGUpIGlzIG5vdCBpbiB0aGUgd3JpdGFibGUgc3RhdGUgYW5kIGNhbm5vdCBiZSBjbG9zZWRgKSk7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2xvc2VSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX3Jlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICBfcmVqZWN0OiByZWplY3RcbiAgICAgICAgfTtcbiAgICAgICAgc3RyZWFtLl9jbG9zZVJlcXVlc3QgPSBjbG9zZVJlcXVlc3Q7XG4gICAgfSk7XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkICYmIHN0cmVhbS5fYmFja3ByZXNzdXJlICYmIHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlKHdyaXRlcik7XG4gICAgfVxuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZShzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG4vLyBXcml0YWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUFkZFdyaXRlUmVxdWVzdChzdHJlYW0pIHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3UHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHdyaXRlUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9yZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgX3JlamVjdDogcmVqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cy5wdXNoKHdyaXRlUmVxdWVzdCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyhzdHJlYW0sIGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSk7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVN0YXJ0RXJyb3Jpbmcoc3RyZWFtLCByZWFzb24pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgc3RyZWFtLl9zdGF0ZSA9ICdlcnJvcmluZyc7XG4gICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pO1xuICAgIH1cbiAgICBpZiAoIVdyaXRhYmxlU3RyZWFtSGFzT3BlcmF0aW9uTWFya2VkSW5GbGlnaHQoc3RyZWFtKSAmJiBjb250cm9sbGVyLl9zdGFydGVkKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3Jpbmcoc3RyZWFtKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXJbRXJyb3JTdGVwc10oKTtcbiAgICBjb25zdCBzdG9yZWRFcnJvciA9IHN0cmVhbS5fc3RvcmVkRXJyb3I7XG4gICAgc3RyZWFtLl93cml0ZVJlcXVlc3RzLmZvckVhY2god3JpdGVSZXF1ZXN0ID0+IHtcbiAgICAgICAgd3JpdGVSZXF1ZXN0Ll9yZWplY3Qoc3RvcmVkRXJyb3IpO1xuICAgIH0pO1xuICAgIHN0cmVhbS5fd3JpdGVSZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIGlmIChzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWJvcnRSZXF1ZXN0ID0gc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0O1xuICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYWJvcnRSZXF1ZXN0Ll93YXNBbHJlYWR5RXJyb3JpbmcpIHtcbiAgICAgICAgYWJvcnRSZXF1ZXN0Ll9yZWplY3Qoc3RvcmVkRXJyb3IpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IHN0cmVhbS5fd3JpdGFibGVTdHJlYW1Db250cm9sbGVyW0Fib3J0U3RlcHNdKGFib3J0UmVxdWVzdC5fcmVhc29uKTtcbiAgICB1cG9uUHJvbWlzZShwcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIGFib3J0UmVxdWVzdC5fcmVzb2x2ZSgpO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgfSwgKHJlYXNvbikgPT4ge1xuICAgICAgICBhYm9ydFJlcXVlc3QuX3JlamVjdChyZWFzb24pO1xuICAgICAgICBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGUoc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdC5fcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QgPSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0V3JpdGVXaXRoRXJyb3Ioc3RyZWFtLCBlcnJvcikge1xuICAgIHN0cmVhbS5faW5GbGlnaHRXcml0ZVJlcXVlc3QuX3JlamVjdChlcnJvcik7XG4gICAgc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICBXcml0YWJsZVN0cmVhbURlYWxXaXRoUmVqZWN0aW9uKHN0cmVhbSwgZXJyb3IpO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodENsb3NlKHN0cmVhbSkge1xuICAgIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QuX3Jlc29sdmUodW5kZWZpbmVkKTtcbiAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgLy8gVGhlIGVycm9yIHdhcyB0b28gbGF0ZSB0byBkbyBhbnl0aGluZywgc28gaXQgaXMgaWdub3JlZC5cbiAgICAgICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QuX3Jlc29sdmUoKTtcbiAgICAgICAgICAgIHN0cmVhbS5fcGVuZGluZ0Fib3J0UmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdHJlYW0uX3N0YXRlID0gJ2Nsb3NlZCc7XG4gICAgY29uc3Qgd3JpdGVyID0gc3RyZWFtLl93cml0ZXI7XG4gICAgaWYgKHdyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh3cml0ZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZVdpdGhFcnJvcihzdHJlYW0sIGVycm9yKSB7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdC5fcmVqZWN0KGVycm9yKTtcbiAgICBzdHJlYW0uX2luRmxpZ2h0Q2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIC8vIE5ldmVyIGV4ZWN1dGUgc2luayBhYm9ydCgpIGFmdGVyIHNpbmsgY2xvc2UoKS5cbiAgICBpZiAoc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RyZWFtLl9wZW5kaW5nQWJvcnRSZXF1ZXN0Ll9yZWplY3QoZXJyb3IpO1xuICAgICAgICBzdHJlYW0uX3BlbmRpbmdBYm9ydFJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24oc3RyZWFtLCBlcnJvcik7XG59XG4vLyBUT0RPKHJpY2VhKTogRml4IGFscGhhYmV0aWNhbCBvcmRlci5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uX2Nsb3NlUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1IYXNPcGVyYXRpb25NYXJrZWRJbkZsaWdodChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLl9pbkZsaWdodFdyaXRlUmVxdWVzdCA9PT0gdW5kZWZpbmVkICYmIHN0cmVhbS5faW5GbGlnaHRDbG9zZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1NYXJrQ2xvc2VSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKSB7XG4gICAgc3RyZWFtLl9pbkZsaWdodENsb3NlUmVxdWVzdCA9IHN0cmVhbS5fY2xvc2VSZXF1ZXN0O1xuICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodChzdHJlYW0pIHtcbiAgICBzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ID0gc3RyZWFtLl93cml0ZVJlcXVlc3RzLnNoaWZ0KCk7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uX2Nsb3NlUmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0Ll9yZWplY3Qoc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIHN0cmVhbS5fY2xvc2VSZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0uX3dyaXRlcjtcbiAgICBpZiAod3JpdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3Qod3JpdGVyLCBzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSkge1xuICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS5fd3JpdGVyO1xuICAgIGlmICh3cml0ZXIgIT09IHVuZGVmaW5lZCAmJiBiYWNrcHJlc3N1cmUgIT09IHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIGlmIChiYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh3cml0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZSA9IGJhY2twcmVzc3VyZTtcbn1cbi8qKlxuICogQSBkZWZhdWx0IHdyaXRlciB2ZW5kZWQgYnkgYSB7QGxpbmsgV3JpdGFibGVTdHJlYW19LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChzdHJlYW0sIDEsICdXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXInKTtcbiAgICAgICAgYXNzZXJ0V3JpdGFibGVTdHJlYW0oc3RyZWFtLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXMgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGZvciBleGNsdXNpdmUgd3JpdGluZyBieSBhbm90aGVyIHdyaXRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHN0cmVhbS5fd3JpdGVyID0gdGhpcztcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgIGlmICghV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSAmJiBzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQodGhpcyk7XG4gICAgICAgICAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkRXJyb3IgPSBzdHJlYW0uX3N0b3JlZEVycm9yO1xuICAgICAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHRoaXMsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQodGhpcywgc3RvcmVkRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc3RyZWFtIGJlY29tZXMgY2xvc2VkLCBvciByZWplY3RlZCBpZiB0aGUgc3RyZWFtIGV2ZXIgZXJyb3JzIG9yXG4gICAgICogdGhlIHdyaXRlcuKAmXMgbG9jayBpcyByZWxlYXNlZCBiZWZvcmUgdGhlIHN0cmVhbSBmaW5pc2hlcyBjbG9zaW5nLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlc2lyZWQgc2l6ZSB0byBmaWxsIHRoZSBzdHJlYW3igJlzIGludGVybmFsIHF1ZXVlLiBJdCBjYW4gYmUgbmVnYXRpdmUsIGlmIHRoZSBxdWV1ZSBpcyBvdmVyLWZ1bGwuXG4gICAgICogQSBwcm9kdWNlciBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSByaWdodCBhbW91bnQgb2YgZGF0YSB0byB3cml0ZS5cbiAgICAgKlxuICAgICAqIEl0IHdpbGwgYmUgYG51bGxgIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSB3cml0dGVuIHRvIChkdWUgdG8gZWl0aGVyIGJlaW5nIGVycm9yZWQsIG9yIGhhdmluZyBhbiBhYm9ydFxuICAgICAqIHF1ZXVlZCB1cCkuIEl0IHdpbGwgcmV0dXJuIHplcm8gaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQuIEFuZCB0aGUgZ2V0dGVyIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGludm9rZWQgd2hlblxuICAgICAqIHRoZSB3cml0ZXLigJlzIGxvY2sgaXMgcmVsZWFzZWQuXG4gICAgICovXG4gICAgZ2V0IGRlc2lyZWRTaXplKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3duZXJXcml0YWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyTG9ja0V4Y2VwdGlvbignZGVzaXJlZFNpemUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgZGVzaXJlZCBzaXplIHRvIGZpbGwgdGhlIHN0cmVhbeKAmXMgaW50ZXJuYWwgcXVldWUgdHJhbnNpdGlvbnNcbiAgICAgKiBmcm9tIG5vbi1wb3NpdGl2ZSB0byBwb3NpdGl2ZSwgc2lnbmFsaW5nIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIGFwcGx5aW5nIGJhY2twcmVzc3VyZS4gT25jZSB0aGUgZGVzaXJlZCBzaXplIGRpcHNcbiAgICAgKiBiYWNrIHRvIHplcm8gb3IgYmVsb3csIHRoZSBnZXR0ZXIgd2lsbCByZXR1cm4gYSBuZXcgcHJvbWlzZSB0aGF0IHN0YXlzIHBlbmRpbmcgdW50aWwgdGhlIG5leHQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIElmIHRoZSBzdHJlYW0gYmVjb21lcyBlcnJvcmVkIG9yIGFib3J0ZWQsIG9yIHRoZSB3cml0ZXLigJlzIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmVjb21lXG4gICAgICogcmVqZWN0ZWQuXG4gICAgICovXG4gICAgZ2V0IHJlYWR5KCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVhZHknKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlYWRlciBpcyBhY3RpdmUsIGJlaGF2ZXMgdGhlIHNhbWUgYXMge0BsaW5rIFdyaXRhYmxlU3RyZWFtLmFib3J0IHwgc3RyZWFtLmFib3J0KHJlYXNvbil9LlxuICAgICAqL1xuICAgIGFib3J0KHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignYWJvcnQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ2Fib3J0JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJBYm9ydCh0aGlzLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVhZGVyIGlzIGFjdGl2ZSwgYmVoYXZlcyB0aGUgc2FtZSBhcyB7QGxpbmsgV3JpdGFibGVTdHJlYW0uY2xvc2UgfCBzdHJlYW0uY2xvc2UoKX0uXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdjbG9zZScpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCdjbG9zZScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignQ2Fubm90IGNsb3NlIGFuIGFscmVhZHktY2xvc2luZyBzdHJlYW0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgd3JpdGVy4oCZcyBsb2NrIG9uIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbS4gQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSB3cml0ZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS5cbiAgICAgKiBJZiB0aGUgYXNzb2NpYXRlZCBzdHJlYW0gaXMgZXJyb3JlZCB3aGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgd3JpdGVyIHdpbGwgYXBwZWFyIGVycm9yZWQgaW4gdGhlIHNhbWUgd2F5IGZyb21cbiAgICAgKiBub3cgb247IG90aGVyd2lzZSwgdGhlIHdyaXRlciB3aWxsIGFwcGVhciBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIGxvY2sgY2FuIHN0aWxsIGJlIHJlbGVhc2VkIGV2ZW4gaWYgc29tZSBvbmdvaW5nIHdyaXRlcyBoYXZlIG5vdCB5ZXQgZmluaXNoZWQgKGkuZS4gZXZlbiBpZiB0aGVcbiAgICAgKiBwcm9taXNlcyByZXR1cm5lZCBmcm9tIHByZXZpb3VzIGNhbGxzIHRvIHtAbGluayBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIud3JpdGUgfCB3cml0ZSgpfSBoYXZlIG5vdCB5ZXQgc2V0dGxlZCkuXG4gICAgICogSXTigJlzIG5vdCBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgbG9jayBvbiB0aGUgd3JpdGVyIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdyaXRlOyB0aGUgbG9jayBpbnN0ZWFkIHNpbXBseSBwcmV2ZW50c1xuICAgICAqIG90aGVyIHByb2R1Y2VycyBmcm9tIHdyaXRpbmcgaW4gYW4gaW50ZXJsZWF2ZWQgbWFubmVyLlxuICAgICAqL1xuICAgIHJlbGVhc2VMb2NrKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbigncmVsZWFzZUxvY2snKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHRoaXMpO1xuICAgIH1cbiAgICB3cml0ZShjaHVuayA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbignd3JpdGUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX293bmVyV3JpdGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoZGVmYXVsdFdyaXRlckxvY2tFeGNlcHRpb24oJ3dyaXRlIHRvJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh0aGlzLCBjaHVuayk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZSwge1xuICAgIGFib3J0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcmVsZWFzZUxvY2s6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHdyaXRlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBjbG9zZWQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGRlc2lyZWRTaXplOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICByZWFkeTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXInLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbi8vIEFic3RyYWN0IG9wZXJhdGlvbnMgZm9yIHRoZSBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIuXG5mdW5jdGlvbiBJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcih4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX293bmVyV3JpdGFibGVTdHJlYW0nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyO1xufVxuLy8gQSBjbGllbnQgb2YgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIG1heSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRvIGJ5cGFzcyBzdGF0ZSBjaGVjay5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckFib3J0KHdyaXRlciwgcmVhc29uKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KHN0cmVhbSwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHdyaXRlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICByZXR1cm4gV3JpdGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQ2xvc2VXaXRoRXJyb3JQcm9wYWdhdGlvbih3cml0ZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB3cml0ZXIuX293bmVyV3JpdGFibGVTdHJlYW07XG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pIHx8IHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlKHdyaXRlcik7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVDbG9zZWRQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCBlcnJvcikge1xuICAgIGlmICh3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgZXJyb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCBlcnJvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQod3JpdGVyLCBlcnJvcikge1xuICAgIGlmICh3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlamVjdCh3cml0ZXIsIGVycm9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCBlcnJvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUod3JpdGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtO1xuICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmVkJyB8fCBzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShzdHJlYW0uX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHdyaXRlcikge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICBjb25zdCByZWxlYXNlZEVycm9yID0gbmV3IFR5cGVFcnJvcihgV3JpdGVyIHdhcyByZWxlYXNlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHN0cmVhbSdzIGNsb3NlZG5lc3NgKTtcbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJFbnN1cmVSZWFkeVByb21pc2VSZWplY3RlZCh3cml0ZXIsIHJlbGVhc2VkRXJyb3IpO1xuICAgIC8vIFRoZSBzdGF0ZSB0cmFuc2l0aW9ucyB0byBcImVycm9yZWRcIiBiZWZvcmUgdGhlIHNpbmsgYWJvcnQoKSBtZXRob2QgcnVucywgYnV0IHRoZSB3cml0ZXIuY2xvc2VkIHByb21pc2UgaXMgbm90XG4gICAgLy8gcmVqZWN0ZWQgdW50aWwgYWZ0ZXJ3YXJkcy4gVGhpcyBtZWFucyB0aGF0IHNpbXBseSB0ZXN0aW5nIHN0YXRlIHdpbGwgbm90IHdvcmsuXG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlQ2xvc2VkUHJvbWlzZVJlamVjdGVkKHdyaXRlciwgcmVsZWFzZWRFcnJvcik7XG4gICAgc3RyZWFtLl93cml0ZXIgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyV3JpdGUod3JpdGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHN0cmVhbSA9IHdyaXRlci5fb3duZXJXcml0YWJsZVN0cmVhbTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgY29uc3QgY2h1bmtTaXplID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldENodW5rU2l6ZShjb250cm9sbGVyLCBjaHVuayk7XG4gICAgaWYgKHN0cmVhbSAhPT0gd3JpdGVyLl9vd25lcldyaXRhYmxlU3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKCd3cml0ZSB0bycpKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3N0YXRlO1xuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yZWQnKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbS5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICBpZiAoV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoc3RyZWFtKSB8fCBzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBjbG9zaW5nIG9yIGNsb3NlZCBhbmQgY2Fubm90IGJlIHdyaXR0ZW4gdG8nKSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gJ2Vycm9yaW5nJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IFdyaXRhYmxlU3RyZWFtQWRkV3JpdGVSZXF1ZXN0KHN0cmVhbSk7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuY29uc3QgY2xvc2VTZW50aW5lbCA9IHt9O1xuLyoqXG4gKiBBbGxvd3MgY29udHJvbCBvZiBhIHtAbGluayBXcml0YWJsZVN0cmVhbSB8IHdyaXRhYmxlIHN0cmVhbX0ncyBzdGF0ZSBhbmQgaW50ZXJuYWwgcXVldWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHdoaWNoIHdhcyBwYXNzZWQgdG8gYFdyaXRhYmxlU3RyZWFtLmFib3J0KHJlYXNvbilgIHdoZW4gdGhlIHN0cmVhbSB3YXMgYWJvcnRlZC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogIFRoaXMgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9zdHJlYW1zL3B1bGwvMTE3Ny5cbiAgICAgKiAgVXNlIHtAbGluayBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnNpZ25hbH0ncyBgcmVhc29uYCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGdldCBhYm9ydFJlYXNvbigpIHtcbiAgICAgICAgaWYgKCFJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQyKCdhYm9ydFJlYXNvbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hYm9ydFJlYXNvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYEFib3J0U2lnbmFsYCB0aGF0IGNhbiBiZSB1c2VkIHRvIGFib3J0IHRoZSBwZW5kaW5nIHdyaXRlIG9yIGNsb3NlIG9wZXJhdGlvbiB3aGVuIHRoZSBzdHJlYW0gaXMgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBnZXQgc2lnbmFsKCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIoJ3NpZ25hbCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hYm9ydENvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gT2xkZXIgYnJvd3NlcnMgb3Igb2xkZXIgTm9kZSB2ZXJzaW9ucyBtYXkgbm90IHN1cHBvcnQgYEFib3J0Q29udHJvbGxlcmAgb3IgYEFib3J0U2lnbmFsYC5cbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYnVuZGxlIGFuZCBzaGlwIGFuIGBBYm9ydENvbnRyb2xsZXJgIHBvbHlmaWxsIHRvZ2V0aGVyIHdpdGggb3VyIHBvbHlmaWxsLFxuICAgICAgICAgICAgLy8gc28gaW5zdGVhZCB3ZSBvbmx5IGltcGxlbWVudCBzdXBwb3J0IGZvciBgc2lnbmFsYCBpZiB3ZSBmaW5kIGEgZ2xvYmFsIGBBYm9ydENvbnRyb2xsZXJgIGNvbnN0cnVjdG9yLlxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjb250cm9sbGVkIHdyaXRhYmxlIHN0cmVhbSwgbWFraW5nIGFsbCBmdXR1cmUgaW50ZXJhY3Rpb25zIHdpdGggaXQgZmFpbCB3aXRoIHRoZSBnaXZlbiBlcnJvciBgZWAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyByYXJlbHkgdXNlZCwgc2luY2UgdXN1YWxseSBpdCBzdWZmaWNlcyB0byByZXR1cm4gYSByZWplY3RlZCBwcm9taXNlIGZyb20gb25lIG9mIHRoZSB1bmRlcmx5aW5nXG4gICAgICogc2luaydzIG1ldGhvZHMuIEhvd2V2ZXIsIGl0IGNhbiBiZSB1c2VmdWwgZm9yIHN1ZGRlbmx5IHNodXR0aW5nIGRvd24gYSBzdHJlYW0gaW4gcmVzcG9uc2UgdG8gYW4gZXZlbnQgb3V0c2lkZSB0aGVcbiAgICAgKiBub3JtYWwgbGlmZWN5Y2xlIG9mIGludGVyYWN0aW9ucyB3aXRoIHRoZSB1bmRlcmx5aW5nIHNpbmsuXG4gICAgICovXG4gICAgZXJyb3IoZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDIoJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0uX3N0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgIT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gaXMgY2xvc2VkLCBlcnJvcmVkIG9yIHdpbGwgYmUgc29vbi4gVGhlIHNpbmsgY2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsIGlmIGl0IGdldHMgYW4gZXJyb3IgaGVyZSwgc29cbiAgICAgICAgICAgIC8vIGp1c3QgdHJlYXQgaXQgYXMgYSBuby1vcC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgZSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbQWJvcnRTdGVwc10ocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2Fib3J0QWxnb3JpdGhtKHJlYXNvbik7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXModGhpcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbRXJyb3JTdGVwc10oKSB7XG4gICAgICAgIFJlc2V0UXVldWUodGhpcyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIHtcbiAgICBhYm9ydFJlYXNvbjogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgc2lnbmFsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBlcnJvcjogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcicsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBpbXBsZW1lbnRpbmcgaW50ZXJmYWNlIHJlcXVpcmVkIGJ5IHRoZSBXcml0YWJsZVN0cmVhbS5cbmZ1bmN0aW9uIElzV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih4KSB7XG4gICAgaWYgKCF0eXBlSXNPYmplY3QoeCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xufVxuZnVuY3Rpb24gU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHdyaXRlQWxnb3JpdGhtLCBjbG9zZUFsZ29yaXRobSwgYWJvcnRBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pIHtcbiAgICBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0gPSBzdHJlYW07XG4gICAgc3RyZWFtLl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIC8vIE5lZWQgdG8gc2V0IHRoZSBzbG90cyBzbyB0aGF0IHRoZSBhc3NlcnQgZG9lc24ndCBmaXJlLiBJbiB0aGUgc3BlYyB0aGUgc2xvdHMgYWxyZWFkeSBleGlzdCBpbXBsaWNpdGx5LlxuICAgIGNvbnRyb2xsZXIuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fYWJvcnRSZWFzb24gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fYWJvcnRDb250cm9sbGVyID0gY3JlYXRlQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHNpemVBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lIV00gPSBoaWdoV2F0ZXJNYXJrO1xuICAgIGNvbnRyb2xsZXIuX3dyaXRlQWxnb3JpdGhtID0gd3JpdGVBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fY2xvc2VBbGdvcml0aG0gPSBjbG9zZUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9hYm9ydEFsZ29yaXRobSA9IGFib3J0QWxnb3JpdGhtO1xuICAgIGNvbnN0IGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7XG4gICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpO1xuICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gc3RhcnRBbGdvcml0aG0oKTtcbiAgICBjb25zdCBzdGFydFByb21pc2UgPSBwcm9taXNlUmVzb2x2ZWRXaXRoKHN0YXJ0UmVzdWx0KTtcbiAgICB1cG9uUHJvbWlzZShzdGFydFByb21pc2UsICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9LCByID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24oc3RyZWFtLCByKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFNldFVwV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU2luayhzdHJlYW0sIHVuZGVybHlpbmdTaW5rLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBsZXQgd3JpdGVBbGdvcml0aG0gPSAoKSA9PiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgbGV0IGNsb3NlQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGxldCBhYm9ydEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBpZiAodW5kZXJseWluZ1Npbmsuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdTaW5rLnN0YXJ0KGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1Npbmsud3JpdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cml0ZUFsZ29yaXRobSA9IGNodW5rID0+IHVuZGVybHlpbmdTaW5rLndyaXRlKGNodW5rLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdTaW5rLmNsb3NlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xvc2VBbGdvcml0aG0gPSAoKSA9PiB1bmRlcmx5aW5nU2luay5jbG9zZSgpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1NpbmsuYWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhYm9ydEFsZ29yaXRobSA9IHJlYXNvbiA9PiB1bmRlcmx5aW5nU2luay5hYm9ydChyZWFzb24pO1xuICAgIH1cbiAgICBTZXRVcFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG59XG4vLyBDbGVhckFsZ29yaXRobXMgbWF5IGJlIGNhbGxlZCB0d2ljZS4gRXJyb3JpbmcgdGhlIHNhbWUgc3RyZWFtIGluIG11bHRpcGxlIHdheXMgd2lsbCBvZnRlbiByZXN1bHQgaW4gcmVkdW5kYW50IGNhbGxzLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fd3JpdGVBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fY2xvc2VBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fYWJvcnRBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCBjbG9zZVNlbnRpbmVsLCAwKTtcbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0Q2h1bmtTaXplKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobShjaHVuayk7XG4gICAgfVxuICAgIGNhdGNoIChjaHVua1NpemVFKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGNodW5rU2l6ZUUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcikge1xuICAgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneUhXTSAtIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplO1xufVxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpIHtcbiAgICB0cnkge1xuICAgICAgICBFbnF1ZXVlVmFsdWVXaXRoU2l6ZShjb250cm9sbGVyLCBjaHVuaywgY2h1bmtTaXplKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVucXVldWVFKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGVucXVldWVFKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgaWYgKCFXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodChzdHJlYW0pICYmIHN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgY29uc3QgYmFja3ByZXNzdXJlID0gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldEJhY2twcmVzc3VyZShjb250cm9sbGVyKTtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1VcGRhdGVCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpO1xuICAgIH1cbiAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQWR2YW5jZVF1ZXVlSWZOZWVkZWQoY29udHJvbGxlcik7XG59XG4vLyBBYnN0cmFjdCBvcGVyYXRpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgIGlmICghY29udHJvbGxlci5fc3RhcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJlYW0uX2luRmxpZ2h0V3JpdGVSZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JpbmcnKSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoRXJyb3Jpbmcoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29udHJvbGxlci5fcXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBQZWVrUXVldWVWYWx1ZShjb250cm9sbGVyKTtcbiAgICBpZiAodmFsdWUgPT09IGNsb3NlU2VudGluZWwpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclByb2Nlc3NDbG9zZShjb250cm9sbGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzV3JpdGUoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKGNvbnRyb2xsZXIsIGVycm9yKSB7XG4gICAgaWYgKGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRXcml0YWJsZVN0cmVhbS5fc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVycm9yKTtcbiAgICB9XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW07XG4gICAgV3JpdGFibGVTdHJlYW1NYXJrQ2xvc2VSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKTtcbiAgICBEZXF1ZXVlVmFsdWUoY29udHJvbGxlcik7XG4gICAgY29uc3Qgc2lua0Nsb3NlUHJvbWlzZSA9IGNvbnRyb2xsZXIuX2Nsb3NlQWxnb3JpdGhtKCk7XG4gICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICB1cG9uUHJvbWlzZShzaW5rQ2xvc2VQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZShzdHJlYW0pO1xuICAgIH0sIHJlYXNvbiA9PiB7XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRDbG9zZVdpdGhFcnJvcihzdHJlYW0sIHJlYXNvbik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc1dyaXRlKGNvbnRyb2xsZXIsIGNodW5rKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgIFdyaXRhYmxlU3RyZWFtTWFya0ZpcnN0V3JpdGVSZXF1ZXN0SW5GbGlnaHQoc3RyZWFtKTtcbiAgICBjb25zdCBzaW5rV3JpdGVQcm9taXNlID0gY29udHJvbGxlci5fd3JpdGVBbGdvcml0aG0oY2h1bmspO1xuICAgIHVwb25Qcm9taXNlKHNpbmtXcml0ZVByb21pc2UsICgpID0+IHtcbiAgICAgICAgV3JpdGFibGVTdHJlYW1GaW5pc2hJbkZsaWdodFdyaXRlKHN0cmVhbSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9zdGF0ZTtcbiAgICAgICAgRGVxdWV1ZVZhbHVlKGNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KHN0cmVhbSkgJiYgc3RhdGUgPT09ICd3cml0YWJsZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2twcmVzc3VyZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXRCYWNrcHJlc3N1cmUoY29udHJvbGxlcik7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZShzdHJlYW0sIGJhY2twcmVzc3VyZSk7XG4gICAgICAgIH1cbiAgICAgICAgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckFkdmFuY2VRdWV1ZUlmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgIH0sIHJlYXNvbiA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnd3JpdGFibGUnKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIFdyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvcihzdHJlYW0sIHJlYXNvbik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBkZXNpcmVkU2l6ZSA9IFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJHZXREZXNpcmVkU2l6ZShjb250cm9sbGVyKTtcbiAgICByZXR1cm4gZGVzaXJlZFNpemUgPD0gMDtcbn1cbi8vIEEgY2xpZW50IG9mIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIgbWF5IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdG8gYnlwYXNzIHN0YXRlIGNoZWNrLlxuZnVuY3Rpb24gV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVycm9yKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFdyaXRhYmxlU3RyZWFtO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgV3JpdGFibGVTdHJlYW1TdGFydEVycm9yaW5nKHN0cmVhbSwgZXJyb3IpO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtLlxuZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFdyaXRhYmxlU3RyZWFtYCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5cbmZ1bmN0aW9uIGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQyKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcmApO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlci5cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLnByb3RvdHlwZS4ke25hbWV9IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJgKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQ2Fubm90ICcgKyBuYW1lICsgJyBhIHN0cmVhbSB1c2luZyBhIHJlbGVhc2VkIHdyaXRlcicpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHdyaXRlcikge1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZVN0YXRlID0gJ3BlbmRpbmcnO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpO1xuICAgIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVqZWN0KHdyaXRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQod3JpdGVyKSB7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNvbHZlKHdyaXRlcik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlamVjdCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGlmICh3cml0ZXIuX2Nsb3NlZFByb21pc2VfcmVqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHdyaXRlci5fY2xvc2VkUHJvbWlzZSk7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdChyZWFzb24pO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZWplY3QgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlU3RhdGUgPSAncmVqZWN0ZWQnO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZXNldFRvUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHtcbiAgICBkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkKHdyaXRlciwgcmVhc29uKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSh3cml0ZXIpIHtcbiAgICBpZiAod3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHdyaXRlci5fY2xvc2VkUHJvbWlzZV9yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9jbG9zZWRQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX2Nsb3NlZFByb21pc2VTdGF0ZSA9ICdyZXNvbHZlZCc7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpIHtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZSA9IG5ld1Byb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAncGVuZGluZyc7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQod3JpdGVyLCByZWFzb24pIHtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpO1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZUluaXRpYWxpemVBc1Jlc29sdmVkKHdyaXRlcikge1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplKHdyaXRlcik7XG4gICAgZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc29sdmUod3JpdGVyKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3Qod3JpdGVyLCByZWFzb24pIHtcbiAgICBpZiAod3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRQcm9taXNlSXNIYW5kbGVkVG9UcnVlKHdyaXRlci5fcmVhZHlQcm9taXNlKTtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZWplY3QocmVhc29uKTtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3JlamVjdCA9IHVuZGVmaW5lZDtcbiAgICB3cml0ZXIuX3JlYWR5UHJvbWlzZVN0YXRlID0gJ3JlamVjdGVkJztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNldCh3cml0ZXIpIHtcbiAgICBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZSh3cml0ZXIpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0VG9SZWplY3RlZCh3cml0ZXIsIHJlYXNvbikge1xuICAgIGRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplQXNSZWplY3RlZCh3cml0ZXIsIHJlYXNvbik7XG59XG5mdW5jdGlvbiBkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzb2x2ZSh3cml0ZXIpIHtcbiAgICBpZiAod3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlX3Jlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgd3JpdGVyLl9yZWFkeVByb21pc2VfcmVqZWN0ID0gdW5kZWZpbmVkO1xuICAgIHdyaXRlci5fcmVhZHlQcm9taXNlU3RhdGUgPSAnZnVsZmlsbGVkJztcbn1cblxuLy8vIDxyZWZlcmVuY2UgbGliPVwiZG9tXCIgLz5cbmNvbnN0IE5hdGl2ZURPTUV4Y2VwdGlvbiA9IHR5cGVvZiBET01FeGNlcHRpb24gIT09ICd1bmRlZmluZWQnID8gRE9NRXhjZXB0aW9uIDogdW5kZWZpbmVkO1xuXG4vLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuZnVuY3Rpb24gaXNET01FeGNlcHRpb25Db25zdHJ1Y3RvcihjdG9yKSB7XG4gICAgaWYgKCEodHlwZW9mIGN0b3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGN0b3IgPT09ICdvYmplY3QnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIG5ldyBjdG9yKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBjb25zdCBjdG9yID0gZnVuY3Rpb24gRE9NRXhjZXB0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnJztcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZSB8fCAnRXJyb3InO1xuICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3Rvci5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIHsgdmFsdWU6IGN0b3IsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgcmV0dXJuIGN0b3I7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5jb25zdCBET01FeGNlcHRpb24kMSA9IGlzRE9NRXhjZXB0aW9uQ29uc3RydWN0b3IoTmF0aXZlRE9NRXhjZXB0aW9uKSA/IE5hdGl2ZURPTUV4Y2VwdGlvbiA6IGNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsKCk7XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtUGlwZVRvKHNvdXJjZSwgZGVzdCwgcHJldmVudENsb3NlLCBwcmV2ZW50QWJvcnQsIHByZXZlbnRDYW5jZWwsIHNpZ25hbCkge1xuICAgIGNvbnN0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc291cmNlKTtcbiAgICBjb25zdCB3cml0ZXIgPSBBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyKGRlc3QpO1xuICAgIHNvdXJjZS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gICAgLy8gVGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHNwZWMncyByZXF1aXJlbWVudCB0aGF0IHdlIHdhaXQgZm9yIG9uZ29pbmcgd3JpdGVzIGR1cmluZyBzaHV0ZG93bi5cbiAgICBsZXQgY3VycmVudFdyaXRlID0gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIHJldHVybiBuZXdQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IGFib3J0QWxnb3JpdGhtO1xuICAgICAgICBpZiAoc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFib3J0QWxnb3JpdGhtID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IERPTUV4Y2VwdGlvbiQxKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2ZW50QWJvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0Ll9zdGF0ZSA9PT0gJ3dyaXRhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXcml0YWJsZVN0cmVhbUFib3J0KGRlc3QsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuX3N0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHNvdXJjZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbigoKSA9PiBQcm9taXNlLmFsbChhY3Rpb25zLm1hcChhY3Rpb24gPT4gYWN0aW9uKCkpKSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGFib3J0QWxnb3JpdGhtKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbGdvcml0aG0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzaW5nIHJlYWRlciBhbmQgd3JpdGVyLCByZWFkIGFsbCBjaHVua3MgZnJvbSB0aGlzIGFuZCB3cml0ZSB0aGVtIHRvIGRlc3RcbiAgICAgICAgLy8gLSBCYWNrcHJlc3N1cmUgbXVzdCBiZSBlbmZvcmNlZFxuICAgICAgICAvLyAtIFNodXRkb3duIG11c3Qgc3RvcCBhbGwgYWN0aXZpdHlcbiAgICAgICAgZnVuY3Rpb24gcGlwZUxvb3AoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvbWlzZSgocmVzb2x2ZUxvb3AsIHJlamVjdExvb3ApID0+IHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuZXh0KGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVMb29wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYFBlcmZvcm1Qcm9taXNlVGhlbmAgaW5zdGVhZCBvZiBgdXBvblByb21pc2VgIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdW5uZWNlc3NhcnkgYC5jYXRjaChyZXRocm93QXNzZXJ0aW9uRXJyb3JSZWplY3Rpb24pYCBoYW5kbGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybVByb21pc2VUaGVuKHBpcGVTdGVwKCksIG5leHQsIHJlamVjdExvb3ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcGlwZVN0ZXAoKSB7XG4gICAgICAgICAgICBpZiAoc2h1dHRpbmdEb3duKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUGVyZm9ybVByb21pc2VUaGVuKHdyaXRlci5fcmVhZHlQcm9taXNlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Byb21pc2UoKHJlc29sdmVSZWFkLCByZWplY3RSZWFkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY2h1bmtTdGVwczogY2h1bmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXcml0ZSA9IFBlcmZvcm1Qcm9taXNlVGhlbihXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSh3cml0ZXIsIGNodW5rKSwgdW5kZWZpbmVkLCBub29wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUmVhZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHJlc29sdmVSZWFkKHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgX2Vycm9yU3RlcHM6IHJlamVjdFJlYWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFcnJvcnMgbXVzdCBiZSBwcm9wYWdhdGVkIGZvcndhcmRcbiAgICAgICAgaXNPckJlY29tZXNFcnJvcmVkKHNvdXJjZSwgcmVhZGVyLl9jbG9zZWRQcm9taXNlLCBzdG9yZWRFcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoIXByZXZlbnRBYm9ydCkge1xuICAgICAgICAgICAgICAgIHNodXRkb3duV2l0aEFjdGlvbigoKSA9PiBXcml0YWJsZVN0cmVhbUFib3J0KGRlc3QsIHN0b3JlZEVycm9yKSwgdHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgc3RvcmVkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRXJyb3JzIG11c3QgYmUgcHJvcGFnYXRlZCBiYWNrd2FyZFxuICAgICAgICBpc09yQmVjb21lc0Vycm9yZWQoZGVzdCwgd3JpdGVyLl9jbG9zZWRQcm9taXNlLCBzdG9yZWRFcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoIXByZXZlbnRDYW5jZWwpIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bldpdGhBY3Rpb24oKCkgPT4gUmVhZGFibGVTdHJlYW1DYW5jZWwoc291cmNlLCBzdG9yZWRFcnJvciksIHRydWUsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNodXRkb3duKHRydWUsIHN0b3JlZEVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENsb3NpbmcgbXVzdCBiZSBwcm9wYWdhdGVkIGZvcndhcmRcbiAgICAgICAgaXNPckJlY29tZXNDbG9zZWQoc291cmNlLCByZWFkZXIuX2Nsb3NlZFByb21pc2UsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghcHJldmVudENsb3NlKSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckNsb3NlV2l0aEVycm9yUHJvcGFnYXRpb24od3JpdGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaHV0ZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ2xvc2luZyBtdXN0IGJlIHByb3BhZ2F0ZWQgYmFja3dhcmRcbiAgICAgICAgaWYgKFdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpIHx8IGRlc3QuX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgY29uc3QgZGVzdENsb3NlZCA9IG5ldyBUeXBlRXJyb3IoJ3RoZSBkZXN0aW5hdGlvbiB3cml0YWJsZSBzdHJlYW0gY2xvc2VkIGJlZm9yZSBhbGwgZGF0YSBjb3VsZCBiZSBwaXBlZCB0byBpdCcpO1xuICAgICAgICAgICAgaWYgKCFwcmV2ZW50Q2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd25XaXRoQWN0aW9uKCgpID0+IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHNvdXJjZSwgZGVzdENsb3NlZCksIHRydWUsIGRlc3RDbG9zZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2h1dGRvd24odHJ1ZSwgZGVzdENsb3NlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwaXBlTG9vcCgpKTtcbiAgICAgICAgZnVuY3Rpb24gd2FpdEZvcldyaXRlc1RvRmluaXNoKCkge1xuICAgICAgICAgICAgLy8gQW5vdGhlciB3cml0ZSBtYXkgaGF2ZSBzdGFydGVkIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBvbiB0aGlzIGN1cnJlbnRXcml0ZSwgc28gd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHdhaXRcbiAgICAgICAgICAgIC8vIGZvciB0aGF0IHRvby5cbiAgICAgICAgICAgIGNvbnN0IG9sZEN1cnJlbnRXcml0ZSA9IGN1cnJlbnRXcml0ZTtcbiAgICAgICAgICAgIHJldHVybiBQZXJmb3JtUHJvbWlzZVRoZW4oY3VycmVudFdyaXRlLCAoKSA9PiBvbGRDdXJyZW50V3JpdGUgIT09IGN1cnJlbnRXcml0ZSA/IHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc09yQmVjb21lc0Vycm9yZWQoc3RyZWFtLCBwcm9taXNlLCBhY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24oc3RyZWFtLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cG9uUmVqZWN0aW9uKHByb21pc2UsIGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNPckJlY29tZXNDbG9zZWQoc3RyZWFtLCBwcm9taXNlLCBhY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uX3N0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgICAgIGFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBvbkZ1bGZpbGxtZW50KHByb21pc2UsIGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2h1dGRvd25XaXRoQWN0aW9uKGFjdGlvbiwgb3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICBpZiAoc2h1dHRpbmdEb3duKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChkZXN0Ll9zdGF0ZSA9PT0gJ3dyaXRhYmxlJyAmJiAhV3JpdGFibGVTdHJlYW1DbG9zZVF1ZXVlZE9ySW5GbGlnaHQoZGVzdCkpIHtcbiAgICAgICAgICAgICAgICB1cG9uRnVsZmlsbG1lbnQod2FpdEZvcldyaXRlc1RvRmluaXNoKCksIGRvVGhlUmVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb1RoZVJlc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGRvVGhlUmVzdCgpIHtcbiAgICAgICAgICAgICAgICB1cG9uUHJvbWlzZShhY3Rpb24oKSwgKCkgPT4gZmluYWxpemUob3JpZ2luYWxJc0Vycm9yLCBvcmlnaW5hbEVycm9yKSwgbmV3RXJyb3IgPT4gZmluYWxpemUodHJ1ZSwgbmV3RXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzaHV0ZG93bihpc0Vycm9yLCBlcnJvcikge1xuICAgICAgICAgICAgaWYgKHNodXR0aW5nRG93bikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZGVzdC5fc3RhdGUgPT09ICd3cml0YWJsZScgJiYgIVdyaXRhYmxlU3RyZWFtQ2xvc2VRdWV1ZWRPckluRmxpZ2h0KGRlc3QpKSB7XG4gICAgICAgICAgICAgICAgdXBvbkZ1bGZpbGxtZW50KHdhaXRGb3JXcml0ZXNUb0ZpbmlzaCgpLCAoKSA9PiBmaW5hbGl6ZShpc0Vycm9yLCBlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluYWxpemUoaXNFcnJvciwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZpbmFsaXplKGlzRXJyb3IsIGVycm9yKSB7XG4gICAgICAgICAgICBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJSZWxlYXNlKHdyaXRlcik7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICBpZiAoc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFsZ29yaXRobSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNFcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBbGxvd3MgY29udHJvbCBvZiBhIHtAbGluayBSZWFkYWJsZVN0cmVhbSB8IHJlYWRhYmxlIHN0cmVhbX0ncyBzdGF0ZSBhbmQgaW50ZXJuYWwgcXVldWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5jbGFzcyBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgY29udHJvbGxlZCBzdHJlYW0ncyBpbnRlcm5hbCBxdWV1ZS4gSXQgY2FuIGJlIG5lZ2F0aXZlLCBpZiB0aGUgcXVldWUgaXNcbiAgICAgKiBvdmVyLWZ1bGwuIEFuIHVuZGVybHlpbmcgc291cmNlIG91Z2h0IHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB3aGVuIGFuZCBob3cgdG8gYXBwbHkgYmFja3ByZXNzdXJlLlxuICAgICAqL1xuICAgIGdldCBkZXNpcmVkU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29udHJvbGxlZCByZWFkYWJsZSBzdHJlYW0uIENvbnN1bWVycyB3aWxsIHN0aWxsIGJlIGFibGUgdG8gcmVhZCBhbnkgcHJldmlvdXNseS1lbnF1ZXVlZCBjaHVua3MgZnJvbVxuICAgICAqIHRoZSBzdHJlYW0sIGJ1dCBvbmNlIHRob3NlIGFyZSByZWFkLCB0aGUgc3RyZWFtIHdpbGwgYmVjb21lIGNsb3NlZC5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdjbG9zZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc3RyZWFtIGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgcGVybWl0cyBjbG9zZScpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbG9zZSh0aGlzKTtcbiAgICB9XG4gICAgZW5xdWV1ZShjaHVuayA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEoJ2VucXVldWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYW5DbG9zZU9yRW5xdWV1ZSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVycm9ycyB0aGUgY29udHJvbGxlZCByZWFkYWJsZSBzdHJlYW0sIG1ha2luZyBhbGwgZnV0dXJlIGludGVyYWN0aW9ucyB3aXRoIGl0IGZhaWwgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgYGVgLlxuICAgICAqL1xuICAgIGVycm9yKGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcih0aGlzLCBlKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtDYW5jZWxTdGVwc10ocmVhc29uKSB7XG4gICAgICAgIFJlc2V0UXVldWUodGhpcyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NhbmNlbEFsZ29yaXRobShyZWFzb24pO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xlYXJBbGdvcml0aG1zKHRoaXMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgW1B1bGxTdGVwc10ocmVhZFJlcXVlc3QpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgICAgICBpZiAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBEZXF1ZXVlVmFsdWUodGhpcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VSZXF1ZXN0ZWQgJiYgdGhpcy5fcXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyh0aGlzKTtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbUNsb3NlKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9jaHVua1N0ZXBzKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3Qoc3RyZWFtLCByZWFkUmVxdWVzdCk7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgY2xvc2U6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVucXVldWU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGVycm9yOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBkZXNpcmVkU2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiAnUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcicsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG5mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb250cm9sbGVkUmVhZGFibGVTdHJlYW0nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzaG91bGRQdWxsID0gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpO1xuICAgIGlmICghc2hvdWxkUHVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb250cm9sbGVyLl9wdWxsaW5nKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3B1bGxBZ2FpbiA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IHRydWU7XG4gICAgY29uc3QgcHVsbFByb21pc2UgPSBjb250cm9sbGVyLl9wdWxsQWxnb3JpdGhtKCk7XG4gICAgdXBvblByb21pc2UocHVsbFByb21pc2UsICgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoY29udHJvbGxlci5fcHVsbEFnYWluKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLl9wdWxsQWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgfSwgZSA9PiB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJTaG91bGRDYWxsUHVsbChjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFjb250cm9sbGVyLl9zdGFydGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKElzUmVhZGFibGVTdHJlYW1Mb2NrZWQoc3RyZWFtKSAmJiBSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyhzdHJlYW0pID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZGVzaXJlZFNpemUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUoY29udHJvbGxlcik7XG4gICAgaWYgKGRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5fcHVsbEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9jYW5jZWxBbGdvcml0aG0gPSB1bmRlZmluZWQ7XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lTaXplQWxnb3JpdGhtID0gdW5kZWZpbmVkO1xufVxuLy8gQSBjbGllbnQgb2YgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlciBtYXkgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0byBieXBhc3Mgc3RhdGUgY2hlY2suXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoY29udHJvbGxlcikge1xuICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICBpZiAoY29udHJvbGxlci5fcXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQ2xvc2Uoc3RyZWFtKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKGNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtO1xuICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkgJiYgUmVhZGFibGVTdHJlYW1HZXROdW1SZWFkUmVxdWVzdHMoc3RyZWFtKSA+IDApIHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1GdWxmaWxsUmVhZFJlcXVlc3Qoc3RyZWFtLCBjaHVuaywgZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNodW5rU2l6ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNodW5rU2l6ZSA9IGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGNodW5rU2l6ZUUpIHtcbiAgICAgICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBjaHVua1NpemVFKTtcbiAgICAgICAgICAgIHRocm93IGNodW5rU2l6ZUU7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIEVucXVldWVWYWx1ZVdpdGhTaXplKGNvbnRyb2xsZXIsIGNodW5rLCBjaHVua1NpemUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlbnF1ZXVlRSkge1xuICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGVucXVldWVFKTtcbiAgICAgICAgICAgIHRocm93IGVucXVldWVFO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDYWxsUHVsbElmTmVlZGVkKGNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIGUpIHtcbiAgICBjb25zdCBzdHJlYW0gPSBjb250cm9sbGVyLl9jb250cm9sbGVkUmVhZGFibGVTdHJlYW07XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgIT09ICdyZWFkYWJsZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBSZXNldFF1ZXVlKGNvbnRyb2xsZXIpO1xuICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcik7XG4gICAgUmVhZGFibGVTdHJlYW1FcnJvcihzdHJlYW0sIGUpO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplKGNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRSZWFkYWJsZVN0cmVhbS5fc3RhdGU7XG4gICAgaWYgKHN0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLl9zdHJhdGVneUhXTSAtIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplO1xufVxuLy8gVGhpcyBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUcmFuc2Zvcm1TdHJlYW0uXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVySGFzQmFja3ByZXNzdXJlKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlclNob3VsZENhbGxQdWxsKGNvbnRyb2xsZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtLl9zdGF0ZTtcbiAgICBpZiAoIWNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkICYmIHN0YXRlID09PSAncmVhZGFibGUnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCBzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsQWxnb3JpdGhtLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7XG4gICAgY29udHJvbGxlci5fY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtID0gc3RyZWFtO1xuICAgIGNvbnRyb2xsZXIuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIGNvbnRyb2xsZXIuX3F1ZXVlVG90YWxTaXplID0gdW5kZWZpbmVkO1xuICAgIFJlc2V0UXVldWUoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5fc3RhcnRlZCA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX2Nsb3NlUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fcHVsbEFnYWluID0gZmFsc2U7XG4gICAgY29udHJvbGxlci5fcHVsbGluZyA9IGZhbHNlO1xuICAgIGNvbnRyb2xsZXIuX3N0cmF0ZWd5U2l6ZUFsZ29yaXRobSA9IHNpemVBbGdvcml0aG07XG4gICAgY29udHJvbGxlci5fc3RyYXRlZ3lIV00gPSBoaWdoV2F0ZXJNYXJrO1xuICAgIGNvbnRyb2xsZXIuX3B1bGxBbGdvcml0aG0gPSBwdWxsQWxnb3JpdGhtO1xuICAgIGNvbnRyb2xsZXIuX2NhbmNlbEFsZ29yaXRobSA9IGNhbmNlbEFsZ29yaXRobTtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBzdGFydEFsZ29yaXRobSgpO1xuICAgIHVwb25Qcm9taXNlKHByb21pc2VSZXNvbHZlZFdpdGgoc3RhcnRSZXN1bHQpLCAoKSA9PiB7XG4gICAgICAgIGNvbnRyb2xsZXIuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZChjb250cm9sbGVyKTtcbiAgICB9LCByID0+IHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGNvbnRyb2xsZXIsIHIpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2Uoc3RyZWFtLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrLCBzaXplQWxnb3JpdGhtKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUpO1xuICAgIGxldCBzdGFydEFsZ29yaXRobSA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBsZXQgcHVsbEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBsZXQgY2FuY2VsQWxnb3JpdGhtID0gKCkgPT4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIGlmICh1bmRlcmx5aW5nU291cmNlLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRBbGdvcml0aG0gPSAoKSA9PiB1bmRlcmx5aW5nU291cmNlLnN0YXJ0KGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBpZiAodW5kZXJseWluZ1NvdXJjZS5wdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHVsbEFsZ29yaXRobSA9ICgpID0+IHVuZGVybHlpbmdTb3VyY2UucHVsbChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHVuZGVybHlpbmdTb3VyY2UuY2FuY2VsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FuY2VsQWxnb3JpdGhtID0gcmVhc29uID0+IHVuZGVybHlpbmdTb3VyY2UuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIFNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmssIHNpemVBbGdvcml0aG0pO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIuXG5mdW5jdGlvbiBkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMShuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJgKTtcbn1cblxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1UZWUoc3RyZWFtLCBjbG9uZUZvckJyYW5jaDIpIHtcbiAgICBpZiAoSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKSkge1xuICAgICAgICByZXR1cm4gUmVhZGFibGVCeXRlU3RyZWFtVGVlKHN0cmVhbSk7XG4gICAgfVxuICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRUZWUoc3RyZWFtKTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFRlZShzdHJlYW0sIGNsb25lRm9yQnJhbmNoMikge1xuICAgIGNvbnN0IHJlYWRlciA9IEFjcXVpcmVSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIoc3RyZWFtKTtcbiAgICBsZXQgcmVhZGluZyA9IGZhbHNlO1xuICAgIGxldCByZWFkQWdhaW4gPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsZWQxID0gZmFsc2U7XG4gICAgbGV0IGNhbmNlbGVkMiA9IGZhbHNlO1xuICAgIGxldCByZWFzb24xO1xuICAgIGxldCByZWFzb24yO1xuICAgIGxldCBicmFuY2gxO1xuICAgIGxldCBicmFuY2gyO1xuICAgIGxldCByZXNvbHZlQ2FuY2VsUHJvbWlzZTtcbiAgICBjb25zdCBjYW5jZWxQcm9taXNlID0gbmV3UHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIHB1bGxBbGdvcml0aG0oKSB7XG4gICAgICAgIGlmIChyZWFkaW5nKSB7XG4gICAgICAgICAgICByZWFkQWdhaW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVhZFJlcXVlc3QgPSB7XG4gICAgICAgICAgICBfY2h1bmtTdGVwczogY2h1bmsgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZGVsYXllZCBhIG1pY3JvdGFzayBiZWNhdXNlIGl0IHRha2VzIGF0IGxlYXN0IGEgbWljcm90YXNrIHRvIGRldGVjdCBlcnJvcnMgKHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gcmVhZGVyLl9jbG9zZWRQcm9taXNlIGJlbG93KSwgYW5kIHdlIHdhbnQgZXJyb3JzIGluIHN0cmVhbSB0byBlcnJvciBib3RoIGJyYW5jaGVzIGltbWVkaWF0ZWx5LiBXZSBjYW5ub3QgbGV0XG4gICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSByZWFkcyBnZXQgYWhlYWQgb2YgYXN5bmNocm9ub3VzbHktYXZhaWxhYmxlIGVycm9ycy5cbiAgICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuazEgPSBjaHVuaztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsyID0gY2h1bms7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBhY2Nlc3MgdGhlIGNsb25pbmcgY29kZSByaWdodCBub3cgaW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWRkIG9uZSB0aGVuIHdlJ2xsIG5lZWQgYW4gaW1wbGVtZW50YXRpb24gZm9yIHNlcmlhbGl6YWJsZSBvYmplY3RzLlxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWNhbmNlbGVkMiAmJiBjbG9uZUZvckJyYW5jaDIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICBjaHVuazIgPSBTdHJ1Y3R1cmVkRGVzZXJpYWxpemUoU3RydWN0dXJlZFNlcmlhbGl6ZShjaHVuazIpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNodW5rMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFnYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdWxsQWxnb3JpdGhtKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfY2xvc2VTdGVwczogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQxIHx8ICFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyLCByZWFkUmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbDFBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIGNhbmNlbGVkMSA9IHRydWU7XG4gICAgICAgIHJlYXNvbjEgPSByZWFzb247XG4gICAgICAgIGlmIChjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVJlYXNvbiA9IENyZWF0ZUFycmF5RnJvbUxpc3QoW3JlYXNvbjEsIHJlYXNvbjJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKGNhbmNlbFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbDJBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIGNhbmNlbGVkMiA9IHRydWU7XG4gICAgICAgIHJlYXNvbjIgPSByZWFzb247XG4gICAgICAgIGlmIChjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVJlYXNvbiA9IENyZWF0ZUFycmF5RnJvbUxpc3QoW3JlYXNvbjEsIHJlYXNvbjJdKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbFJlc3VsdCA9IFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY29tcG9zaXRlUmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKGNhbmNlbFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbFByb21pc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGJyYW5jaDEgPSBDcmVhdGVSZWFkYWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbEFsZ29yaXRobSwgY2FuY2VsMUFsZ29yaXRobSk7XG4gICAgYnJhbmNoMiA9IENyZWF0ZVJlYWRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWwyQWxnb3JpdGhtKTtcbiAgICB1cG9uUmVqZWN0aW9uKHJlYWRlci5fY2xvc2VkUHJvbWlzZSwgKHIpID0+IHtcbiAgICAgICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgcik7XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICBpZiAoIWNhbmNlbGVkMSB8fCAhY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFticmFuY2gxLCBicmFuY2gyXTtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlQnl0ZVN0cmVhbVRlZShzdHJlYW0pIHtcbiAgICBsZXQgcmVhZGVyID0gQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihzdHJlYW0pO1xuICAgIGxldCByZWFkaW5nID0gZmFsc2U7XG4gICAgbGV0IHJlYWRBZ2FpbkZvckJyYW5jaDEgPSBmYWxzZTtcbiAgICBsZXQgcmVhZEFnYWluRm9yQnJhbmNoMiA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWxlZDEgPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsZWQyID0gZmFsc2U7XG4gICAgbGV0IHJlYXNvbjE7XG4gICAgbGV0IHJlYXNvbjI7XG4gICAgbGV0IGJyYW5jaDE7XG4gICAgbGV0IGJyYW5jaDI7XG4gICAgbGV0IHJlc29sdmVDYW5jZWxQcm9taXNlO1xuICAgIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXdQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gZm9yd2FyZFJlYWRlckVycm9yKHRoaXNSZWFkZXIpIHtcbiAgICAgICAgdXBvblJlamVjdGlvbih0aGlzUmVhZGVyLl9jbG9zZWRQcm9taXNlLCByID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzUmVhZGVyICE9PSByZWFkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCByKTtcbiAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIHIpO1xuICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEgfHwgIWNhbmNlbGVkMikge1xuICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsV2l0aERlZmF1bHRSZWFkZXIoKSB7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHN0cmVhbSk7XG4gICAgICAgICAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWFkUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIF9jaHVua1N0ZXBzOiBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBkZWxheWVkIGEgbWljcm90YXNrIGJlY2F1c2UgaXQgdGFrZXMgYXQgbGVhc3QgYSBtaWNyb3Rhc2sgdG8gZGV0ZWN0IGVycm9ycyAodXNpbmdcbiAgICAgICAgICAgICAgICAvLyByZWFkZXIuX2Nsb3NlZFByb21pc2UgYmVsb3cpLCBhbmQgd2Ugd2FudCBlcnJvcnMgaW4gc3RyZWFtIHRvIGVycm9yIGJvdGggYnJhbmNoZXMgaW1tZWRpYXRlbHkuIFdlIGNhbm5vdCBsZXRcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHN5bmNocm9ub3VzbHktYXZhaWxhYmxlIHJlYWRzIGdldCBhaGVhZCBvZiBhc3luY2hyb25vdXNseS1hdmFpbGFibGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZEFnYWluRm9yQnJhbmNoMSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZWFkQWdhaW5Gb3JCcmFuY2gyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rMSA9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmsyID0gY2h1bms7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQxICYmICFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsyID0gQ2xvbmVBc1VpbnQ4QXJyYXkoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGNsb25lRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihicmFuY2gxLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNsb25lRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNsb25lRSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuazEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRW5xdWV1ZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIsIGNodW5rMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFnYWluRm9yQnJhbmNoMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVsbDFBbGdvcml0aG0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWFkQWdhaW5Gb3JCcmFuY2gyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdWxsMkFsZ29yaXRobSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZDEpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsb3NlKGJyYW5jaDEuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLl9wZW5kaW5nUHVsbEludG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlci5fcGVuZGluZ1B1bGxJbnRvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kKGJyYW5jaDIuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsZWQxIHx8ICFjYW5jZWxlZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlclJlYWQocmVhZGVyLCByZWFkUmVxdWVzdCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1bGxXaXRoQllPQlJlYWRlcih2aWV3LCBmb3JCcmFuY2gyKSB7XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgICAgICBSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlKHJlYWRlcik7XG4gICAgICAgICAgICByZWFkZXIgPSBBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHN0cmVhbSk7XG4gICAgICAgICAgICBmb3J3YXJkUmVhZGVyRXJyb3IocmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieW9iQnJhbmNoID0gZm9yQnJhbmNoMiA/IGJyYW5jaDIgOiBicmFuY2gxO1xuICAgICAgICBjb25zdCBvdGhlckJyYW5jaCA9IGZvckJyYW5jaDIgPyBicmFuY2gxIDogYnJhbmNoMjtcbiAgICAgICAgY29uc3QgcmVhZEludG9SZXF1ZXN0ID0ge1xuICAgICAgICAgICAgX2NodW5rU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGRlbGF5ZWQgYSBtaWNyb3Rhc2sgYmVjYXVzZSBpdCB0YWtlcyBhdCBsZWFzdCBhIG1pY3JvdGFzayB0byBkZXRlY3QgZXJyb3JzICh1c2luZ1xuICAgICAgICAgICAgICAgIC8vIHJlYWRlci5fY2xvc2VkUHJvbWlzZSBiZWxvdyksIGFuZCB3ZSB3YW50IGVycm9ycyBpbiBzdHJlYW0gdG8gZXJyb3IgYm90aCBicmFuY2hlcyBpbW1lZGlhdGVseS4gV2UgY2Fubm90IGxldFxuICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgc3luY2hyb25vdXNseS1hdmFpbGFibGUgcmVhZHMgZ2V0IGFoZWFkIG9mIGFzeW5jaHJvbm91c2x5LWF2YWlsYWJsZSBlcnJvcnMuXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWFkQWdhaW5Gb3JCcmFuY2gxID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRBZ2FpbkZvckJyYW5jaDIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnlvYkNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMiA6IGNhbmNlbGVkMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJDYW5jZWxlZCA9IGZvckJyYW5jaDIgPyBjYW5jZWxlZDEgOiBjYW5jZWxlZDI7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3RoZXJDYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lZENodW5rO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRDaHVuayA9IENsb25lQXNVaW50OEFycmF5KGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChjbG9uZUUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyRXJyb3IoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjbG9uZUUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFcnJvcihvdGhlckJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjbG9uZUUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVDYW5jZWxQcm9taXNlKFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHN0cmVhbSwgY2xvbmVFKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3KGJ5b2JCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVucXVldWUob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgY2xvbmVkQ2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFieW9iQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFnYWluRm9yQnJhbmNoMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVsbDFBbGdvcml0aG0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWFkQWdhaW5Gb3JCcmFuY2gyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdWxsMkFsZ29yaXRobSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Nsb3NlU3RlcHM6IGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgYnlvYkNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMiA6IGNhbmNlbGVkMTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlckNhbmNlbGVkID0gZm9yQnJhbmNoMiA/IGNhbmNlbGVkMSA6IGNhbmNlbGVkMjtcbiAgICAgICAgICAgICAgICBpZiAoIWJ5b2JDYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xvc2UoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvdGhlckNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZShvdGhlckJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNodW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kV2l0aE5ld1ZpZXcoYnlvYkJyYW5jaC5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyLCBjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvdGhlckNhbmNlbGVkICYmIG90aGVyQnJhbmNoLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIuX3BlbmRpbmdQdWxsSW50b3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQob3RoZXJCcmFuY2guX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFieW9iQ2FuY2VsZWQgfHwgIW90aGVyQ2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNhbmNlbFByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2Vycm9yU3RlcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQocmVhZGVyLCB2aWV3LCByZWFkSW50b1JlcXVlc3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdWxsMUFsZ29yaXRobSgpIHtcbiAgICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJlYWRBZ2FpbkZvckJyYW5jaDEgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgYnlvYlJlcXVlc3QgPSBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0QllPQlJlcXVlc3QoYnJhbmNoMS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyKTtcbiAgICAgICAgaWYgKGJ5b2JSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBwdWxsV2l0aERlZmF1bHRSZWFkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHB1bGxXaXRoQllPQlJlYWRlcihieW9iUmVxdWVzdC5fdmlldywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZWRXaXRoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1bGwyQWxnb3JpdGhtKCkge1xuICAgICAgICBpZiAocmVhZGluZykge1xuICAgICAgICAgICAgcmVhZEFnYWluRm9yQnJhbmNoMiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBieW9iUmVxdWVzdCA9IFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJHZXRCWU9CUmVxdWVzdChicmFuY2gyLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgICAgICBpZiAoYnlvYlJlcXVlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB1bGxXaXRoRGVmYXVsdFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHVsbFdpdGhCWU9CUmVhZGVyKGJ5b2JSZXF1ZXN0Ll92aWV3LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwxQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDEgPSB0cnVlO1xuICAgICAgICByZWFzb24xID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQyKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWwyQWxnb3JpdGhtKHJlYXNvbikge1xuICAgICAgICBjYW5jZWxlZDIgPSB0cnVlO1xuICAgICAgICByZWFzb24yID0gcmVhc29uO1xuICAgICAgICBpZiAoY2FuY2VsZWQxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVSZWFzb24gPSBDcmVhdGVBcnJheUZyb21MaXN0KFtyZWFzb24xLCByZWFzb24yXSk7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxSZXN1bHQgPSBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIGNvbXBvc2l0ZVJlYXNvbik7XG4gICAgICAgICAgICByZXNvbHZlQ2FuY2VsUHJvbWlzZShjYW5jZWxSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWxQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEFsZ29yaXRobSgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBicmFuY2gxID0gQ3JlYXRlUmVhZGFibGVCeXRlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsMUFsZ29yaXRobSwgY2FuY2VsMUFsZ29yaXRobSk7XG4gICAgYnJhbmNoMiA9IENyZWF0ZVJlYWRhYmxlQnl0ZVN0cmVhbShzdGFydEFsZ29yaXRobSwgcHVsbDJBbGdvcml0aG0sIGNhbmNlbDJBbGdvcml0aG0pO1xuICAgIGZvcndhcmRSZWFkZXJFcnJvcihyZWFkZXIpO1xuICAgIHJldHVybiBbYnJhbmNoMSwgYnJhbmNoMl07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nRGVmYXVsdE9yQnl0ZVNvdXJjZShzb3VyY2UsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KHNvdXJjZSwgY29udGV4dCk7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBzb3VyY2U7XG4gICAgY29uc3QgYXV0b0FsbG9jYXRlQ2h1bmtTaXplID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLmF1dG9BbGxvY2F0ZUNodW5rU2l6ZTtcbiAgICBjb25zdCBjYW5jZWwgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuY2FuY2VsO1xuICAgIGNvbnN0IHB1bGwgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwucHVsbDtcbiAgICBjb25zdCBzdGFydCA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5zdGFydDtcbiAgICBjb25zdCB0eXBlID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnR5cGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXV0b0FsbG9jYXRlQ2h1bmtTaXplOiBhdXRvQWxsb2NhdGVDaHVua1NpemUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuc2lnbmVkTG9uZ0xvbmdXaXRoRW5mb3JjZVJhbmdlKGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnYXV0b0FsbG9jYXRlQ2h1bmtTaXplJyB0aGF0YCksXG4gICAgICAgIGNhbmNlbDogY2FuY2VsID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU291cmNlQ2FuY2VsQ2FsbGJhY2soY2FuY2VsLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnY2FuY2VsJyB0aGF0YCksXG4gICAgICAgIHB1bGw6IHB1bGwgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFVuZGVybHlpbmdTb3VyY2VQdWxsQ2FsbGJhY2socHVsbCwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3B1bGwnIHRoYXRgKSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRVbmRlcmx5aW5nU291cmNlU3RhcnRDYWxsYmFjayhzdGFydCwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3N0YXJ0JyB0aGF0YCksXG4gICAgICAgIHR5cGU6IHR5cGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnZlcnRSZWFkYWJsZVN0cmVhbVR5cGUodHlwZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAndHlwZScgdGhhdGApXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU291cmNlQ2FuY2VsQ2FsbGJhY2soZm4sIG9yaWdpbmFsLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RnVuY3Rpb24oZm4sIGNvbnRleHQpO1xuICAgIHJldHVybiAocmVhc29uKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtyZWFzb25dKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU291cmNlUHVsbENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNvbnRyb2xsZXIpID0+IHByb21pc2VDYWxsKGZuLCBvcmlnaW5hbCwgW2NvbnRyb2xsZXJdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRVbmRlcmx5aW5nU291cmNlU3RhcnRDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjb250cm9sbGVyKSA9PiByZWZsZWN0Q2FsbChmbiwgb3JpZ2luYWwsIFtjb250cm9sbGVyXSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0UmVhZGFibGVTdHJlYW1UeXBlKHR5cGUsIGNvbnRleHQpIHtcbiAgICB0eXBlID0gYCR7dHlwZX1gO1xuICAgIGlmICh0eXBlICE9PSAnYnl0ZXMnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7Y29udGV4dH0gJyR7dHlwZX0nIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciBSZWFkYWJsZVN0cmVhbVR5cGVgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRSZWFkZXJPcHRpb25zKG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBhc3NlcnREaWN0aW9uYXJ5KG9wdGlvbnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubW9kZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtb2RlOiBtb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBjb252ZXJ0UmVhZGFibGVTdHJlYW1SZWFkZXJNb2RlKG1vZGUsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ21vZGUnIHRoYXRgKVxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0UmVhZGFibGVTdHJlYW1SZWFkZXJNb2RlKG1vZGUsIGNvbnRleHQpIHtcbiAgICBtb2RlID0gYCR7bW9kZX1gO1xuICAgIGlmIChtb2RlICE9PSAnYnlvYicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtjb250ZXh0fSAnJHttb2RlfScgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yIFJlYWRhYmxlU3RyZWFtUmVhZGVyTW9kZWApO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZTtcbn1cblxuZnVuY3Rpb24gY29udmVydEl0ZXJhdG9yT3B0aW9ucyhvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShvcHRpb25zLCBjb250ZXh0KTtcbiAgICBjb25zdCBwcmV2ZW50Q2FuY2VsID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXZlbnRDYW5jZWw7XG4gICAgcmV0dXJuIHsgcHJldmVudENhbmNlbDogQm9vbGVhbihwcmV2ZW50Q2FuY2VsKSB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UGlwZU9wdGlvbnMob3B0aW9ucywgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkob3B0aW9ucywgY29udGV4dCk7XG4gICAgY29uc3QgcHJldmVudEFib3J0ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXZlbnRBYm9ydDtcbiAgICBjb25zdCBwcmV2ZW50Q2FuY2VsID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXZlbnRDYW5jZWw7XG4gICAgY29uc3QgcHJldmVudENsb3NlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXZlbnRDbG9zZTtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbmFsO1xuICAgIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRBYm9ydFNpZ25hbChzaWduYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3NpZ25hbCcgdGhhdGApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcmV2ZW50QWJvcnQ6IEJvb2xlYW4ocHJldmVudEFib3J0KSxcbiAgICAgICAgcHJldmVudENhbmNlbDogQm9vbGVhbihwcmV2ZW50Q2FuY2VsKSxcbiAgICAgICAgcHJldmVudENsb3NlOiBCb29sZWFuKHByZXZlbnRDbG9zZSksXG4gICAgICAgIHNpZ25hbFxuICAgIH07XG59XG5mdW5jdGlvbiBhc3NlcnRBYm9ydFNpZ25hbChzaWduYWwsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzQWJvcnRTaWduYWwoc2lnbmFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2NvbnRleHR9IGlzIG5vdCBhbiBBYm9ydFNpZ25hbC5gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRSZWFkYWJsZVdyaXRhYmxlUGFpcihwYWlyLCBjb250ZXh0KSB7XG4gICAgYXNzZXJ0RGljdGlvbmFyeShwYWlyLCBjb250ZXh0KTtcbiAgICBjb25zdCByZWFkYWJsZSA9IHBhaXIgPT09IG51bGwgfHwgcGFpciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFpci5yZWFkYWJsZTtcbiAgICBhc3NlcnRSZXF1aXJlZEZpZWxkKHJlYWRhYmxlLCAncmVhZGFibGUnLCAnUmVhZGFibGVXcml0YWJsZVBhaXInKTtcbiAgICBhc3NlcnRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAncmVhZGFibGUnIHRoYXRgKTtcbiAgICBjb25zdCB3cml0YWJsZSA9IHBhaXIgPT09IG51bGwgfHwgcGFpciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFpci53cml0YWJsZTtcbiAgICBhc3NlcnRSZXF1aXJlZEZpZWxkKHdyaXRhYmxlLCAnd3JpdGFibGUnLCAnUmVhZGFibGVXcml0YWJsZVBhaXInKTtcbiAgICBhc3NlcnRXcml0YWJsZVN0cmVhbSh3cml0YWJsZSwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnd3JpdGFibGUnIHRoYXRgKTtcbiAgICByZXR1cm4geyByZWFkYWJsZSwgd3JpdGFibGUgfTtcbn1cblxuLyoqXG4gKiBBIHJlYWRhYmxlIHN0cmVhbSByZXByZXNlbnRzIGEgc291cmNlIG9mIGRhdGEsIGZyb20gd2hpY2ggeW91IGNhbiByZWFkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY2xhc3MgUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHJhd1VuZGVybHlpbmdTb3VyY2UgPSB7fSwgcmF3U3RyYXRlZ3kgPSB7fSkge1xuICAgICAgICBpZiAocmF3VW5kZXJseWluZ1NvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByYXdVbmRlcmx5aW5nU291cmNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydE9iamVjdChyYXdVbmRlcmx5aW5nU291cmNlLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5KHJhd1N0cmF0ZWd5LCAnU2Vjb25kIHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCB1bmRlcmx5aW5nU291cmNlID0gY29udmVydFVuZGVybHlpbmdEZWZhdWx0T3JCeXRlU291cmNlKHJhd1VuZGVybHlpbmdTb3VyY2UsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHRoaXMpO1xuICAgICAgICBpZiAodW5kZXJseWluZ1NvdXJjZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgICBpZiAoc3RyYXRlZ3kuc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBzdHJhdGVneSBmb3IgYSBieXRlIHN0cmVhbSBjYW5ub3QgaGF2ZSBhIHNpemUgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhpZ2hXYXRlck1hcmsgPSBFeHRyYWN0SGlnaFdhdGVyTWFyayhzdHJhdGVneSwgMCk7XG4gICAgICAgICAgICBTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSh0aGlzLCB1bmRlcmx5aW5nU291cmNlLCBoaWdoV2F0ZXJNYXJrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemVBbGdvcml0aG0gPSBFeHRyYWN0U2l6ZUFsZ29yaXRobShzdHJhdGVneSk7XG4gICAgICAgICAgICBjb25zdCBoaWdoV2F0ZXJNYXJrID0gRXh0cmFjdEhpZ2hXYXRlck1hcmsoc3RyYXRlZ3ksIDEpO1xuICAgICAgICAgICAgU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTb3VyY2UodGhpcywgdW5kZXJseWluZ1NvdXJjZSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHJlYWRhYmxlIHN0cmVhbSBpcyBsb2NrZWQgdG8gYSB7QGxpbmsgUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIHwgcmVhZGVyfS5cbiAgICAgKi9cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnbG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElzUmVhZGFibGVTdHJlYW1Mb2NrZWQodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbmNlbHMgdGhlIHN0cmVhbSwgc2lnbmFsaW5nIGEgbG9zcyBvZiBpbnRlcmVzdCBpbiB0aGUgc3RyZWFtIGJ5IGEgY29uc3VtZXIuXG4gICAgICpcbiAgICAgKiBUaGUgc3VwcGxpZWQgYHJlYXNvbmAgYXJndW1lbnQgd2lsbCBiZSBnaXZlbiB0byB0aGUgdW5kZXJseWluZyBzb3VyY2UncyB7QGxpbmsgVW5kZXJseWluZ1NvdXJjZS5jYW5jZWwgfCBjYW5jZWwoKX1cbiAgICAgKiBtZXRob2QsIHdoaWNoIG1pZ2h0IG9yIG1pZ2h0IG5vdCB1c2UgaXQuXG4gICAgICovXG4gICAgY2FuY2VsKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgnY2FuY2VsJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FuY2VsIGEgc3RyZWFtIHRoYXQgYWxyZWFkeSBoYXMgYSByZWFkZXInKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWRhYmxlU3RyZWFtQ2FuY2VsKHRoaXMsIHJlYXNvbik7XG4gICAgfVxuICAgIGdldFJlYWRlcihyYXdPcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNSZWFkYWJsZVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxKCdnZXRSZWFkZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gY29udmVydFJlYWRlck9wdGlvbnMocmF3T3B0aW9ucywgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBBY3F1aXJlUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY3F1aXJlUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyKHRoaXMpO1xuICAgIH1cbiAgICBwaXBlVGhyb3VnaChyYXdUcmFuc2Zvcm0sIHJhd09wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIUlzUmVhZGFibGVTdHJlYW0odGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IHN0cmVhbUJyYW5kQ2hlY2tFeGNlcHRpb24kMSgncGlwZVRocm91Z2gnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRSZXF1aXJlZEFyZ3VtZW50KHJhd1RyYW5zZm9ybSwgMSwgJ3BpcGVUaHJvdWdoJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNvbnZlcnRSZWFkYWJsZVdyaXRhYmxlUGFpcihyYXdUcmFuc2Zvcm0sICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbnZlcnRQaXBlT3B0aW9ucyhyYXdPcHRpb25zLCAnU2Vjb25kIHBhcmFtZXRlcicpO1xuICAgICAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFJlYWRhYmxlU3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzV3JpdGFibGVTdHJlYW1Mb2NrZWQodHJhbnNmb3JtLndyaXRhYmxlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUaHJvdWdoIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFdyaXRhYmxlU3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IFJlYWRhYmxlU3RyZWFtUGlwZVRvKHRoaXMsIHRyYW5zZm9ybS53cml0YWJsZSwgb3B0aW9ucy5wcmV2ZW50Q2xvc2UsIG9wdGlvbnMucHJldmVudEFib3J0LCBvcHRpb25zLnByZXZlbnRDYW5jZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgc2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZShwcm9taXNlKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICB9XG4gICAgcGlwZVRvKGRlc3RpbmF0aW9uLCByYXdPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3BpcGVUbycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzdGluYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgoYFBhcmFtZXRlciAxIGlzIHJlcXVpcmVkIGluICdwaXBlVG8nLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghSXNXcml0YWJsZVN0cmVhbShkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKG5ldyBUeXBlRXJyb3IoYFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZS5waXBlVG8ncyBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgV3JpdGFibGVTdHJlYW1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wdGlvbnM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvcHRpb25zID0gY29udmVydFBpcGVPcHRpb25zKHJhd09wdGlvbnMsICdTZWNvbmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlUmVqZWN0ZWRXaXRoKGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChuZXcgVHlwZUVycm9yKCdSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUucGlwZVRvIGNhbm5vdCBiZSB1c2VkIG9uIGEgbG9ja2VkIFJlYWRhYmxlU3RyZWFtJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJc1dyaXRhYmxlU3RyZWFtTG9ja2VkKGRlc3RpbmF0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgobmV3IFR5cGVFcnJvcignUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnBpcGVUbyBjYW5ub3QgYmUgdXNlZCBvbiBhIGxvY2tlZCBXcml0YWJsZVN0cmVhbScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVhZGFibGVTdHJlYW1QaXBlVG8odGhpcywgZGVzdGluYXRpb24sIG9wdGlvbnMucHJldmVudENsb3NlLCBvcHRpb25zLnByZXZlbnRBYm9ydCwgb3B0aW9ucy5wcmV2ZW50Q2FuY2VsLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlZXMgdGhpcyByZWFkYWJsZSBzdHJlYW0sIHJldHVybmluZyBhIHR3by1lbGVtZW50IGFycmF5IGNvbnRhaW5pbmcgdGhlIHR3byByZXN1bHRpbmcgYnJhbmNoZXMgYXNcbiAgICAgKiBuZXcge0BsaW5rIFJlYWRhYmxlU3RyZWFtfSBpbnN0YW5jZXMuXG4gICAgICpcbiAgICAgKiBUZWVpbmcgYSBzdHJlYW0gd2lsbCBsb2NrIGl0LCBwcmV2ZW50aW5nIGFueSBvdGhlciBjb25zdW1lciBmcm9tIGFjcXVpcmluZyBhIHJlYWRlci5cbiAgICAgKiBUbyBjYW5jZWwgdGhlIHN0cmVhbSwgY2FuY2VsIGJvdGggb2YgdGhlIHJlc3VsdGluZyBicmFuY2hlczsgYSBjb21wb3NpdGUgY2FuY2VsbGF0aW9uIHJlYXNvbiB3aWxsIHRoZW4gYmVcbiAgICAgKiBwcm9wYWdhdGVkIHRvIHRoZSBzdHJlYW0ncyB1bmRlcmx5aW5nIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGUgY2h1bmtzIHNlZW4gaW4gZWFjaCBicmFuY2ggd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QuIElmIHRoZSBjaHVua3MgYXJlIG5vdCBpbW11dGFibGUsXG4gICAgICogdGhpcyBjb3VsZCBhbGxvdyBpbnRlcmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGJyYW5jaGVzLlxuICAgICAqL1xuICAgIHRlZSgpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3RlZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJyYW5jaGVzID0gUmVhZGFibGVTdHJlYW1UZWUodGhpcyk7XG4gICAgICAgIHJldHVybiBDcmVhdGVBcnJheUZyb21MaXN0KGJyYW5jaGVzKTtcbiAgICB9XG4gICAgdmFsdWVzKHJhd09wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFJc1JlYWRhYmxlU3RyZWFtKHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEoJ3ZhbHVlcycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb252ZXJ0SXRlcmF0b3JPcHRpb25zKHJhd09wdGlvbnMsICdGaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgcmV0dXJuIEFjcXVpcmVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcywgb3B0aW9ucy5wcmV2ZW50Q2FuY2VsKTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICBjYW5jZWw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGdldFJlYWRlcjogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgcGlwZVRocm91Z2g6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIHBpcGVUbzogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgdGVlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB2YWx1ZXM6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIGxvY2tlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1JlYWRhYmxlU3RyZWFtJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLmFzeW5jSXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwuYXN5bmNJdGVyYXRvciwge1xuICAgICAgICB2YWx1ZTogUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLnZhbHVlcyxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufVxuLy8gQWJzdHJhY3Qgb3BlcmF0aW9ucyBmb3IgdGhlIFJlYWRhYmxlU3RyZWFtLlxuLy8gVGhyb3dzIGlmIGFuZCBvbmx5IGlmIHN0YXJ0QWxnb3JpdGhtIHRocm93cy5cbmZ1bmN0aW9uIENyZWF0ZVJlYWRhYmxlU3RyZWFtKHN0YXJ0QWxnb3JpdGhtLCBwdWxsQWxnb3JpdGhtLCBjYW5jZWxBbGdvcml0aG0sIGhpZ2hXYXRlck1hcmsgPSAxLCBzaXplQWxnb3JpdGhtID0gKCkgPT4gMSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKTtcbiAgICBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0oc3RyZWFtKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgU2V0VXBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyaywgc2l6ZUFsZ29yaXRobSk7XG4gICAgcmV0dXJuIHN0cmVhbTtcbn1cbi8vIFRocm93cyBpZiBhbmQgb25seSBpZiBzdGFydEFsZ29yaXRobSB0aHJvd3MuXG5mdW5jdGlvbiBDcmVhdGVSZWFkYWJsZUJ5dGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKTtcbiAgICBJbml0aWFsaXplUmVhZGFibGVTdHJlYW0oc3RyZWFtKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gT2JqZWN0LmNyZWF0ZShSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLnByb3RvdHlwZSk7XG4gICAgU2V0VXBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbSwgY29udHJvbGxlciwgc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgMCwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gc3RyZWFtO1xufVxuZnVuY3Rpb24gSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAncmVhZGFibGUnO1xuICAgIHN0cmVhbS5fcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgIHN0cmVhbS5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl9kaXN0dXJiZWQgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIElzUmVhZGFibGVTdHJlYW0oeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXInKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW07XG59XG5mdW5jdGlvbiBJc1JlYWRhYmxlU3RyZWFtTG9ja2VkKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uX3JlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZWFkYWJsZVN0cmVhbSBBUEkgZXhwb3NlZCBmb3IgY29udHJvbGxlcnMuXG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUNhbmNlbChzdHJlYW0sIHJlYXNvbikge1xuICAgIHN0cmVhbS5fZGlzdHVyYmVkID0gdHJ1ZTtcbiAgICBpZiAoc3RyZWFtLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5fc3RhdGUgPT09ICdlcnJvcmVkJykge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlamVjdGVkV2l0aChzdHJlYW0uX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pO1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5fcmVhZGVyO1xuICAgIGlmIChyZWFkZXIgIT09IHVuZGVmaW5lZCAmJiBJc1JlYWRhYmxlU3RyZWFtQllPQlJlYWRlcihyZWFkZXIpKSB7XG4gICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5mb3JFYWNoKHJlYWRJbnRvUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX2Nsb3NlU3RlcHModW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cyA9IG5ldyBTaW1wbGVRdWV1ZSgpO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VDYW5jZWxQcm9taXNlID0gc3RyZWFtLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXJbQ2FuY2VsU3RlcHNdKHJlYXNvbik7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKHNvdXJjZUNhbmNlbFByb21pc2UsIG5vb3ApO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdHJlYW1DbG9zZShzdHJlYW0pIHtcbiAgICBzdHJlYW0uX3N0YXRlID0gJ2Nsb3NlZCc7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZXNvbHZlKHJlYWRlcik7XG4gICAgaWYgKElzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyKHJlYWRlcikpIHtcbiAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMuZm9yRWFjaChyZWFkUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZWFkUmVxdWVzdC5fY2xvc2VTdGVwcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0cmVhbUVycm9yKHN0cmVhbSwgZSkge1xuICAgIHN0cmVhbS5fc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgc3RyZWFtLl9zdG9yZWRFcnJvciA9IGU7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLl9yZWFkZXI7XG4gICAgaWYgKHJlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QocmVhZGVyLCBlKTtcbiAgICBpZiAoSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIocmVhZGVyKSkge1xuICAgICAgICByZWFkZXIuX3JlYWRSZXF1ZXN0cy5mb3JFYWNoKHJlYWRSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJlYWRSZXF1ZXN0Ll9lcnJvclN0ZXBzKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLl9yZWFkUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlYWRlci5fcmVhZEludG9SZXF1ZXN0cy5mb3JFYWNoKHJlYWRJbnRvUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZWFkSW50b1JlcXVlc3QuX2Vycm9yU3RlcHMoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIuX3JlYWRJbnRvUmVxdWVzdHMgPSBuZXcgU2ltcGxlUXVldWUoKTtcbiAgICB9XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgUmVhZGFibGVTdHJlYW0uXG5mdW5jdGlvbiBzdHJlYW1CcmFuZENoZWNrRXhjZXB0aW9uJDEobmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBSZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgUmVhZGFibGVTdHJlYW1gKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFF1ZXVpbmdTdHJhdGVneUluaXQoaW5pdCwgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkoaW5pdCwgY29udGV4dCk7XG4gICAgY29uc3QgaGlnaFdhdGVyTWFyayA9IGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5oaWdoV2F0ZXJNYXJrO1xuICAgIGFzc2VydFJlcXVpcmVkRmllbGQoaGlnaFdhdGVyTWFyaywgJ2hpZ2hXYXRlck1hcmsnLCAnUXVldWluZ1N0cmF0ZWd5SW5pdCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IGNvbnZlcnRVbnJlc3RyaWN0ZWREb3VibGUoaGlnaFdhdGVyTWFyaylcbiAgICB9O1xufVxuXG4vLyBUaGUgc2l6ZSBmdW5jdGlvbiBtdXN0IG5vdCBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG5vciBiZSBhIGNvbnN0cnVjdG9yXG5jb25zdCBieXRlTGVuZ3RoU2l6ZUZ1bmN0aW9uID0gKGNodW5rKSA9PiB7XG4gICAgcmV0dXJuIGNodW5rLmJ5dGVMZW5ndGg7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ5dGVMZW5ndGhTaXplRnVuY3Rpb24sICduYW1lJywge1xuICAgIHZhbHVlOiAnc2l6ZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcbi8qKlxuICogQSBxdWV1aW5nIHN0cmF0ZWd5IHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gZWFjaCBjaHVuay5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UmVxdWlyZWRBcmd1bWVudChvcHRpb25zLCAxLCAnQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneScpO1xuICAgICAgICBvcHRpb25zID0gY29udmVydFF1ZXVpbmdTdHJhdGVneUluaXQob3B0aW9ucywgJ0ZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICB0aGlzLl9ieXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyayA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGlnaCB3YXRlciBtYXJrIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBnZXQgaGlnaFdhdGVyTWFyaygpIHtcbiAgICAgICAgaWYgKCFJc0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVMZW5ndGhCcmFuZENoZWNrRXhjZXB0aW9uKCdoaWdoV2F0ZXJNYXJrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZWFzdXJlcyB0aGUgc2l6ZSBvZiBgY2h1bmtgIGJ5IHJldHVybmluZyB0aGUgdmFsdWUgb2YgaXRzIGBieXRlTGVuZ3RoYCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGJ5dGVMZW5ndGhCcmFuZENoZWNrRXhjZXB0aW9uKCdzaXplJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVMZW5ndGhTaXplRnVuY3Rpb247XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUsIHtcbiAgICBoaWdoV2F0ZXJNYXJrOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBzaXplOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5pZiAodHlwZW9mIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5LnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5JyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneS5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGhCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneWApO1xufVxuZnVuY3Rpb24gSXNCeXRlTGVuZ3RoUXVldWluZ1N0cmF0ZWd5KHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfYnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgQnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneTtcbn1cblxuLy8gVGhlIHNpemUgZnVuY3Rpb24gbXVzdCBub3QgaGF2ZSBhIHByb3RvdHlwZSBwcm9wZXJ0eSBub3IgYmUgYSBjb25zdHJ1Y3RvclxuY29uc3QgY291bnRTaXplRnVuY3Rpb24gPSAoKSA9PiB7XG4gICAgcmV0dXJuIDE7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvdW50U2l6ZUZ1bmN0aW9uLCAnbmFtZScsIHtcbiAgICB2YWx1ZTogJ3NpemUnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG4vKipcbiAqIEEgcXVldWluZyBzdHJhdGVneSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGNodW5rcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIENvdW50UXVldWluZ1N0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFJlcXVpcmVkQXJndW1lbnQob3B0aW9ucywgMSwgJ0NvdW50UXVldWluZ1N0cmF0ZWd5Jyk7XG4gICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UXVldWluZ1N0cmF0ZWd5SW5pdChvcHRpb25zLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIHRoaXMuX2NvdW50UXVldWluZ1N0cmF0ZWd5SGlnaFdhdGVyTWFyayA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGlnaCB3YXRlciBtYXJrIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBnZXQgaGlnaFdhdGVyTWFyaygpIHtcbiAgICAgICAgaWYgKCFJc0NvdW50UXVldWluZ1N0cmF0ZWd5KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBjb3VudEJyYW5kQ2hlY2tFeGNlcHRpb24oJ2hpZ2hXYXRlck1hcmsnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZWFzdXJlcyB0aGUgc2l6ZSBvZiBgY2h1bmtgIGJ5IGFsd2F5cyByZXR1cm5pbmcgMS5cbiAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdG90YWwgcXVldWUgc2l6ZSBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgY2h1bmtzIGluIHRoZSBxdWV1ZS5cbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgaWYgKCFJc0NvdW50UXVldWluZ1N0cmF0ZWd5KHRoaXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBjb3VudEJyYW5kQ2hlY2tFeGNlcHRpb24oJ3NpemUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnRTaXplRnVuY3Rpb247XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLCB7XG4gICAgaGlnaFdhdGVyTWFyazogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgc2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ291bnRRdWV1aW5nU3RyYXRlZ3kucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ0NvdW50UXVldWluZ1N0cmF0ZWd5JyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgQ291bnRRdWV1aW5nU3RyYXRlZ3kuXG5mdW5jdGlvbiBjb3VudEJyYW5kQ2hlY2tFeGNlcHRpb24obmFtZSkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKGBDb3VudFF1ZXVpbmdTdHJhdGVneS5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgQ291bnRRdWV1aW5nU3RyYXRlZ3lgKTtcbn1cbmZ1bmN0aW9uIElzQ291bnRRdWV1aW5nU3RyYXRlZ3koeCkge1xuICAgIGlmICghdHlwZUlzT2JqZWN0KHgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ19jb3VudFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB4IGluc3RhbmNlb2YgQ291bnRRdWV1aW5nU3RyYXRlZ3k7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2Zvcm1lcihvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydERpY3Rpb25hcnkob3JpZ2luYWwsIGNvbnRleHQpO1xuICAgIGNvbnN0IGZsdXNoID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLmZsdXNoO1xuICAgIGNvbnN0IHJlYWRhYmxlVHlwZSA9IG9yaWdpbmFsID09PSBudWxsIHx8IG9yaWdpbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbC5yZWFkYWJsZVR5cGU7XG4gICAgY29uc3Qgc3RhcnQgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwuc3RhcnQ7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gb3JpZ2luYWwgPT09IG51bGwgfHwgb3JpZ2luYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsLnRyYW5zZm9ybTtcbiAgICBjb25zdCB3cml0YWJsZVR5cGUgPSBvcmlnaW5hbCA9PT0gbnVsbCB8fCBvcmlnaW5hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWwud3JpdGFibGVUeXBlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZsdXNoOiBmbHVzaCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICBjb252ZXJ0VHJhbnNmb3JtZXJGbHVzaENhbGxiYWNrKGZsdXNoLCBvcmlnaW5hbCwgYCR7Y29udGV4dH0gaGFzIG1lbWJlciAnZmx1c2gnIHRoYXRgKSxcbiAgICAgICAgcmVhZGFibGVUeXBlLFxuICAgICAgICBzdGFydDogc3RhcnQgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgY29udmVydFRyYW5zZm9ybWVyU3RhcnRDYWxsYmFjayhzdGFydCwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3N0YXJ0JyB0aGF0YCksXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdW5kZWZpbmVkIDpcbiAgICAgICAgICAgIGNvbnZlcnRUcmFuc2Zvcm1lclRyYW5zZm9ybUNhbGxiYWNrKHRyYW5zZm9ybSwgb3JpZ2luYWwsIGAke2NvbnRleHR9IGhhcyBtZW1iZXIgJ3RyYW5zZm9ybScgdGhhdGApLFxuICAgICAgICB3cml0YWJsZVR5cGVcbiAgICB9O1xufVxuZnVuY3Rpb24gY29udmVydFRyYW5zZm9ybWVyRmx1c2hDYWxsYmFjayhmbiwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICBhc3NlcnRGdW5jdGlvbihmbiwgY29udGV4dCk7XG4gICAgcmV0dXJuIChjb250cm9sbGVyKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtjb250cm9sbGVyXSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNmb3JtZXJTdGFydENhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNvbnRyb2xsZXIpID0+IHJlZmxlY3RDYWxsKGZuLCBvcmlnaW5hbCwgW2NvbnRyb2xsZXJdKTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2Zvcm1lclRyYW5zZm9ybUNhbGxiYWNrKGZuLCBvcmlnaW5hbCwgY29udGV4dCkge1xuICAgIGFzc2VydEZ1bmN0aW9uKGZuLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKGNodW5rLCBjb250cm9sbGVyKSA9PiBwcm9taXNlQ2FsbChmbiwgb3JpZ2luYWwsIFtjaHVuaywgY29udHJvbGxlcl0pO1xufVxuXG4vLyBDbGFzcyBUcmFuc2Zvcm1TdHJlYW1cbi8qKlxuICogQSB0cmFuc2Zvcm0gc3RyZWFtIGNvbnNpc3RzIG9mIGEgcGFpciBvZiBzdHJlYW1zOiBhIHtAbGluayBXcml0YWJsZVN0cmVhbSB8IHdyaXRhYmxlIHN0cmVhbX0sXG4gKiBrbm93biBhcyBpdHMgd3JpdGFibGUgc2lkZSwgYW5kIGEge0BsaW5rIFJlYWRhYmxlU3RyZWFtIHwgcmVhZGFibGUgc3RyZWFtfSwga25vd24gYXMgaXRzIHJlYWRhYmxlIHNpZGUuXG4gKiBJbiBhIG1hbm5lciBzcGVjaWZpYyB0byB0aGUgdHJhbnNmb3JtIHN0cmVhbSBpbiBxdWVzdGlvbiwgd3JpdGVzIHRvIHRoZSB3cml0YWJsZSBzaWRlIHJlc3VsdCBpbiBuZXcgZGF0YSBiZWluZ1xuICogbWFkZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgZnJvbSB0aGUgcmVhZGFibGUgc2lkZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFRyYW5zZm9ybVN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IocmF3VHJhbnNmb3JtZXIgPSB7fSwgcmF3V3JpdGFibGVTdHJhdGVneSA9IHt9LCByYXdSZWFkYWJsZVN0cmF0ZWd5ID0ge30pIHtcbiAgICAgICAgaWYgKHJhd1RyYW5zZm9ybWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJhd1RyYW5zZm9ybWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3cml0YWJsZVN0cmF0ZWd5ID0gY29udmVydFF1ZXVpbmdTdHJhdGVneShyYXdXcml0YWJsZVN0cmF0ZWd5LCAnU2Vjb25kIHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCByZWFkYWJsZVN0cmF0ZWd5ID0gY29udmVydFF1ZXVpbmdTdHJhdGVneShyYXdSZWFkYWJsZVN0cmF0ZWd5LCAnVGhpcmQgcGFyYW1ldGVyJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gY29udmVydFRyYW5zZm9ybWVyKHJhd1RyYW5zZm9ybWVyLCAnRmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lci5yZWFkYWJsZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgcmVhZGFibGVUeXBlIHNwZWNpZmllZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lci53cml0YWJsZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgd3JpdGFibGVUeXBlIHNwZWNpZmllZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IEV4dHJhY3RIaWdoV2F0ZXJNYXJrKHJlYWRhYmxlU3RyYXRlZ3ksIDApO1xuICAgICAgICBjb25zdCByZWFkYWJsZVNpemVBbGdvcml0aG0gPSBFeHRyYWN0U2l6ZUFsZ29yaXRobShyZWFkYWJsZVN0cmF0ZWd5KTtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVIaWdoV2F0ZXJNYXJrID0gRXh0cmFjdEhpZ2hXYXRlck1hcmsod3JpdGFibGVTdHJhdGVneSwgMSk7XG4gICAgICAgIGNvbnN0IHdyaXRhYmxlU2l6ZUFsZ29yaXRobSA9IEV4dHJhY3RTaXplQWxnb3JpdGhtKHdyaXRhYmxlU3RyYXRlZ3kpO1xuICAgICAgICBsZXQgc3RhcnRQcm9taXNlX3Jlc29sdmU7XG4gICAgICAgIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IG5ld1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBzdGFydFByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtKHRoaXMsIHN0YXJ0UHJvbWlzZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyaywgcmVhZGFibGVTaXplQWxnb3JpdGhtKTtcbiAgICAgICAgU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lcih0aGlzLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lci5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGFydFByb21pc2VfcmVzb2x2ZSh0cmFuc2Zvcm1lci5zdGFydCh0aGlzLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydFByb21pc2VfcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZSB0cmFuc2Zvcm0gc3RyZWFtLlxuICAgICAqL1xuICAgIGdldCByZWFkYWJsZSgpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbigncmVhZGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3cml0YWJsZSBzaWRlIG9mIHRoZSB0cmFuc2Zvcm0gc3RyZWFtLlxuICAgICAqL1xuICAgIGdldCB3cml0YWJsZSgpIHtcbiAgICAgICAgaWYgKCFJc1RyYW5zZm9ybVN0cmVhbSh0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbignd3JpdGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGU7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIHJlYWRhYmxlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB3cml0YWJsZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSwgU3ltYm9sUG9seWZpbGwudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgdmFsdWU6ICdUcmFuc2Zvcm1TdHJlYW0nLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIEluaXRpYWxpemVUcmFuc2Zvcm1TdHJlYW0oc3RyZWFtLCBzdGFydFByb21pc2UsIHdyaXRhYmxlSGlnaFdhdGVyTWFyaywgd3JpdGFibGVTaXplQWxnb3JpdGhtLCByZWFkYWJsZUhpZ2hXYXRlck1hcmssIHJlYWRhYmxlU2l6ZUFsZ29yaXRobSkge1xuICAgIGZ1bmN0aW9uIHN0YXJ0QWxnb3JpdGhtKCkge1xuICAgICAgICByZXR1cm4gc3RhcnRQcm9taXNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUFsZ29yaXRobShjaHVuaykge1xuICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtXcml0ZUFsZ29yaXRobShzdHJlYW0sIGNodW5rKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWJvcnRBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Fib3J0QWxnb3JpdGhtKHN0cmVhbSwgcmVhc29uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VBbGdvcml0aG0oKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua0Nsb3NlQWxnb3JpdGhtKHN0cmVhbSk7XG4gICAgfVxuICAgIHN0cmVhbS5fd3JpdGFibGUgPSBDcmVhdGVXcml0YWJsZVN0cmVhbShzdGFydEFsZ29yaXRobSwgd3JpdGVBbGdvcml0aG0sIGNsb3NlQWxnb3JpdGhtLCBhYm9ydEFsZ29yaXRobSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrLCB3cml0YWJsZVNpemVBbGdvcml0aG0pO1xuICAgIGZ1bmN0aW9uIHB1bGxBbGdvcml0aG0oKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobShzdHJlYW0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5jZWxBbGdvcml0aG0ocmVhc29uKSB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCByZWFzb24pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBzdHJlYW0uX3JlYWRhYmxlID0gQ3JlYXRlUmVhZGFibGVTdHJlYW0oc3RhcnRBbGdvcml0aG0sIHB1bGxBbGdvcml0aG0sIGNhbmNlbEFsZ29yaXRobSwgcmVhZGFibGVIaWdoV2F0ZXJNYXJrLCByZWFkYWJsZVNpemVBbGdvcml0aG0pO1xuICAgIC8vIFRoZSBbW2JhY2twcmVzc3VyZV1dIHNsb3QgaXMgc2V0IHRvIHVuZGVmaW5lZCBzbyB0aGF0IGl0IGNhbiBiZSBpbml0aWFsaXNlZCBieSBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUuXG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSB1bmRlZmluZWQ7XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHN0cmVhbS5fYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZV9yZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIHRydWUpO1xuICAgIHN0cmVhbS5fdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIElzVHJhbnNmb3JtU3RyZWFtKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfdHJhbnNmb3JtU3RyZWFtQ29udHJvbGxlcicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBUcmFuc2Zvcm1TdHJlYW07XG59XG4vLyBUaGlzIGlzIGEgbm8tb3AgaWYgYm90aCBzaWRlcyBhcmUgYWxyZWFkeSBlcnJvcmVkLlxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRXJyb3Ioc3RyZWFtLCBlKSB7XG4gICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9yKHN0cmVhbS5fcmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciwgZSk7XG4gICAgVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGUpO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRXJyb3JXcml0YWJsZUFuZFVuYmxvY2tXcml0ZShzdHJlYW0sIGUpIHtcbiAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIpO1xuICAgIFdyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcklmTmVlZGVkKHN0cmVhbS5fd3JpdGFibGUuX3dyaXRhYmxlU3RyZWFtQ29udHJvbGxlciwgZSk7XG4gICAgaWYgKHN0cmVhbS5fYmFja3ByZXNzdXJlKSB7XG4gICAgICAgIC8vIFByZXRlbmQgdGhhdCBwdWxsKCkgd2FzIGNhbGxlZCB0byBwZXJtaXQgYW55IHBlbmRpbmcgd3JpdGUoKSBjYWxscyB0byBjb21wbGV0ZS4gVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKClcbiAgICAgICAgLy8gY2Fubm90IGJlIGNhbGxlZCBmcm9tIGVucXVldWUoKSBvciBwdWxsKCkgb25jZSB0aGUgUmVhZGFibGVTdHJlYW0gaXMgZXJyb3JlZCwgc28gdGhpcyB3aWxsIHdpbGwgYmUgdGhlIGZpbmFsIHRpbWVcbiAgICAgICAgLy8gX2JhY2twcmVzc3VyZSBpcyBzZXQuXG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGZhbHNlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUoc3RyZWFtLCBiYWNrcHJlc3N1cmUpIHtcbiAgICAvLyBQYXNzZXMgYWxzbyB3aGVuIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICAgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSgpO1xuICAgIH1cbiAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2UgPSBuZXdQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBzdHJlYW0uX2JhY2twcmVzc3VyZUNoYW5nZVByb21pc2VfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgc3RyZWFtLl9iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7XG59XG4vLyBDbGFzcyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclxuLyoqXG4gKiBBbGxvd3MgY29udHJvbCBvZiB0aGUge0BsaW5rIFJlYWRhYmxlU3RyZWFtfSBhbmQge0BsaW5rIFdyaXRhYmxlU3RyZWFtfSBvZiB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgVHJhbnNmb3JtU3RyZWFtfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNsYXNzIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIHNpemUgdG8gZmlsbCB0aGUgcmVhZGFibGUgc2lkZeKAmXMgaW50ZXJuYWwgcXVldWUuIEl0IGNhbiBiZSBuZWdhdGl2ZSwgaWYgdGhlIHF1ZXVlIGlzIG92ZXItZnVsbC5cbiAgICAgKi9cbiAgICBnZXQgZGVzaXJlZFNpemUoKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdkZXNpcmVkU2l6ZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlQ29udHJvbGxlciA9IHRoaXMuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUocmVhZGFibGVDb250cm9sbGVyKTtcbiAgICB9XG4gICAgZW5xdWV1ZShjaHVuayA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUlzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIodGhpcykpIHtcbiAgICAgICAgICAgIHRocm93IGRlZmF1bHRDb250cm9sbGVyQnJhbmRDaGVja0V4Y2VwdGlvbignZW5xdWV1ZScpO1xuICAgICAgICB9XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSh0aGlzLCBjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVycm9ycyBib3RoIHRoZSByZWFkYWJsZSBzaWRlIGFuZCB0aGUgd3JpdGFibGUgc2lkZSBvZiB0aGUgY29udHJvbGxlZCB0cmFuc2Zvcm0gc3RyZWFtLCBtYWtpbmcgYWxsIGZ1dHVyZVxuICAgICAqIGludGVyYWN0aW9ucyB3aXRoIGl0IGZhaWwgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgYGVgLiBBbnkgY2h1bmtzIHF1ZXVlZCBmb3IgdHJhbnNmb3JtYXRpb24gd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICovXG4gICAgZXJyb3IocmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCdlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRXJyb3IodGhpcywgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSByZWFkYWJsZSBzaWRlIGFuZCBlcnJvcnMgdGhlIHdyaXRhYmxlIHNpZGUgb2YgdGhlIGNvbnRyb2xsZWQgdHJhbnNmb3JtIHN0cmVhbS4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGVcbiAgICAgKiB0cmFuc2Zvcm1lciBvbmx5IG5lZWRzIHRvIGNvbnN1bWUgYSBwb3J0aW9uIG9mIHRoZSBjaHVua3Mgd3JpdHRlbiB0byB0aGUgd3JpdGFibGUgc2lkZS5cbiAgICAgKi9cbiAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgIGlmICghSXNUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcih0aGlzKSkge1xuICAgICAgICAgICAgdGhyb3cgZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKCd0ZXJtaW5hdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZSh0aGlzKTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlci5wcm90b3R5cGUsIHtcbiAgICBlbnF1ZXVlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBlcnJvcjogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgdGVybWluYXRlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcbiAgICBkZXNpcmVkU2l6ZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuaWYgKHR5cGVvZiBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywge1xuICAgICAgICB2YWx1ZTogJ1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyJyxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG59XG4vLyBUcmFuc2Zvcm0gU3RyZWFtIERlZmF1bHQgQ29udHJvbGxlciBBYnN0cmFjdCBPcGVyYXRpb25zXG5mdW5jdGlvbiBJc1RyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyKHgpIHtcbiAgICBpZiAoIXR5cGVJc09iamVjdCh4KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdfY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcbn1cbmZ1bmN0aW9uIFNldFVwVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIoc3RyZWFtLCBjb250cm9sbGVyLCB0cmFuc2Zvcm1BbGdvcml0aG0sIGZsdXNoQWxnb3JpdGhtKSB7XG4gICAgY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSA9IHN0cmVhbTtcbiAgICBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobSA9IHRyYW5zZm9ybUFsZ29yaXRobTtcbiAgICBjb250cm9sbGVyLl9mbHVzaEFsZ29yaXRobSA9IGZsdXNoQWxnb3JpdGhtO1xufVxuZnVuY3Rpb24gU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lcihzdHJlYW0sIHRyYW5zZm9ybWVyKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlKTtcbiAgICBsZXQgdHJhbnNmb3JtQWxnb3JpdGhtID0gKGNodW5rKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoY29udHJvbGxlciwgY2h1bmspO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAodHJhbnNmb3JtUmVzdWx0RSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VSZWplY3RlZFdpdGgodHJhbnNmb3JtUmVzdWx0RSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCBmbHVzaEFsZ29yaXRobSA9ICgpID0+IHByb21pc2VSZXNvbHZlZFdpdGgodW5kZWZpbmVkKTtcbiAgICBpZiAodHJhbnNmb3JtZXIudHJhbnNmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJhbnNmb3JtQWxnb3JpdGhtID0gY2h1bmsgPT4gdHJhbnNmb3JtZXIudHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybWVyLmZsdXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZmx1c2hBbGdvcml0aG0gPSAoKSA9PiB0cmFuc2Zvcm1lci5mbHVzaChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlcihzdHJlYW0sIGNvbnRyb2xsZXIsIHRyYW5zZm9ybUFsZ29yaXRobSwgZmx1c2hBbGdvcml0aG0pO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXIuX3RyYW5zZm9ybUFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICBjb250cm9sbGVyLl9mbHVzaEFsZ29yaXRobSA9IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShjb250cm9sbGVyLCBjaHVuaykge1xuICAgIGNvbnN0IHN0cmVhbSA9IGNvbnRyb2xsZXIuX2NvbnRyb2xsZWRUcmFuc2Zvcm1TdHJlYW07XG4gICAgY29uc3QgcmVhZGFibGVDb250cm9sbGVyID0gc3RyZWFtLl9yZWFkYWJsZS5fcmVhZGFibGVTdHJlYW1Db250cm9sbGVyO1xuICAgIGlmICghUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbkNsb3NlT3JFbnF1ZXVlKHJlYWRhYmxlQ29udHJvbGxlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVhZGFibGUgc2lkZSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHBlcm1pdHMgZW5xdWV1ZScpO1xuICAgIH1cbiAgICAvLyBXZSB0aHJvdHRsZSB0cmFuc2Zvcm0gaW52b2NhdGlvbnMgYmFzZWQgb24gdGhlIGJhY2twcmVzc3VyZSBvZiB0aGUgUmVhZGFibGVTdHJlYW0sIGJ1dCB3ZSBzdGlsbFxuICAgIC8vIGFjY2VwdCBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUoKSBjYWxscy5cbiAgICB0cnkge1xuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZShyZWFkYWJsZUNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVhZGFibGVTdHJhdGVneS5zaXplKCkgdGhyb3dzLlxuICAgICAgICBUcmFuc2Zvcm1TdHJlYW1FcnJvcldyaXRhYmxlQW5kVW5ibG9ja1dyaXRlKHN0cmVhbSwgZSk7XG4gICAgICAgIHRocm93IHN0cmVhbS5fcmVhZGFibGUuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBjb25zdCBiYWNrcHJlc3N1cmUgPSBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVySGFzQmFja3ByZXNzdXJlKHJlYWRhYmxlQ29udHJvbGxlcik7XG4gICAgaWYgKGJhY2twcmVzc3VyZSAhPT0gc3RyZWFtLl9iYWNrcHJlc3N1cmUpIHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtU2V0QmFja3ByZXNzdXJlKHN0cmVhbSwgdHJ1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvcihjb250cm9sbGVyLCBlKSB7XG4gICAgVHJhbnNmb3JtU3RyZWFtRXJyb3IoY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSwgZSk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1Qcm9taXNlID0gY29udHJvbGxlci5fdHJhbnNmb3JtQWxnb3JpdGhtKGNodW5rKTtcbiAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgodHJhbnNmb3JtUHJvbWlzZSwgdW5kZWZpbmVkLCByID0+IHtcbiAgICAgICAgVHJhbnNmb3JtU3RyZWFtRXJyb3IoY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSwgcik7XG4gICAgICAgIHRocm93IHI7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZShjb250cm9sbGVyKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gY29udHJvbGxlci5fY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbTtcbiAgICBjb25zdCByZWFkYWJsZUNvbnRyb2xsZXIgPSBzdHJlYW0uX3JlYWRhYmxlLl9yZWFkYWJsZVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsb3NlKHJlYWRhYmxlQ29udHJvbGxlcik7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgVHlwZUVycm9yKCdUcmFuc2Zvcm1TdHJlYW0gdGVybWluYXRlZCcpO1xuICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUoc3RyZWFtLCBlcnJvcik7XG59XG4vLyBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2luayBBbGdvcml0aG1zXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U2lua1dyaXRlQWxnb3JpdGhtKHN0cmVhbSwgY2h1bmspIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gc3RyZWFtLl90cmFuc2Zvcm1TdHJlYW1Db250cm9sbGVyO1xuICAgIGlmIChzdHJlYW0uX2JhY2twcmVzc3VyZSkge1xuICAgICAgICBjb25zdCBiYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlID0gc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtUHJvbWlzZVdpdGgoYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBzdHJlYW0uX3dyaXRhYmxlO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB3cml0YWJsZS5fc3RhdGU7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09ICdlcnJvcmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB3cml0YWJsZS5fc3RvcmVkRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQZXJmb3JtVHJhbnNmb3JtKGNvbnRyb2xsZXIsIGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclBlcmZvcm1UcmFuc2Zvcm0oY29udHJvbGxlciwgY2h1bmspO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtBYm9ydEFsZ29yaXRobShzdHJlYW0sIHJlYXNvbikge1xuICAgIC8vIGFib3J0KCkgaXMgbm90IGNhbGxlZCBzeW5jaHJvbm91c2x5LCBzbyBpdCBpcyBwb3NzaWJsZSBmb3IgYWJvcnQoKSB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGFscmVhZHlcbiAgICAvLyBlcnJvcmVkLlxuICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKHN0cmVhbSwgcmVhc29uKTtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmVkV2l0aCh1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNpbmtDbG9zZUFsZ29yaXRobShzdHJlYW0pIHtcbiAgICAvLyBzdHJlYW0uX3JlYWRhYmxlIGNhbm5vdCBjaGFuZ2UgYWZ0ZXIgY29uc3RydWN0aW9uLCBzbyBjYWNoaW5nIGl0IGFjcm9zcyBhIGNhbGwgdG8gdXNlciBjb2RlIGlzIHNhZmUuXG4gICAgY29uc3QgcmVhZGFibGUgPSBzdHJlYW0uX3JlYWRhYmxlO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBzdHJlYW0uX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXI7XG4gICAgY29uc3QgZmx1c2hQcm9taXNlID0gY29udHJvbGxlci5fZmx1c2hBbGdvcml0aG0oKTtcbiAgICBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyhjb250cm9sbGVyKTtcbiAgICAvLyBSZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdW5kZWZpbmVkIG9uIHN1Y2Nlc3MuXG4gICAgcmV0dXJuIHRyYW5zZm9ybVByb21pc2VXaXRoKGZsdXNoUHJvbWlzZSwgKCkgPT4ge1xuICAgICAgICBpZiAocmVhZGFibGUuX3N0YXRlID09PSAnZXJyb3JlZCcpIHtcbiAgICAgICAgICAgIHRocm93IHJlYWRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UocmVhZGFibGUuX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlcik7XG4gICAgfSwgciA9PiB7XG4gICAgICAgIFRyYW5zZm9ybVN0cmVhbUVycm9yKHN0cmVhbSwgcik7XG4gICAgICAgIHRocm93IHJlYWRhYmxlLl9zdG9yZWRFcnJvcjtcbiAgICB9KTtcbn1cbi8vIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRTb3VyY2UgQWxnb3JpdGhtc1xuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtRGVmYXVsdFNvdXJjZVB1bGxBbGdvcml0aG0oc3RyZWFtKSB7XG4gICAgLy8gSW52YXJpYW50LiBFbmZvcmNlZCBieSB0aGUgcHJvbWlzZXMgcmV0dXJuZWQgYnkgc3RhcnQoKSBhbmQgcHVsbCgpLlxuICAgIFRyYW5zZm9ybVN0cmVhbVNldEJhY2twcmVzc3VyZShzdHJlYW0sIGZhbHNlKTtcbiAgICAvLyBQcmV2ZW50IHRoZSBuZXh0IHB1bGwoKSBjYWxsIHVudGlsIHRoZXJlIGlzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gc3RyZWFtLl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlO1xufVxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyLlxuZnVuY3Rpb24gZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIucHJvdG90eXBlLiR7bmFtZX0gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyYCk7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgVHJhbnNmb3JtU3RyZWFtLlxuZnVuY3Rpb24gc3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYFRyYW5zZm9ybVN0cmVhbS5wcm90b3R5cGUuJHtuYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIGEgVHJhbnNmb3JtU3RyZWFtYCk7XG59XG5cbmV4cG9ydCB7IEJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3ksIENvdW50UXVldWluZ1N0cmF0ZWd5LCBSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyLCBSZWFkYWJsZVN0cmVhbSwgUmVhZGFibGVTdHJlYW1CWU9CUmVhZGVyLCBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0LCBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLCBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIsIFRyYW5zZm9ybVN0cmVhbSwgVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIsIFdyaXRhYmxlU3RyZWFtLCBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyLCBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbnlmaWxsLmVzMjAxOC5tanMubWFwXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzUpO1xuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInRoaXMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZXZlbnRUYXJnZXRTaGltIiwiQWJvcnRTaWduYWwiLCJFdmVudFRhcmdldCIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJUeXBlRXJyb3IiLCJhYm9ydGVkIiwiYWJvcnRlZEZsYWdzIiwiZ2V0IiwiZGVmaW5lRXZlbnRBdHRyaWJ1dGUiLCJwcm90b3R5cGUiLCJXZWFrTWFwIiwiZGVmaW5lUHJvcGVydGllcyIsImVudW1lcmFibGUiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImNvbmZpZ3VyYWJsZSIsIkFib3J0Q29udHJvbGxlciIsInNpZ25hbHMiLCJzZXQiLCJzaWduYWwiLCJjcmVhdGUiLCJjYWxsIiwiY3JlYXRlQWJvcnRTaWduYWwiLCJnZXRTaWduYWwiLCJhYm9ydCIsImRpc3BhdGNoRXZlbnQiLCJ0eXBlIiwiY29udHJvbGxlciIsIm9wdGlvbnMiLCJmb3JtRGF0YSIsImNvbmZpZyIsIl9fYXNzaWduIiwidXJsIiwidXNlcm5hbWUiLCJFcnJvciIsImtleSIsInJlcXVlc3QiLCJyZXF1ZXN0XzEiLCJtYWlsTGlzdHNNZW1iZXJzIiwibWFpbExpc3RNZW1iZXJzXzEiLCJkb21haW5DcmVkZW50aWFsc0NsaWVudCIsImRvbWFpbnNDcmVkZW50aWFsc18xIiwiZG9tYWluVGVtcGxhdGVzQ2xpZW50IiwiZG9tYWluc1RlbXBsYXRlc18xIiwiZG9tYWluVGFnc0NsaWVudCIsImRvbWFpbnNUYWdzXzEiLCJtdWx0aXBsZVZhbGlkYXRpb25DbGllbnQiLCJtdWx0aXBsZVZhbGlkYXRpb25fMSIsImRvbWFpbnMiLCJkb21haW5zXzEiLCJ3ZWJob29rcyIsIndlYmhvb2tzXzEiLCJldmVudHMiLCJldmVudHNfMSIsInN0YXRzIiwic3RhdHNfMSIsInN1cHByZXNzaW9ucyIsInN1cHByZXNzaW9uc18xIiwibWVzc2FnZXMiLCJtZXNzYWdlc18xIiwicm91dGVzIiwicm91dGVzXzEiLCJpcHMiLCJpcHNfMSIsImlwX3Bvb2xzIiwiaXBfcG9vbHNfMSIsImxpc3RzIiwibGlzdHNfMSIsInZhbGlkYXRlIiwidmFsaWRhdGVfMSIsImRhdGEiLCJyZWNlaXZpbmciLCJzZW5kaW5nIiwibmFtZSIsInJlcXVpcmVfdGxzIiwic2tpcF92ZXJpZmljYXRpb24iLCJzdGF0ZSIsIndpbGRjYXJkIiwic3BhbV9hY3Rpb24iLCJjcmVhdGVkX2F0Iiwic210cF9wYXNzd29yZCIsInNtdHBfbG9naW4iLCJyZWNlaXZpbmdfZG5zX3JlY29yZHMiLCJzZW5kaW5nX2Ruc19yZWNvcmRzIiwiZG9tYWluQ3JlZGVudGlhbHMiLCJkb21haW5UZW1wbGF0ZXMiLCJkb21haW5UYWdzIiwiRG9tYWluQ2xpZW50IiwicmVzcG9uc2UiLCJib2R5IiwiaXRlbXMiLCJtYXAiLCJpdGVtIiwiRG9tYWluIiwiZG9tYWluIiwidHJhY2tpbmciLCJxdWVyeSIsInRoZW4iLCJyZXMiLCJfcGFyc2VEb21haW5MaXN0IiwiX3BhcnNlRG9tYWluIiwicG9zdE9iaiIsImZvcmNlX2RraW1fYXV0aG9yaXR5IiwidG9TdHJpbmciLCJwb3N0V2l0aEZEIiwicHV0IiwiZGVsZXRlIiwiX3BhcnNlTWVzc2FnZSIsImNvbm5lY3Rpb24iLCJfcGFyc2VUcmFja2luZ1NldHRpbmdzIiwiYWN0aXZlIiwiZXJyb3JfMSIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJtZXNzYWdlIiwicHV0V2l0aEZEIiwiX3BhcnNlVHJhY2tpbmdVcGRhdGUiLCJfYSIsImlwIiwicG9vbF9pZCIsInJlcGxhY2VtZW50Iiwic2VhcmNoUGFyYW1zIiwic2VsZiIsImRraW1TZWxlY3RvciIsIndlYlByZWZpeCIsImJhc2VSb3V0ZSIsIkRvbWFpbkNyZWRlbnRpYWxzQ2xpZW50IiwidG90YWxDb3VudCIsInRvdGFsX2NvdW50Iiwic3BlYyIsIl9wYXJzZURvbWFpbkNyZWRlbnRpYWxzTGlzdCIsImNvbmNhdCIsIl9wYXJzZU1lc3NhZ2VSZXNwb25zZSIsImNyZWRlbnRpYWxzTG9naW4iLCJfcGFyc2VEZWxldGVkUmVzcG9uc2UiLCJ0YWdJbmZvIiwidGFnIiwiZGVzY3JpcHRpb24iLCJEYXRlIiwidGFnU3RhdGlzdGljSW5mbyIsInN0YXJ0IiwiZW5kIiwicmVzb2x1dGlvbiIsInN0YXQiLCJ0aW1lIiwiRG9tYWluVGFnc0NsaWVudCIsImVudHJpZXMiLCJwYWdpbmciLCJyZWR1Y2UiLCJhY2MiLCJlbnRyaWUiLCJpZCIsIkRvbWFpblRhZyIsInBhZ2VzIiwiX3BhcnNlUGFnZUxpbmtzIiwiRG9tYWluVGFnU3RhdGlzdGljIiwiX3BhcnNlRG9tYWluVGFnc0xpc3QiLCJfcGFyc2VUYWdTdGF0aXN0aWMiLCJkb21haW5UZW1wbGF0ZUZyb21BUEkiLCJjcmVhdGVkQXQiLCJjcmVhdGVkQnkiLCJ2ZXJzaW9uIiwidmVyc2lvbnMiLCJsZW5ndGgiLCJyZXN1bHQiLCJEb21haW5UZW1wbGF0ZXNDbGllbnQiLCJEb21haW5UZW1wbGF0ZUl0ZW0iLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlTmFtZSIsInRlbXBsYXRlVmVyc2lvbiIsImQiLCJwYXJzZUxpc3QiLCJwYXJzZUNyZWF0aW9uUmVzcG9uc2UiLCJwYXJzZU11dGF0aW9uUmVzcG9uc2UiLCJwYXJzZU5vdGlmaWNhdGlvblJlc3BvbnNlIiwicGFyc2VDcmVhdGlvblZlcnNpb25SZXNwb25zZSIsInBhcnNlTXV0YXRlVGVtcGxhdGVWZXJzaW9uUmVzcG9uc2UiLCJwYXJzZUxpc3RUZW1wbGF0ZVZlcnNpb25zIiwiX2IiLCJib2R5TWVzc2FnZSIsImVycm9yIiwiX3N1cGVyIiwic3RhY2siLCJfdGhpcyIsImRldGFpbHMiLCJfX2V4dGVuZHMiLCJFdmVudENsaWVudCIsInNwbGl0IiwicG9wIiwibnVtYmVyIiwiX3BhcnNlUGFnZU51bWJlciIsInBhaXIiLCJfcGFyc2VQYWdlIiwicXVlcnlDb3B5IiwicGFnZSIsIl9wYXJzZUV2ZW50TGlzdCIsIkZvcm1EYXRhQ29uc3RydWN0b3IiLCJGb3JtRGF0YUJ1aWxkZXIiLCJrZXlzIiwiZmlsdGVyIiwiZm9ybURhdGFBY2MiLCJpbmNsdWRlcyIsImFkZEZpbGVzVG9GRCIsImFkZE1pbWVEYXRhVG9GRCIsImFkZENvbW1vblByb3BlcnR5VG9GRCIsImZvcm1EYXRhSW5zdGFuY2UiLCJ1bmRlZmluZWQiLCJnZXRIZWFkZXJzIiwiaXNTdHJlYW0iLCJmaWxlbmFtZSIsImNvbnRlbnRUeXBlIiwia25vd25MZW5ndGgiLCJpc05vZGVGb3JtRGF0YSIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiYXBwZW5kIiwicHJvcGVydHlOYW1lIiwiYXBwZW5kRmlsZVRvRkQiLCJvYmoiLCJvYmpEYXRhIiwiZ2V0QXR0YWNobWVudE9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwicGlwZSIsIkZvcm1EYXRhIiwiTWFpbGd1biIsImNsaWVudF8xIiwiU3VwcHJlc3Npb25Nb2RlbHMiLCJJcFBvb2xzQ2xpZW50IiwicGFyc2VJcFBvb2xzUmVzcG9uc2UiLCJwb29sSWQiLCJwYXRjaFdpdGhGRCIsIklwc0NsaWVudCIsInBhcnNlSXBzUmVzcG9uc2UiLCJtZW1iZXJzIiwiTGlzdHNDbGllbnQiLCJ2YWxpZGF0aW9uUmVzdWx0IiwibWFpbExpc3RBZGRyZXNzIiwibGlzdCIsInBvc3QiLCJwYXJzZVZhbGlkYXRpb25SZXN1bHQiLCJNYWlsTGlzdHNNZW1iZXJzIiwibmV3RGF0YSIsInZhcnMiLCJKU09OIiwic3RyaW5naWZ5Iiwic3Vic2NyaWJlZCIsIm1haWxMaXN0TWVtYmVyQWRkcmVzcyIsIm1lbWJlciIsInJlcURhdGEiLCJjaGVja0FuZFVwZGF0ZURhdGEiLCJ1cHNlcnQiLCJNZXNzYWdlc0NsaWVudCIsIl9wYXJzZVJlc3BvbnNlIiwiTXVsdGlwbGVWYWxpZGF0aW9uQ2xpZW50IiwibGlzdElkIiwiZmlsZSIsInRpbWVvdXQiLCJoZWFkZXJzIiwiZm9ybURhdGFCdWlsZGVyIiwiZm9ybURhdGFCdWlsZGVyXzEiLCJSZXF1ZXN0IiwibWV0aG9kIiwib25DYWxsT3B0aW9ucyIsImJhc2ljIiwiYmFzZTY0IiwiZW5jb2RlIiwib25DYWxsSGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJwYXJhbXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwidG9Mb2NhbGVVcHBlckNhc2UiLCJ0aHJvd0h0dHBFcnJvcnMiLCJvayIsImdldFJlc3BvbnNlQm9keSIsInJlc18xIiwicmVzcG9uc2VTdHJpbmciLCJ0ZXh0IiwianNvbkJvZHkiLCJwYXJzZSIsImFkZERlZmF1bHRIZWFkZXJzIiwicmVxdWVzdE9wdGlvbnMiLCJjb21tYW5kIiwiY3JlYXRlRm9ybURhdGEiLCJSb3V0ZXNDbGllbnQiLCJyb3V0ZSIsIlN0YXRzQ2xpZW50IiwiYXJyYXlXaXRoUGFpcnMiLCJjdXJyZW50UGFpciIsInJlcGVhdGVkUHJvcGVydHkiLCJwdXNoIiwiU3RhdHMiLCJwcmVwYXJlU2VhcmNoUGFyYW1zIiwiX3BhcnNlU3RhdHMiLCJjcmVhdGVPcHRpb25zIiwiU3VwcmVzc2lvbnNfMSIsIkJPVU5DRVMiLCJhZGRyZXNzIiwiY29kZSIsIlN1cHByZXNzaW9uIiwiQ09NUExBSU5UUyIsIlVOU1VCU0NSSUJFUyIsInRhZ3MiLCJXSElURUxJU1RTIiwicmVhc29uIiwibW9kZWxzIiwiTWFwIiwiQm91bmNlIiwiQ29tcGxhaW50IiwiVW5zdWJzY3JpYmUiLCJXaGl0ZUxpc3QiLCJTdXBwcmVzc2lvbkNsaWVudCIsInBhZ2VVcmwiLCJVUkwiLCJoYXMiLCJNb2RlbCIsInByZXBhcmVSZXNwb25zZSIsImNoZWNrVHlwZSIsIm1vZGVsIiwiX3BhcnNlTGlzdCIsImVuY29kZVVSSUNvbXBvbmVudCIsIl9wYXJzZUl0ZW0iLCJwb3N0RGF0YSIsImNyZWF0ZVdoaXRlTGlzdCIsIm11bHRpcGxlVmFsaWRhdGlvbiIsIlZhbGlkYXRlQ2xpZW50IiwiV2ViaG9va0NsaWVudCIsIndlYmhvb2tSZXNwb25zZSIsIndlYmhvb2siLCJ1cmxzIiwiV2ViaG9vayIsIl9wYXJzZVdlYmhvb2tMaXN0IiwiX3BhcnNlV2ViaG9va1dpdGhJRCIsInRlc3QiLCJfcGFyc2VXZWJob29rVGVzdCIsImZyZWVFeHBvcnRzIiwiZnJlZUdsb2JhbCIsImdsb2JhbCIsIndpbmRvdyIsIkludmFsaWRDaGFyYWN0ZXJFcnJvciIsIlRBQkxFIiwiUkVHRVhfU1BBQ0VfQ0hBUkFDVEVSUyIsImlucHV0IiwiU3RyaW5nIiwiYSIsImIiLCJjIiwiYnVmZmVyIiwicGFkZGluZyIsIm91dHB1dCIsInBvc2l0aW9uIiwiY2hhckNvZGVBdCIsImNoYXJBdCIsInJlcGxhY2UiLCJiaXRTdG9yYWdlIiwiYml0Q291bnRlciIsImluZGV4T2YiLCJmcm9tQ2hhckNvZGUiLCJ1cmkiLCJmaXJzdENvbW1hIiwibWV0YSIsInN1YnN0cmluZyIsImNoYXJzZXQiLCJ0eXBlRnVsbCIsImkiLCJlbmNvZGluZyIsInVuZXNjYXBlIiwiZnJvbSIsInByaXZhdGVEYXRhIiwid3JhcHBlcnMiLCJwZCIsImV2ZW50IiwicmV0diIsImNvbnNvbGUiLCJhc3NlcnQiLCJzZXRDYW5jZWxGbGFnIiwicGFzc2l2ZUxpc3RlbmVyIiwiY2FuY2VsYWJsZSIsImNhbmNlbGVkIiwicHJldmVudERlZmF1bHQiLCJFdmVudCIsImV2ZW50VGFyZ2V0IiwiZXZlbnRQaGFzZSIsImN1cnJlbnRUYXJnZXQiLCJzdG9wcGVkIiwiaW1tZWRpYXRlU3RvcHBlZCIsInRpbWVTdGFtcCIsIm5vdyIsImRlZmluZVJlZGlyZWN0RGVzY3JpcHRvciIsImRlZmluZUNhbGxEZXNjcmlwdG9yIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJnZXRXcmFwcGVyIiwicHJvdG8iLCJ3cmFwcGVyIiwiQmFzZUV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJ3cml0YWJsZSIsImlzRnVuYyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVdyYXBwZXIiLCJnZXRQcm90b3R5cGVPZiIsImlzU3RvcHBlZCIsInNldFBhc3NpdmVMaXN0ZW5lciIsInRhcmdldCIsImNvbXBvc2VkUGF0aCIsIk5PTkUiLCJDQVBUVVJJTkdfUEhBU0UiLCJBVF9UQVJHRVQiLCJCVUJCTElOR19QSEFTRSIsInN0b3BQcm9wYWdhdGlvbiIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImJ1YmJsZXMiLCJCb29sZWFuIiwiZGVmYXVsdFByZXZlbnRlZCIsImNvbXBvc2VkIiwic3JjRWxlbWVudCIsImNhbmNlbEJ1YmJsZSIsInJldHVyblZhbHVlIiwiaW5pdEV2ZW50Iiwic2V0UHJvdG90eXBlT2YiLCJsaXN0ZW5lcnNNYXAiLCJpc09iamVjdCIsIngiLCJnZXRMaXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJldmVudFRhcmdldFByb3RvdHlwZSIsImV2ZW50TmFtZSIsIm5vZGUiLCJsaXN0ZW5lclR5cGUiLCJsaXN0ZW5lciIsIm5leHQiLCJwcmV2IiwibmV3Tm9kZSIsInBhc3NpdmUiLCJvbmNlIiwiZGVmaW5lRXZlbnRBdHRyaWJ1dGVEZXNjcmlwdG9yIiwiZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQiLCJldmVudE5hbWVzIiwiQ3VzdG9tRXZlbnRUYXJnZXQiLCJ0eXBlcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJvcHRpb25zSXNPYmoiLCJjYXB0dXJlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIndyYXBwZWRFdmVudCIsIndyYXBFdmVudCIsImVyciIsImhhbmRsZUV2ZW50Iiwic2V0RXZlbnRQaGFzZSIsInNldEN1cnJlbnRUYXJnZXQiLCJSZWFkYWJsZSIsIndtIiwiQmxvYiIsImJsb2JQYXJ0cyIsInNpemUiLCJwYXJ0cyIsImVsZW1lbnQiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhc3luYyIsImFycmF5QnVmZmVyIiwiVWludDhBcnJheSIsIm9mZnNldCIsImNodW5rIiwic3RyZWFtIiwicGFydCIsInJlYWQiLCJzbGljZSIsInJlbGF0aXZlU3RhcnQiLCJNYXRoIiwibWF4IiwibWluIiwicmVsYXRpdmVFbmQiLCJzcGFuIiwidmFsdWVzIiwiYWRkZWQiLCJibG9iIiwiYXNzaWduIiwic3RhdGljIiwiaGFzSW5zdGFuY2UiLCJvYmplY3QiLCJmZXRjaCIsImhpZ2hXYXRlck1hcmsiLCJIZWFkZXJzIiwiUmVzcG9uc2UiLCJSZWFkYWJsZVN0cmVhbSIsIl8iLCJnbG9iYWxzIiwiZ2V0R2xvYmFsIiwicHJvcGVydHkiLCJnbG9iYWxUaGlzIiwiZ2xvYmFsUHJvcGVydGllcyIsImdsb2JhbE9iamVjdCIsImJpbmQiLCJzdXBwb3J0c0Fib3J0Q29udHJvbGxlciIsInN1cHBvcnRzU3RyZWFtcyIsInN1cHBvcnRzRm9ybURhdGEiLCJtZXJnZUhlYWRlcnMiLCJzb3VyY2UxIiwic291cmNlMiIsImlzSGVhZGVyc0luc3RhbmNlIiwic291cmNlIiwiZGVlcE1lcmdlIiwic291cmNlcyIsInJlcXVlc3RNZXRob2RzIiwicmVzcG9uc2VUeXBlcyIsImpzb24iLCJyZXRyeUFmdGVyU3RhdHVzQ29kZXMiLCJzdG9wIiwiSFRUUEVycm9yIiwiVGltZW91dEVycm9yIiwiZGVsYXkiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsIm5vcm1hbGl6ZVJlcXVlc3RNZXRob2QiLCJ0b1VwcGVyQ2FzZSIsImRlZmF1bHRSZXRyeU9wdGlvbnMiLCJsaW1pdCIsIm1ldGhvZHMiLCJzdGF0dXNDb2RlcyIsImFmdGVyU3RhdHVzQ29kZXMiLCJub3JtYWxpemVSZXRyeU9wdGlvbnMiLCJyZXRyeSIsIm1heFNhZmVUaW1lb3V0IiwiS3kiLCJfcmV0cnlDb3VudCIsIl9pbnB1dCIsIl9vcHRpb25zIiwiY3JlZGVudGlhbHMiLCJob29rcyIsImJlZm9yZVJlcXVlc3QiLCJiZWZvcmVSZXRyeSIsImFmdGVyUmVzcG9uc2UiLCJwcmVmaXhVcmwiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJhYm9ydENvbnRyb2xsZXIiLCJVUkxTZWFyY2hQYXJhbXMiLCJmbiIsIlJhbmdlRXJyb3IiLCJfZmV0Y2giLCJob29rIiwibW9kaWZpZWRSZXNwb25zZSIsIl9kZWNvcmF0ZVJlc3BvbnNlIiwiY2xvbmUiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJfc3RyZWFtIiwiX3JldHJ5IiwibWltZVR5cGUiLCJwYXJzZUpzb24iLCJfY2FsY3VsYXRlUmV0cnlEZWxheSIsInJldHJ5QWZ0ZXIiLCJhZnRlciIsIk51bWJlciIsImlzTmFOIiwibWF4UmV0cnlBZnRlciIsInJldHJ5Q291bnQiLCJyZWplY3QiLCJ0aW1lb3V0SUQiLCJjYXRjaCIsImNsZWFyVGltZW91dCIsInRvdGFsQnl0ZXMiLCJ0cmFuc2ZlcnJlZEJ5dGVzIiwicmVhZGVyIiwiZ2V0UmVhZGVyIiwicGVyY2VudCIsImRvbmUiLCJjbG9zZSIsImVucXVldWUiLCJ2YWxpZGF0ZUFuZE1lcmdlIiwiY3JlYXRlSW5zdGFuY2UiLCJkZWZhdWx0cyIsImt5IiwibmV3RGVmYXVsdHMiLCJleHRlbmQiLCJub3JtYWxpemUiLCJzdHJBcnJheSIsInJlc3VsdEFycmF5IiwibWF0Y2giLCJmaXJzdCIsInNoaWZ0IiwiY29tcG9uZW50Iiwic3RyIiwiam9pbiIsImRlZmluaXRpb24iLCJyZXF1aXJlIiwiaHR0cCIsImh0dHBzIiwiemxpYiIsIlN0cmVhbSIsImRhdGFVcmlUb0J1ZmZlciIsInV0aWwiLCJjcnlwdG8iLCJGZXRjaEJhc2VFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwiRmV0Y2hFcnJvciIsInN5c3RlbUVycm9yIiwiZXJybm8iLCJlcnJvcmVkU3lzQ2FsbCIsInN5c2NhbGwiLCJOQU1FIiwiaXNVUkxTZWFyY2hQYXJhbWV0ZXJzIiwiZ2V0QWxsIiwic29ydCIsImlzQmxvYiIsImlzRm9ybURhdGEiLCJjYXJyaWFnZSIsImRhc2hlcyIsInJlcGVhdCIsImNhcnJpYWdlTGVuZ3RoIiwiZ2V0Rm9vdGVyIiwiYm91bmRhcnkiLCJnZXRIZWFkZXIiLCJmaWVsZCIsImhlYWRlciIsIklOVEVSTkFMUyIsIkJvZHkiLCJpc0FueUFycmF5QnVmZmVyIiwicmFuZG9tQnl0ZXMiLCJmb3JtIiwiZm9ybURhdGFJdGVyYXRvciIsImRpc3R1cmJlZCIsIm9uIiwiYm9keVVzZWQiLCJjb25zdW1lQm9keSIsImN0IiwiYnVmIiwiYWxsb2MiLCJhY2N1bSIsImFjY3VtQnl0ZXMiLCJkZXN0cm95IiwicmVhZGFibGVFbmRlZCIsIl9yZWFkYWJsZVN0YXRlIiwiZW5kZWQiLCJldmVyeSIsImluc3RhbmNlIiwicDEiLCJwMiIsImdldEJvdW5kYXJ5IiwiUGFzc1Rocm91Z2giLCJleHRyYWN0Q29udGVudFR5cGUiLCJnZXRUb3RhbEJ5dGVzIiwiZ2V0TGVuZ3RoU3luYyIsImhhc0tub3duTGVuZ3RoIiwiZ2V0Rm9ybURhdGFMZW5ndGgiLCJ2YWxpZGF0ZUhlYWRlck5hbWUiLCJ2YWxpZGF0ZUhlYWRlclZhbHVlIiwiaW5pdCIsInJhdyIsImlzQm94ZWRQcmltaXRpdmUiLCJpdGVyYXRvciIsIlByb3h5IiwicCIsInJlY2VpdmVyIiwiU2V0IiwiUmVmbGVjdCIsImNhbGxiYWNrIiwiZm9yIiwicmVkaXJlY3RTdGF0dXMiLCJpc1JlZGlyZWN0IiwiSU5URVJOQUxTJDEiLCJjb3VudGVyIiwicmVkaXJlY3RlZCIsImxvY2F0aW9uIiwiSU5URVJOQUxTJDIiLCJpc1JlcXVlc3QiLCJwYXJzZWRVUkwiLCJpbnB1dEJvZHkiLCJyZWRpcmVjdCIsImZvbGxvdyIsImNvbXByZXNzIiwiYWdlbnQiLCJpbnNlY3VyZUhUVFBQYXJzZXIiLCJmb3JtYXQiLCJBYm9ydEVycm9yIiwic3VwcG9ydGVkU2NoZW1hcyIsIm9wdGlvbnNfIiwiY29udGVudExlbmd0aFZhbHVlIiwic2VhcmNoIiwibGFzdE9mZnNldCIsImhyZWYiLCJoYXNoIiwiZ2V0U2VhcmNoIiwicGF0aCIsInBhdGhuYW1lIiwiaG9zdG5hbWUiLCJwcm90b2NvbCIsInBvcnQiLCJnZXROb2RlUmVxdWVzdE9wdGlvbnMiLCJzZW5kIiwiZW1pdCIsImFib3J0QW5kRmluYWxpemUiLCJmaW5hbGl6ZSIsInJlcXVlc3RfIiwicmVzcG9uc2VfIiwiaW5kZXgiLCJhcnJheSIsImZyb21SYXdIZWFkZXJzIiwicmF3SGVhZGVycyIsInN0YXR1c0NvZGUiLCJsb2NhdGlvblVSTCIsInBpcGVsaW5lIiwicHJvY2VzcyIsInJlc3BvbnNlT3B0aW9ucyIsInN0YXR1c01lc3NhZ2UiLCJjb2RpbmdzIiwiemxpYk9wdGlvbnMiLCJmbHVzaCIsIlpfU1lOQ19GTFVTSCIsImZpbmlzaEZsdXNoIiwiY3JlYXRlR3VuemlwIiwiY3JlYXRlQnJvdGxpRGVjb21wcmVzcyIsImNyZWF0ZUluZmxhdGUiLCJjcmVhdGVJbmZsYXRlUmF3IiwiZGVzdCIsIndyaXRlIiwid3JpdGVUb1N0cmVhbSIsIlN5bWJvbFBvbHlmaWxsIiwibm9vcCIsInR5cGVJc09iamVjdCIsInJldGhyb3dBc3NlcnRpb25FcnJvclJlamVjdGlvbiIsIm9yaWdpbmFsUHJvbWlzZSIsIm9yaWdpbmFsUHJvbWlzZVRoZW4iLCJvcmlnaW5hbFByb21pc2VSZXNvbHZlIiwib3JpZ2luYWxQcm9taXNlUmVqZWN0IiwibmV3UHJvbWlzZSIsImV4ZWN1dG9yIiwicHJvbWlzZVJlc29sdmVkV2l0aCIsInByb21pc2VSZWplY3RlZFdpdGgiLCJQZXJmb3JtUHJvbWlzZVRoZW4iLCJwcm9taXNlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwidXBvblByb21pc2UiLCJ1cG9uRnVsZmlsbG1lbnQiLCJ1cG9uUmVqZWN0aW9uIiwidHJhbnNmb3JtUHJvbWlzZVdpdGgiLCJmdWxmaWxsbWVudEhhbmRsZXIiLCJyZWplY3Rpb25IYW5kbGVyIiwic2V0UHJvbWlzZUlzSGFuZGxlZFRvVHJ1ZSIsInF1ZXVlTWljcm90YXNrIiwiZ2xvYmFsUXVldWVNaWNyb3Rhc2siLCJyZXNvbHZlZFByb21pc2UiLCJyZWZsZWN0Q2FsbCIsIkYiLCJWIiwiYXJncyIsIkZ1bmN0aW9uIiwicHJvbWlzZUNhbGwiLCJTaW1wbGVRdWV1ZSIsIl9jdXJzb3IiLCJfc2l6ZSIsIl9mcm9udCIsIl9lbGVtZW50cyIsIl9uZXh0IiwiX2JhY2siLCJvbGRCYWNrIiwibmV3QmFjayIsIlFVRVVFX01BWF9BUlJBWV9TSVpFIiwib2xkRnJvbnQiLCJuZXdGcm9udCIsIm9sZEN1cnNvciIsIm5ld0N1cnNvciIsImVsZW1lbnRzIiwicGVlayIsImZyb250IiwiY3Vyc29yIiwiUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljSW5pdGlhbGl6ZSIsIl9vd25lclJlYWRhYmxlU3RyZWFtIiwiX3JlYWRlciIsIl9zdGF0ZSIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZSIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlUmVzb2x2ZSIsImRlZmF1bHRSZWFkZXJDbG9zZWRQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkIiwiX3N0b3JlZEVycm9yIiwiUmVhZGFibGVTdHJlYW1SZWFkZXJHZW5lcmljQ2FuY2VsIiwiUmVhZGFibGVTdHJlYW1DYW5jZWwiLCJSZWFkYWJsZVN0cmVhbVJlYWRlckdlbmVyaWNSZWxlYXNlIiwiZGVmYXVsdFJlYWRlckNsb3NlZFByb21pc2VSZWplY3QiLCJkZWZhdWx0UmVhZGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCIsInJlYWRlckxvY2tFeGNlcHRpb24iLCJfY2xvc2VkUHJvbWlzZSIsIl9jbG9zZWRQcm9taXNlX3Jlc29sdmUiLCJfY2xvc2VkUHJvbWlzZV9yZWplY3QiLCJBYm9ydFN0ZXBzIiwiRXJyb3JTdGVwcyIsIkNhbmNlbFN0ZXBzIiwiUHVsbFN0ZXBzIiwiTnVtYmVySXNGaW5pdGUiLCJpc0Zpbml0ZSIsIk1hdGhUcnVuYyIsInRydW5jIiwidiIsImNlaWwiLCJmbG9vciIsImFzc2VydERpY3Rpb25hcnkiLCJjb250ZXh0IiwiYXNzZXJ0RnVuY3Rpb24iLCJhc3NlcnRPYmplY3QiLCJhc3NlcnRSZXF1aXJlZEFyZ3VtZW50IiwiYXNzZXJ0UmVxdWlyZWRGaWVsZCIsImNvbnZlcnRVbnJlc3RyaWN0ZWREb3VibGUiLCJjZW5zb3JOZWdhdGl2ZVplcm8iLCJjb252ZXJ0VW5zaWduZWRMb25nTG9uZ1dpdGhFbmZvcmNlUmFuZ2UiLCJ1cHBlckJvdW5kIiwiTUFYX1NBRkVfSU5URUdFUiIsImludGVnZXJQYXJ0IiwiYXNzZXJ0UmVhZGFibGVTdHJlYW0iLCJJc1JlYWRhYmxlU3RyZWFtIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciIsIlJlYWRhYmxlU3RyZWFtQWRkUmVhZFJlcXVlc3QiLCJyZWFkUmVxdWVzdCIsIl9yZWFkUmVxdWVzdHMiLCJSZWFkYWJsZVN0cmVhbUZ1bGZpbGxSZWFkUmVxdWVzdCIsIl9jbG9zZVN0ZXBzIiwiX2NodW5rU3RlcHMiLCJSZWFkYWJsZVN0cmVhbUdldE51bVJlYWRSZXF1ZXN0cyIsIlJlYWRhYmxlU3RyZWFtSGFzRGVmYXVsdFJlYWRlciIsIklzUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIiwiSXNSZWFkYWJsZVN0cmVhbUxvY2tlZCIsImNsb3NlZCIsImRlZmF1bHRSZWFkZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiY2FuY2VsIiwicmVzb2x2ZVByb21pc2UiLCJyZWplY3RQcm9taXNlIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyUmVhZCIsIl9lcnJvclN0ZXBzIiwiZSIsInJlbGVhc2VMb2NrIiwiaGFzT3duUHJvcGVydHkiLCJfZGlzdHVyYmVkIiwiX3JlYWRhYmxlU3RyZWFtQ29udHJvbGxlciIsIkFzeW5jSXRlcmF0b3JQcm90b3R5cGUiLCJSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JJbXBsIiwicHJldmVudENhbmNlbCIsIl9vbmdvaW5nUHJvbWlzZSIsIl9pc0ZpbmlzaGVkIiwiX3ByZXZlbnRDYW5jZWwiLCJuZXh0U3RlcHMiLCJfbmV4dFN0ZXBzIiwicmV0dXJuIiwicmV0dXJuU3RlcHMiLCJfcmV0dXJuU3RlcHMiLCJSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUiLCJJc1JlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciIsIl9hc3luY0l0ZXJhdG9ySW1wbCIsInN0cmVhbUFzeW5jSXRlcmF0b3JCcmFuZENoZWNrRXhjZXB0aW9uIiwiTnVtYmVySXNOYU4iLCJDcmVhdGVBcnJheUZyb21MaXN0IiwiQ29weURhdGFCbG9ja0J5dGVzIiwiZGVzdE9mZnNldCIsInNyYyIsInNyY09mZnNldCIsIm4iLCJBcnJheUJ1ZmZlclNsaWNlIiwiYmVnaW4iLCJDbG9uZUFzVWludDhBcnJheSIsIk8iLCJEZXF1ZXVlVmFsdWUiLCJjb250YWluZXIiLCJfcXVldWUiLCJfcXVldWVUb3RhbFNpemUiLCJFbnF1ZXVlVmFsdWVXaXRoU2l6ZSIsIkluZmluaXR5IiwiUmVzZXRRdWV1ZSIsIlJlYWRhYmxlU3RyZWFtQllPQlJlcXVlc3QiLCJ2aWV3IiwiSXNSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0IiwiYnlvYlJlcXVlc3RCcmFuZENoZWNrRXhjZXB0aW9uIiwiX3ZpZXciLCJyZXNwb25kIiwiYnl0ZXNXcml0dGVuIiwiX2Fzc29jaWF0ZWRSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmQiLCJyZXNwb25kV2l0aE5ld1ZpZXciLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZFdpdGhOZXdWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlciIsImJ5b2JSZXF1ZXN0IiwiSXNSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyIiwiYnl0ZVN0cmVhbUNvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckdldEJZT0JSZXF1ZXN0IiwiZGVzaXJlZFNpemUiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJfY2xvc2VSZXF1ZXN0ZWQiLCJfY29udHJvbGxlZFJlYWRhYmxlQnl0ZVN0cmVhbSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDbG9zZSIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckVycm9yIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNsZWFyUGVuZGluZ1B1bGxJbnRvcyIsIl9jYW5jZWxBbGdvcml0aG0iLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2xlYXJBbGdvcml0aG1zIiwiZW50cnkiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVySGFuZGxlUXVldWVEcmFpbiIsImF1dG9BbGxvY2F0ZUNodW5rU2l6ZSIsIl9hdXRvQWxsb2NhdGVDaHVua1NpemUiLCJidWZmZXJFIiwicHVsbEludG9EZXNjcmlwdG9yIiwiYnVmZmVyQnl0ZUxlbmd0aCIsImJ5dGVzRmlsbGVkIiwiZWxlbWVudFNpemUiLCJ2aWV3Q29uc3RydWN0b3IiLCJyZWFkZXJUeXBlIiwiX3BlbmRpbmdQdWxsSW50b3MiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyQ2FsbFB1bGxJZk5lZWRlZCIsInNob3VsZFB1bGwiLCJfc3RhcnRlZCIsIlJlYWRhYmxlU3RyZWFtSGFzQllPQlJlYWRlciIsIlJlYWRhYmxlU3RyZWFtR2V0TnVtUmVhZEludG9SZXF1ZXN0cyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJTaG91bGRDYWxsUHVsbCIsIl9wdWxsaW5nIiwiX3B1bGxBZ2FpbiIsIl9wdWxsQWxnb3JpdGhtIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckludmFsaWRhdGVCWU9CUmVxdWVzdCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJDb21taXRQdWxsSW50b0Rlc2NyaXB0b3IiLCJmaWxsZWRWaWV3IiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckNvbnZlcnRQdWxsSW50b0Rlc2NyaXB0b3IiLCJyZWFkSW50b1JlcXVlc3QiLCJfcmVhZEludG9SZXF1ZXN0cyIsIlJlYWRhYmxlU3RyZWFtRnVsZmlsbFJlYWRJbnRvUmVxdWVzdCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJFbnF1ZXVlQ2h1bmtUb1F1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlckZpbGxQdWxsSW50b0Rlc2NyaXB0b3JGcm9tUXVldWUiLCJjdXJyZW50QWxpZ25lZEJ5dGVzIiwibWF4Qnl0ZXNUb0NvcHkiLCJtYXhCeXRlc0ZpbGxlZCIsIm1heEFsaWduZWRCeXRlcyIsInRvdGFsQnl0ZXNUb0NvcHlSZW1haW5pbmciLCJyZWFkeSIsInF1ZXVlIiwiaGVhZE9mUXVldWUiLCJieXRlc1RvQ29weSIsImRlc3RTdGFydCIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGaWxsSGVhZFB1bGxJbnRvRGVzY3JpcHRvciIsIlJlYWRhYmxlU3RyZWFtQ2xvc2UiLCJfYnlvYlJlcXVlc3QiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUHJvY2Vzc1B1bGxJbnRvRGVzY3JpcHRvcnNVc2luZ1F1ZXVlIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclNoaWZ0UGVuZGluZ1B1bGxJbnRvIiwiUmVhZGFibGVCeXRlU3RyZWFtQ29udHJvbGxlclJlc3BvbmRJbnRlcm5hbCIsImZpcnN0RGVzY3JpcHRvciIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJSZXNwb25kSW5DbG9zZWRTdGF0ZSIsInJlbWFpbmRlclNpemUiLCJyZW1haW5kZXIiLCJSZWFkYWJsZUJ5dGVTdHJlYW1Db250cm9sbGVyUmVzcG9uZEluUmVhZGFibGVTdGF0ZSIsInRyYW5zZmVycmVkQnVmZmVyIiwiZmlyc3RQZW5kaW5nUHVsbEludG8iLCJSZWFkYWJsZVN0cmVhbUVycm9yIiwiU2V0VXBSZWFkYWJsZVN0cmVhbUJZT0JSZXF1ZXN0IiwiX3N0cmF0ZWd5SFdNIiwidmlld0J5dGVMZW5ndGgiLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXIiLCJzdGFydEFsZ29yaXRobSIsInB1bGxBbGdvcml0aG0iLCJjYW5jZWxBbGdvcml0aG0iLCJyIiwiQWNxdWlyZVJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciIsIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlciIsIlJlYWRhYmxlU3RyZWFtQWRkUmVhZEludG9SZXF1ZXN0IiwiSXNSZWFkYWJsZVN0cmVhbUJZT0JSZWFkZXIiLCJieW9iUmVhZGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsIlJlYWRhYmxlU3RyZWFtQllPQlJlYWRlclJlYWQiLCJEYXRhVmlldyIsIkJZVEVTX1BFUl9FTEVNRU5UIiwiY3RvciIsImVtcHR5VmlldyIsIlJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJQdWxsSW50byIsIkV4dHJhY3RIaWdoV2F0ZXJNYXJrIiwic3RyYXRlZ3kiLCJkZWZhdWx0SFdNIiwiRXh0cmFjdFNpemVBbGdvcml0aG0iLCJjb252ZXJ0UXVldWluZ1N0cmF0ZWd5IiwiY29udmVydFF1ZXVpbmdTdHJhdGVneVNpemUiLCJjb252ZXJ0VW5kZXJseWluZ1NpbmtBYm9ydENhbGxiYWNrIiwib3JpZ2luYWwiLCJjb252ZXJ0VW5kZXJseWluZ1NpbmtDbG9zZUNhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTaW5rU3RhcnRDYWxsYmFjayIsImNvbnZlcnRVbmRlcmx5aW5nU2lua1dyaXRlQ2FsbGJhY2siLCJhc3NlcnRXcml0YWJsZVN0cmVhbSIsIklzV3JpdGFibGVTdHJlYW0iLCJXcml0YWJsZVN0cmVhbSIsInJhd1VuZGVybHlpbmdTaW5rIiwicmF3U3RyYXRlZ3kiLCJ1bmRlcmx5aW5nU2luayIsImNvbnZlcnRVbmRlcmx5aW5nU2luayIsIkluaXRpYWxpemVXcml0YWJsZVN0cmVhbSIsInNpemVBbGdvcml0aG0iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwid3JpdGVBbGdvcml0aG0iLCJjbG9zZUFsZ29yaXRobSIsImFib3J0QWxnb3JpdGhtIiwiU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiU2V0VXBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRnJvbVVuZGVybHlpbmdTaW5rIiwibG9ja2VkIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQyIiwiSXNXcml0YWJsZVN0cmVhbUxvY2tlZCIsIldyaXRhYmxlU3RyZWFtQWJvcnQiLCJXcml0YWJsZVN0cmVhbUNsb3NlUXVldWVkT3JJbkZsaWdodCIsIldyaXRhYmxlU3RyZWFtQ2xvc2UiLCJnZXRXcml0ZXIiLCJBY3F1aXJlV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIiwiX3dyaXRlciIsIl93cml0YWJsZVN0cmVhbUNvbnRyb2xsZXIiLCJfd3JpdGVSZXF1ZXN0cyIsIl9pbkZsaWdodFdyaXRlUmVxdWVzdCIsIl9jbG9zZVJlcXVlc3QiLCJfaW5GbGlnaHRDbG9zZVJlcXVlc3QiLCJfcGVuZGluZ0Fib3J0UmVxdWVzdCIsIl9iYWNrcHJlc3N1cmUiLCJfYWJvcnRSZWFzb24iLCJfYWJvcnRDb250cm9sbGVyIiwiX3Byb21pc2UiLCJ3YXNBbHJlYWR5RXJyb3JpbmciLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJfcmVhc29uIiwiX3dhc0FscmVhZHlFcnJvcmluZyIsIldyaXRhYmxlU3RyZWFtU3RhcnRFcnJvcmluZyIsImNsb3NlUmVxdWVzdCIsIndyaXRlciIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZXNvbHZlIiwiY2xvc2VTZW50aW5lbCIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJBZHZhbmNlUXVldWVJZk5lZWRlZCIsIldyaXRhYmxlU3RyZWFtRGVhbFdpdGhSZWplY3Rpb24iLCJXcml0YWJsZVN0cmVhbUZpbmlzaEVycm9yaW5nIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyRW5zdXJlUmVhZHlQcm9taXNlUmVqZWN0ZWQiLCJXcml0YWJsZVN0cmVhbUhhc09wZXJhdGlvbk1hcmtlZEluRmxpZ2h0Iiwic3RvcmVkRXJyb3IiLCJ3cml0ZVJlcXVlc3QiLCJXcml0YWJsZVN0cmVhbVJlamVjdENsb3NlQW5kQ2xvc2VkUHJvbWlzZUlmTmVlZGVkIiwiYWJvcnRSZXF1ZXN0IiwiZGVmYXVsdFdyaXRlckNsb3NlZFByb21pc2VSZWplY3QiLCJXcml0YWJsZVN0cmVhbVVwZGF0ZUJhY2twcmVzc3VyZSIsImJhY2twcmVzc3VyZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VJbml0aWFsaXplIiwiZGVmYXVsdFdyaXRlclJlYWR5UHJvbWlzZVJlc2V0IiwiX293bmVyV3JpdGFibGVTdHJlYW0iLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVzb2x2ZWQiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemUiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlSW5pdGlhbGl6ZUFzUmVqZWN0ZWQiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc29sdmUiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZUluaXRpYWxpemVBc1JlamVjdGVkIiwiSXNXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIiLCJkZWZhdWx0V3JpdGVyQnJhbmRDaGVja0V4Y2VwdGlvbiIsImRlZmF1bHRXcml0ZXJMb2NrRXhjZXB0aW9uIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckdldERlc2lyZWRTaXplIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyR2V0RGVzaXJlZFNpemUiLCJfcmVhZHlQcm9taXNlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyQWJvcnQiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlclJlbGVhc2UiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJXcml0ZSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlckVuc3VyZUNsb3NlZFByb21pc2VSZWplY3RlZCIsIl9jbG9zZWRQcm9taXNlU3RhdGUiLCJkZWZhdWx0V3JpdGVyQ2xvc2VkUHJvbWlzZVJlc2V0VG9SZWplY3RlZCIsIl9yZWFkeVByb21pc2VTdGF0ZSIsImRlZmF1bHRXcml0ZXJSZWFkeVByb21pc2VSZWplY3QiLCJkZWZhdWx0V3JpdGVyUmVhZHlQcm9taXNlUmVzZXRUb1JlamVjdGVkIiwicmVsZWFzZWRFcnJvciIsImNodW5rU2l6ZSIsIl9zdHJhdGVneVNpemVBbGdvcml0aG0iLCJjaHVua1NpemVFIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckVycm9ySWZOZWVkZWQiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0Q2h1bmtTaXplIiwiV3JpdGFibGVTdHJlYW1BZGRXcml0ZVJlcXVlc3QiLCJlbnF1ZXVlRSIsIl9jb250cm9sbGVkV3JpdGFibGVTdHJlYW0iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0QmFja3ByZXNzdXJlIiwiV3JpdGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcldyaXRlIiwiYWJvcnRSZWFzb24iLCJJc1dyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24kMiIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciIsIl9hYm9ydEFsZ29yaXRobSIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMiLCJjcmVhdGVBYm9ydENvbnRyb2xsZXIiLCJfd3JpdGVBbGdvcml0aG0iLCJfY2xvc2VBbGdvcml0aG0iLCJXcml0YWJsZVN0cmVhbU1hcmtDbG9zZVJlcXVlc3RJbkZsaWdodCIsInNpbmtDbG9zZVByb21pc2UiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2UiLCJXcml0YWJsZVN0cmVhbUZpbmlzaEluRmxpZ2h0Q2xvc2VXaXRoRXJyb3IiLCJXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyUHJvY2Vzc0Nsb3NlIiwiV3JpdGFibGVTdHJlYW1NYXJrRmlyc3RXcml0ZVJlcXVlc3RJbkZsaWdodCIsIldyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZSIsIldyaXRhYmxlU3RyZWFtRmluaXNoSW5GbGlnaHRXcml0ZVdpdGhFcnJvciIsIldyaXRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJQcm9jZXNzV3JpdGUiLCJfcmVhZHlQcm9taXNlX3Jlc29sdmUiLCJfcmVhZHlQcm9taXNlX3JlamVjdCIsIk5hdGl2ZURPTUV4Y2VwdGlvbiIsIkRPTUV4Y2VwdGlvbiIsIkRPTUV4Y2VwdGlvbiQxIiwiaXNET01FeGNlcHRpb25Db25zdHJ1Y3RvciIsImNyZWF0ZURPTUV4Y2VwdGlvblBvbHlmaWxsIiwiUmVhZGFibGVTdHJlYW1QaXBlVG8iLCJwcmV2ZW50Q2xvc2UiLCJwcmV2ZW50QWJvcnQiLCJzaHV0dGluZ0Rvd24iLCJjdXJyZW50V3JpdGUiLCJhY3Rpb25zIiwic2h1dGRvd25XaXRoQWN0aW9uIiwiYWxsIiwiYWN0aW9uIiwiaXNPckJlY29tZXNFcnJvcmVkIiwic2h1dGRvd24iLCJXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXJDbG9zZVdpdGhFcnJvclByb3BhZ2F0aW9uIiwiZGVzdENsb3NlZCIsIndhaXRGb3JXcml0ZXNUb0ZpbmlzaCIsIm9sZEN1cnJlbnRXcml0ZSIsIm9yaWdpbmFsSXNFcnJvciIsIm9yaWdpbmFsRXJyb3IiLCJkb1RoZVJlc3QiLCJuZXdFcnJvciIsImlzRXJyb3IiLCJyZXNvbHZlTG9vcCIsInJlamVjdExvb3AiLCJyZXNvbHZlUmVhZCIsInJlamVjdFJlYWQiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiSXNSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiZGVmYXVsdENvbnRyb2xsZXJCcmFuZENoZWNrRXhjZXB0aW9uJDEiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyR2V0RGVzaXJlZFNpemUiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2FuQ2xvc2VPckVucXVldWUiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyQ2xvc2UiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyRW5xdWV1ZSIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJFcnJvciIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJDbGVhckFsZ29yaXRobXMiLCJfY29udHJvbGxlZFJlYWRhYmxlU3RyZWFtIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckNhbGxQdWxsSWZOZWVkZWQiLCJSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyU2hvdWxkQ2FsbFB1bGwiLCJTZXRVcFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJSZWFkYWJsZVN0cmVhbVRlZSIsImNsb25lRm9yQnJhbmNoMiIsInJlYXNvbjEiLCJyZWFzb24yIiwiYnJhbmNoMSIsImJyYW5jaDIiLCJyZXNvbHZlQ2FuY2VsUHJvbWlzZSIsInJlYWRpbmciLCJyZWFkQWdhaW5Gb3JCcmFuY2gxIiwicmVhZEFnYWluRm9yQnJhbmNoMiIsImNhbmNlbGVkMSIsImNhbmNlbGVkMiIsImNhbmNlbFByb21pc2UiLCJmb3J3YXJkUmVhZGVyRXJyb3IiLCJ0aGlzUmVhZGVyIiwicHVsbFdpdGhEZWZhdWx0UmVhZGVyIiwiY2h1bmsxIiwiY2h1bmsyIiwiY2xvbmVFIiwicHVsbDFBbGdvcml0aG0iLCJwdWxsMkFsZ29yaXRobSIsInB1bGxXaXRoQllPQlJlYWRlciIsImZvckJyYW5jaDIiLCJieW9iQnJhbmNoIiwib3RoZXJCcmFuY2giLCJieW9iQ2FuY2VsZWQiLCJjbG9uZWRDaHVuayIsIm90aGVyQ2FuY2VsZWQiLCJjYW5jZWwxQWxnb3JpdGhtIiwiY29tcG9zaXRlUmVhc29uIiwiY2FuY2VsUmVzdWx0IiwiY2FuY2VsMkFsZ29yaXRobSIsIkNyZWF0ZVJlYWRhYmxlQnl0ZVN0cmVhbSIsIlJlYWRhYmxlQnl0ZVN0cmVhbVRlZSIsInJlYWRBZ2FpbiIsIkNyZWF0ZVJlYWRhYmxlU3RyZWFtIiwiUmVhZGFibGVTdHJlYW1EZWZhdWx0VGVlIiwiY29udmVydFVuZGVybHlpbmdTb3VyY2VDYW5jZWxDYWxsYmFjayIsImNvbnZlcnRVbmRlcmx5aW5nU291cmNlUHVsbENhbGxiYWNrIiwiY29udmVydFVuZGVybHlpbmdTb3VyY2VTdGFydENhbGxiYWNrIiwiY29udmVydFJlYWRhYmxlU3RyZWFtVHlwZSIsImNvbnZlcnRSZWFkYWJsZVN0cmVhbVJlYWRlck1vZGUiLCJtb2RlIiwiY29udmVydFBpcGVPcHRpb25zIiwiaXNBYm9ydFNpZ25hbCIsImFzc2VydEFib3J0U2lnbmFsIiwicmF3VW5kZXJseWluZ1NvdXJjZSIsInVuZGVybHlpbmdTb3VyY2UiLCJwdWxsIiwiY29udmVydFVuZGVybHlpbmdEZWZhdWx0T3JCeXRlU291cmNlIiwiSW5pdGlhbGl6ZVJlYWRhYmxlU3RyZWFtIiwidW5kZXJseWluZ0J5dGVTb3VyY2UiLCJTZXRVcFJlYWRhYmxlQnl0ZVN0cmVhbUNvbnRyb2xsZXJGcm9tVW5kZXJseWluZ1NvdXJjZSIsIlNldFVwUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21VbmRlcmx5aW5nU291cmNlIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiQxIiwicmF3T3B0aW9ucyIsImNvbnZlcnRSZWFkZXJPcHRpb25zIiwicGlwZVRocm91Z2giLCJyYXdUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJyZWFkYWJsZSIsImNvbnZlcnRSZWFkYWJsZVdyaXRhYmxlUGFpciIsInBpcGVUbyIsImRlc3RpbmF0aW9uIiwidGVlIiwiaW1wbCIsIkFjcXVpcmVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IiLCJjb252ZXJ0SXRlcmF0b3JPcHRpb25zIiwiY29udmVydFF1ZXVpbmdTdHJhdGVneUluaXQiLCJhc3luY0l0ZXJhdG9yIiwiYnl0ZUxlbmd0aFNpemVGdW5jdGlvbiIsIkJ5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kiLCJfYnl0ZUxlbmd0aFF1ZXVpbmdTdHJhdGVneUhpZ2hXYXRlck1hcmsiLCJJc0J5dGVMZW5ndGhRdWV1aW5nU3RyYXRlZ3kiLCJieXRlTGVuZ3RoQnJhbmRDaGVja0V4Y2VwdGlvbiIsImNvdW50U2l6ZUZ1bmN0aW9uIiwiQ291bnRRdWV1aW5nU3RyYXRlZ3kiLCJfY291bnRRdWV1aW5nU3RyYXRlZ3lIaWdoV2F0ZXJNYXJrIiwiSXNDb3VudFF1ZXVpbmdTdHJhdGVneSIsImNvdW50QnJhbmRDaGVja0V4Y2VwdGlvbiIsImNvbnZlcnRUcmFuc2Zvcm1lckZsdXNoQ2FsbGJhY2siLCJjb252ZXJ0VHJhbnNmb3JtZXJTdGFydENhbGxiYWNrIiwiY29udmVydFRyYW5zZm9ybWVyVHJhbnNmb3JtQ2FsbGJhY2siLCJUcmFuc2Zvcm1TdHJlYW0iLCJyYXdUcmFuc2Zvcm1lciIsInJhd1dyaXRhYmxlU3RyYXRlZ3kiLCJyYXdSZWFkYWJsZVN0cmF0ZWd5Iiwid3JpdGFibGVTdHJhdGVneSIsInJlYWRhYmxlU3RyYXRlZ3kiLCJ0cmFuc2Zvcm1lciIsInJlYWRhYmxlVHlwZSIsIndyaXRhYmxlVHlwZSIsImNvbnZlcnRUcmFuc2Zvcm1lciIsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsInJlYWRhYmxlU2l6ZUFsZ29yaXRobSIsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsIndyaXRhYmxlU2l6ZUFsZ29yaXRobSIsInN0YXJ0UHJvbWlzZV9yZXNvbHZlIiwic3RhcnRQcm9taXNlIiwiX3RyYW5zZm9ybVN0cmVhbUNvbnRyb2xsZXIiLCJfYmFja3ByZXNzdXJlQ2hhbmdlUHJvbWlzZSIsIl93cml0YWJsZSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyUGVyZm9ybVRyYW5zZm9ybSIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rV3JpdGVBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1FcnJvciIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQWJvcnRBbGdvcml0aG0iLCJfcmVhZGFibGUiLCJmbHVzaFByb21pc2UiLCJfZmx1c2hBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckNsZWFyQWxnb3JpdGhtcyIsIlRyYW5zZm9ybVN0cmVhbURlZmF1bHRTaW5rQ2xvc2VBbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1TZXRCYWNrcHJlc3N1cmUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0U291cmNlUHVsbEFsZ29yaXRobSIsIlRyYW5zZm9ybVN0cmVhbUVycm9yV3JpdGFibGVBbmRVbmJsb2NrV3JpdGUiLCJDcmVhdGVXcml0YWJsZVN0cmVhbSIsIl9iYWNrcHJlc3N1cmVDaGFuZ2VQcm9taXNlX3Jlc29sdmUiLCJJbml0aWFsaXplVHJhbnNmb3JtU3RyZWFtIiwiVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJ0cmFuc2Zvcm1BbGdvcml0aG0iLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckVucXVldWUiLCJ0cmFuc2Zvcm1SZXN1bHRFIiwiZmx1c2hBbGdvcml0aG0iLCJfY29udHJvbGxlZFRyYW5zZm9ybVN0cmVhbSIsIl90cmFuc2Zvcm1BbGdvcml0aG0iLCJTZXRVcFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyIiwiU2V0VXBUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlckZyb21UcmFuc2Zvcm1lciIsIklzVHJhbnNmb3JtU3RyZWFtIiwic3RyZWFtQnJhbmRDaGVja0V4Y2VwdGlvbiIsIklzVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXIiLCJkZWZhdWx0Q29udHJvbGxlckJyYW5kQ2hlY2tFeGNlcHRpb24iLCJ0ZXJtaW5hdGUiLCJUcmFuc2Zvcm1TdHJlYW1EZWZhdWx0Q29udHJvbGxlclRlcm1pbmF0ZSIsInJlYWRhYmxlQ29udHJvbGxlciIsIlJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXJIYXNCYWNrcHJlc3N1cmUiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJsb2FkZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibyIsInByb3AiLCJubWQiLCJwYXRocyIsImNoaWxkcmVuIiwiX193ZWJwYWNrX2V4cG9ydHNfXyJdLCJzb3VyY2VSb290IjoiIn0=
|