@getopenpay/openpay-js 0.1.6-alpha.7c15e03 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js +761 -1028
- package/dist/index.umd.js +11 -15
- package/package.json +2 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
(function(w,
|
|
2
|
-
${
|
|
3
|
-
`)}`,
|
|
4
|
-
${
|
|
5
|
-
`)}`,ue=t=>{if(t instanceof Error)if(nt(t.message)){const e=JSON.parse(t.message);return Qe.safeParse(e).success?rt(e):et.safeParse(e).success?ot(e):t.message}else return J(t.message);if(typeof t=="object")try{return JSON.stringify(t)}catch(e){return e+""}else return t+""},j=(t,e)=>(...n)=>{try{return e(...n)}catch{return}},d=r.z.string().trim().min(1,{message:"Cannot be blank"}),y=r.z.string().trim().optional(),L=t=>r.z.nullable(t.optional());var P=(t=>(t.FIRST_NAME="firstName",t.LAST_NAME="lastName",t.EMAIL="email",t.ZIP_CODE="zipCode",t.CITY="city",t.STATE="state",t.COUNTRY="country",t.ADDRESS="address",t.PHONE="phone",t.PROMOTION_CODE="promotionCode",t))(P||{});const me=r.z.nativeEnum(P);var fe=(t=>(t.CARD_NUMBER="cardNumber",t.CARD_EXPIRY="cardExpiry",t.CARD_CVC="cardCvc",t))(fe||{});const pe=r.z.nativeEnum(fe),he=r.z.union([me,pe]);var de=(t=>(t.CARD="card",t.CARD_NUMBER="card-number",t.CARD_EXPIRY="card-expiry",t.CARD_CVC="card-cvc",t))(de||{});const st=r.z.nativeEnum(de),N=r.z.object({provider:r.z.string(),processor_name:L(r.z.string()),metadata:L(r.z.record(r.z.string(),r.z.any()))}),it=r.z.object({id:r.z.string()});r.z.object({cardNumber:y,expiry:y,cvc:y}),r.z.object({backgroundColor:y,color:y,fontFamily:y,fontSize:y,fontWeight:y,margin:y,padding:y,letterSpacing:y,lineHeight:y});const b=r.z.enum(["LAYOUT","LOADED","BLUR","FOCUS","CHANGE","TOKENIZE_STARTED","CHECKOUT_STARTED","PAYMENT_FLOW_STARTED","TOKENIZE_SUCCESS","CHECKOUT_SUCCESS","LOAD_ERROR","VALIDATION_ERROR","TOKENIZE_ERROR","CHECKOUT_ERROR","SETUP_PAYMENT_METHOD_SUCCESS","TOKENIZE","CHECKOUT","START_PAYMENT_FLOW"]),at=b.extract(["TOKENIZE_STARTED","CHECKOUT_STARTED"]),ct=r.z.object({type:at}),lt=b.extract(["BLUR","FOCUS","CHANGE"]),ut=r.z.object({type:lt,elementType:pe,errors:r.z.array(r.z.string()).optional()}),mt=b.extract(["LOAD_ERROR","TOKENIZE_ERROR","CHECKOUT_ERROR"]),ft=r.z.object({type:mt,message:d,headers:r.z.record(r.z.string(),r.z.string()).optional()}),pt=b.extract(["VALIDATION_ERROR"]),ht=r.z.object({type:pt,elementType:he,errors:r.z.array(r.z.string())}),dt=r.z.object({type:r.z.literal(b.enum.LAYOUT),height:d}),yt=r.z.object({type:r.z.literal(b.enum.LOADED),sessionId:d,totalAmountAtoms:r.z.number(),currency:y,checkoutPaymentMethods:r.z.array(N)}),gt=r.z.object({type:r.z.literal(b.enum.PAYMENT_FLOW_STARTED),nextActionMetadata:r.z.record(r.z.string(),r.z.any()),paymentFlowMetadata:r.z.any().optional(),startPFMetadata:r.z.optional(r.z.record(r.z.string(),r.z.any()))}),_t=r.z.object({type:r.z.literal(b.enum.SETUP_PAYMENT_METHOD_SUCCESS),paymentMethodId:r.z.string()}),I=r.z.object({firstName:d,lastName:d,email:d,zipCode:d,country:d,promotionCode:y}),bt=r.z.object({email:d,zipCode:d,country:d,promotionCode:y}),wt=b.extract(["TOKENIZE","CHECKOUT","START_PAYMENT_FLOW"]),Et=r.z.object({type:wt,sessionId:d,checkoutPaymentMethod:N,paymentFlowMetadata:r.z.any().optional(),doNotUseLegacyCCFlow:r.z.boolean().optional(),existingCCPMId:y}).extend(I.shape),Ct=r.z.object({type:r.z.literal(b.enum.TOKENIZE_SUCCESS),isReadyForCheckout:r.z.boolean()}),vt=r.z.object({type:r.z.literal(b.enum.CHECKOUT_SUCCESS),invoiceUrls:r.z.array(r.z.string()),subscriptionIds:r.z.array(r.z.string()),customerId:r.z.string()}),St=r.z.discriminatedUnion("type",[ct,ut,ft,ht,dt,yt,Et,Ct,vt,gt,_t]),Pt=r.z.object({payload:St,nonce:d,formId:d,elementId:d});r.z.object({amountAtom:r.z.number(),currency:d}),r.z.object({secure_token:r.z.string(),promotion_code:r.z.string().optional()}),r.z.object({secure_token:r.z.string(),existing_cc_pm_id:L(r.z.string())});const Ot=r.z.object({payment_methods:r.z.array(it)}),kt=r.z.object({elementType:r.z.string(),errors:r.z.array(r.z.string())});r.z.object({session_id:r.z.string()});const Rt=r.z.object({success:r.z.literal(!1),error_type:r.z.literal("validation_error"),errors:r.z.array(kt)}),Tt=r.z.discriminatedUnion("success",[r.z.object({success:r.z.literal(!0)}),Rt]);r.z.object({session_id:r.z.string(),checkout_payment_method:N,non_cde_form_fields:I,do_not_use_legacy_cc_flow:r.z.boolean().optional(),existing_cc_pm_id:L(r.z.string())}),r.z.object({session_id:r.z.string(),checkout_payment_method:N,non_cde_form_fields:I});var $=(t=>(t.SUCCESS="success",t.FAILURE="failure",t.CANCELLED="cancelled",t))($||{});const At=r.z.object({status:r.z.enum(["success","failure","cancelled"])}),jt=r.z.object({type:r.z.string(),redirect_url:r.z.string(),initial_intent_id:r.z.string(),consent_id:r.z.string()}),It=t=>{const e={};return Object.entries(t).forEach(([n,o])=>{try{const s=me.parse(n);Array.isArray(o)?e[s]=o:Array.isArray(o._errors)&&(e[s]=o._errors)}catch{return}}),e},Ft=r.z.object({stripe_pk:r.z.string(),client_secret:r.z.string(),stripe_pm_id:r.z.string()}),Mt=r.z.object({type:r.z.string(),client_secret:r.z.string(),stripe_pk:r.z.string()}),Dt={usd:"usd",brl:"brl"},W=async t=>{for(let n=0;n<10;n++)ye()||await Lt(500);if(!ye())throw new Error("Stripe JS not found.");return new Stripe(t)},xt=async(t,e,n,o,s)=>{const i=await W(t),a=Dt[n.toLowerCase().trim()];return i.paymentRequest({country:"US",currency:a,total:{label:"Total",amount:e,pending:o},requestPayerName:!0,requestPayerEmail:!0,disableWallets:[]})},Lt=t=>new Promise(e=>{setTimeout(e,t)}),ye=()=>"Stripe"in window,Nt=async t=>new Promise((e,n)=>{try{t.on("paymentmethod",async o=>{e(o)}),t.on("cancel",()=>{n(new Error("Payment cancelled, please click Submit again to pay"))})}catch(o){n(o)}}),$t=async(t,e)=>{if(!t.stripe_pk||!t.client_secret)throw new Error(`Invalid next action metadata format: ${JSON.stringify(t)}`);const o=await(await W(t.stripe_pk)).confirmCardSetup(t.client_secret,{payment_method:e.paymentMethod.id});if(o.error)throw e.complete("fail"),new Error(`Payment failed: ${o.error.message??"unknown"}`);e.complete("success")},Ut=async t=>{var s,i,a,c;const n=await(await W(t.stripe_pk)).confirmCardSetup(t.client_secret,{payment_method:t.stripe_pm_id}),o=(s=n.setupIntent)==null?void 0:s.status;if(o!=="succeeded")throw o==="canceled"?new Error("Payment cancelled, please click Submit again to pay"):new Error(`${((i=n.error)==null?void 0:i.message)??((c=(a=n.setupIntent)==null?void 0:a.last_setup_error)==null?void 0:c.message)??"Payment failed, please click submit again to pay."}`)},qt=t=>JSON.stringify(t),Bt=(t,e)=>Array.from(t.querySelectorAll("[data-opid]")??[]).reduce((s,i)=>{const a=i.getAttribute("data-opid");return a?{...s,[a]:i.value}:s},{}),zt=t=>{try{return Pt.parse(t)}catch(e){throw e}},Vt=(t,e,n,o,s)=>{const i={payload:o,nonce:Ze.v4(),formId:e,elementId:n};t.postMessage(JSON.stringify(i),s)},Ht=async t=>{if(typeof t!="object"||!t)return!1;try{const e={type:"ping"},n=await t.send(e);if(n!==!0)throw new Error(`Expected 'true' after ping, got ${JSON.stringify(n)}`);return!0}catch{return!1}},Yt=(t,e)=>!!t&&e,f=t=>r.z.nullable(t.optional());r.z.string().trim().min(1,{message:"Cannot be blank"});const Gt=r.z.object({cde_response_type:r.z.literal("error"),message:r.z.string(),headers:r.z.record(r.z.string(),r.z.string()).optional()}),Kt=r.z.enum(["usd","brl"]),ge=r.z.object({name:r.z.string(),amount_atom_off:f(r.z.number()),percent_off:f(r.z.number()),currency:f(r.z.string()),duration:r.z.string(),duration_in_months:f(r.z.number())}),_e=r.z.object({amount_subtotal_atom:r.z.number().int(),amount_total_atom:r.z.number().int(),currency:r.z.string(),description:f(r.z.string()),price_id:r.z.string(),billing_interval:f(r.z.string()),billing_interval_count:f(r.z.number().int()),quantity:r.z.number().int()}),Zt=r.z.record(r.z.string(),r.z.any()),Jt=r.z.object({name:r.z.string(),settings:f(Zt)}),U=r.z.object({provider:r.z.string(),processor_name:f(r.z.string()),metadata:f(r.z.record(r.z.string(),r.z.any()))}),Wt=r.z.object({quantity:r.z.number()}),Qt=r.z.object({id:f(r.z.string()),billing_interval:f(r.z.string()),billing_interval_count:f(r.z.number().int()),subscription_items:r.z.array(Wt),trial_start:f(r.z.string()),trial_end:f(r.z.string())}),be=r.z.object({amount_atom:r.z.number()}),Xt=r.z.object({amount_atom:r.z.number(),amount_atom_considering_discount_applied:r.z.number(),currency:r.z.string(),discount_amount_atoms:r.z.array(be),subscription_item_id:r.z.string()}),en=r.z.object({coupon:ge}),tn=r.z.object({currency:r.z.string(),discounts:r.z.array(en),hosted_invoice_url:f(r.z.string()),lines:r.z.array(Xt),remaining_amount_atom:r.z.number(),tax_amount_atom:r.z.number(),total_amount_atom:r.z.number(),total_discount_amount_atoms:r.z.array(be)}),we=r.z.object({created:r.z.array(Qt),invoices:r.z.array(tn)}),Ee=r.z.object({preview:we,preview_post_trial:f(we),coupons:r.z.array(ge)}),Ce=r.z.object({status:r.z.literal("open"),token:r.z.string(),email:f(r.z.string()),line_items:r.z.array(_e),amount_subtotal_atom:r.z.number().int(),amount_total_atom:r.z.number().int(),brand:Jt,subs_preview:f(Ee),methods_available:r.z.array(U)}),ve=r.z.discriminatedUnion("mode",[r.z.object({mode:r.z.literal("setup"),currency:r.z.nullable(r.z.undefined())}).extend(Ce.shape),r.z.object({mode:r.z.enum(["payment","subscription"]),currency:Kt}).extend(Ce.shape)]),nn=r.z.object({status:r.z.literal("complete")}),rn=r.z.object({status:r.z.literal("expired")});r.z.union([ve,nn,rn]),r.z.object({logo:r.z.string(),icon:r.z.string(),primary_color:r.z.string(),secondary_color:r.z.string()});const Se=r.z.object({invoice_urls:r.z.array(r.z.string()),subscription_ids:r.z.array(r.z.string()),customer_id:r.z.string()});r.z.object({secure_token:r.z.string(),payment_input:r.z.any(),customer_email:r.z.string(),customer_zip_code:r.z.string(),customer_country:r.z.string(),line_items:r.z.array(_e),total_amount_atom:r.z.number().int(),cancel_at_end:r.z.boolean(),checkout_payment_method:U,promotion_code:r.z.string().optional(),do_not_use_legacy_cc_flow:r.z.boolean().optional()});const on=r.z.object({payment_method_id:r.z.string()});r.z.object({id:r.z.string(),return_url:r.z.string()});const sn=r.z.object({type:r.z.string(),loc:r.z.array(r.z.string()),msg:r.z.string(),url:r.z.string()});r.z.array(sn);const an=r.z.object({required_user_actions:r.z.array(r.z.record(r.z.string(),r.z.any()))});r.z.object({fields:bt,checkoutPaymentMethod:U}),r.z.object({session_id:r.z.string(),non_cde_form_fields:I,checkout_payment_method:U});const cn=r.z.object({required_user_actions:r.z.array(r.z.record(r.z.string(),r.z.any())),cc_pm_id:r.z.string()});r.z.record(r.z.any());const ln=t=>t.reduce((e,n)=>e+n,0);function un(t,e){var n=Object.setPrototypeOf;n?n(t,e):t.__proto__=e}function mn(t,e){e===void 0&&(e=t.constructor);var n=Error.captureStackTrace;n&&n(t,e)}var fn=function(){var t=function(n,o){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,i){s.__proto__=i}||function(s,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(s[a]=i[a])},t(n,o)};return function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(e,n);function o(){this.constructor=e}e.prototype=n===null?Object.create(n):(o.prototype=n.prototype,new o)}}(),pn=function(t){fn(e,t);function e(n,o){var s=this.constructor,i=t.call(this,n,o)||this;return Object.defineProperty(i,"name",{value:s.name,enumerable:!1,configurable:!0}),un(i,s.prototype),mn(i),i}return e}(Error);class Pe extends pn{constructor(e){const n=`[cde-client] Error querying CDE: ${e.message}`;super(n),this.response=e}get originalErrorMessage(){return this.response.message}}const E=async(t,e,n)=>{const o=await t.send(e);if(dn(o))throw new Pe(o);if(!hn(o,n)){const s=n.safeParse(o);throw s.success?new Error("Invalid state"):s.error}return o},hn=(t,e)=>e.safeParse(t).success,dn=t=>Gt.safeParse(t).success,yn=async(t,e)=>await E(t,{type:"get_checkout_preview",payload:e},Ee),Q=async t=>await E(t,{type:"get_prefill",payload:{}},ve),gn=async(t,e)=>await E(t,{type:"start_payment_flow_for_cc",payload:e},cn),_n=async(t,e)=>await E(t,{type:"start_payment_flow_for_pr",payload:e},an),Oe=async(t,e)=>await E(t,{type:"confirm_payment_flow",payload:e},Ot),bn=async(t,e,n)=>{const o=await yn(t,{secure_token:e,promotion_code:n}),s=new Set(o.preview.invoices.map(c=>c.currency));if(s.size!==1)throw new Error(`Expected exactly one currency, got ${s.size}`);const i=s.values().next().value??"usd",a=ln(o.preview.invoices.map(c=>c.remaining_amount_atom));return{currency:i,amountAtom:a}},wn=async(t,e,n,o)=>{if(n)return{amountAtom:0,currency:"usd"};{o=o||void 0;const s=await bn(t,e,o);return{amountAtom:s.amountAtom,currency:s.currency}}},En=async(t,e)=>{if(t.size===0)throw new Error("No CDE connections found");return await Promise.all(Array.from(t.values()).map(o=>E(o,{type:"tokenize_card",payload:e},Tt)))},ke=async(t,e)=>{try{return await E(t,{type:"checkout_card_elements",payload:e},Se)}catch(n){throw n}},Cn=async(t,e)=>await E(t,{type:"setup_payment_method",payload:e},on),vn=async(t,e)=>await E(t,{type:"checkout",payload:e},Se),Re=1e3,Sn=async(t,e)=>{const o=await le.connectToChild({iframe:t,debug:!0,timeout:Re,childOrigin:e}).promise;return(await E(o,{type:"ping-3ds-status"},At)).status},Pn="@keyframes fadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483648!important;display:flex;justify-content:center;align-items:center;background-color:#00000080}.container{max-width:500px;max-height:600px;width:100%;height:100%;background-color:#fff;position:relative;animation:fadeIn .3s ease-out}.frame{max-width:500px;max-height:600px;width:100%;height:100%;border:none}.cancel-button{position:absolute;background:transparent;border:none;font-size:1rem;color:#fff;cursor:pointer;top:-1.5rem;padding:0;right:0}",On=t=>{const e=document.createElement("template");e.innerHTML=`
|
|
1
|
+
(function(w,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("zod"),require("uuid"),require("penpal"),require("chalk")):typeof define=="function"&&define.amd?define(["exports","zod","uuid","penpal","chalk"],t):(w=typeof globalThis<"u"?globalThis:w||self,t(w.OpenPay={},w.zod,w.uuid,w.penpal,w.chalk))})(this,function(w,t,Ae,W,I){"use strict";const Ie="https://cde.getopenpay.com",je=t.z.object({type:t.z.string(),loc:t.z.array(t.z.string()),msg:t.z.string(),url:t.z.string()}),Fe=t.z.array(je),Me=t.z.object({code:t.z.string(),message:t.z.string(),path:t.z.array(t.z.string())}),Le=t.z.array(Me),De={"failed to fetch":"Connection error: please double check if you are connected to the internet, then try again"},z=n=>{const e=n.toLowerCase().trim();return De[e]??n},Ne=n=>{try{return typeof JSON.parse(n)=="object"}catch{return!1}},xe=n=>n.length===1?z(n[0].msg):`Please fix the following errors:
|
|
2
|
+
${n.map(r=>`• ${z(r.msg)}`).join(`
|
|
3
|
+
`)}`,Ue=n=>`Encountered the following errors:
|
|
4
|
+
${n.map(r=>`- ${r.path.join("/")}: ${r.message}`).join(`
|
|
5
|
+
`)}`,Q=n=>{if(n instanceof Error)if(Ne(n.message)){const e=JSON.parse(n.message);return Fe.safeParse(e).success?xe(e):Le.safeParse(e).success?Ue(e):n.message}else return z(n.message);if(typeof n=="object")try{return JSON.stringify(n)}catch(e){return e+""}else return n+""},R=(n,e)=>(...r)=>{try{return e(...r)}catch{return}},h=t.z.string().trim().min(1,{message:"Cannot be blank"}),y=t.z.string().trim().optional(),j=n=>t.z.nullable(n.optional());var f=(n=>(n.FIRST_NAME="firstName",n.LAST_NAME="lastName",n.EMAIL="email",n.ZIP_CODE="zipCode",n.CITY="city",n.STATE="state",n.COUNTRY="country",n.ADDRESS="address",n.PHONE="phone",n.PROMOTION_CODE="promotionCode",n))(f||{});const X=t.z.nativeEnum(f);var ee=(n=>(n.CARD_NUMBER="cardNumber",n.CARD_EXPIRY="cardExpiry",n.CARD_CVC="cardCvc",n))(ee||{});const te=t.z.nativeEnum(ee),ne=t.z.union([X,te]);var re=(n=>(n.CARD="card",n.CARD_NUMBER="card-number",n.CARD_EXPIRY="card-expiry",n.CARD_CVC="card-cvc",n))(re||{});const $e=t.z.nativeEnum(re),F=t.z.object({provider:t.z.string(),processor_name:j(t.z.string()),metadata:j(t.z.record(t.z.string(),t.z.any()))}),qe=t.z.object({id:t.z.string()});t.z.object({cardNumber:y,expiry:y,cvc:y}),t.z.object({backgroundColor:y,color:y,fontFamily:y,fontSize:y,fontWeight:y,margin:y,padding:y,letterSpacing:y,lineHeight:y});const E=t.z.enum(["LAYOUT","LOADED","BLUR","FOCUS","CHANGE","TOKENIZE_STARTED","CHECKOUT_STARTED","PAYMENT_FLOW_STARTED","TOKENIZE_SUCCESS","CHECKOUT_SUCCESS","LOAD_ERROR","VALIDATION_ERROR","TOKENIZE_ERROR","CHECKOUT_ERROR","SETUP_PAYMENT_METHOD_SUCCESS","TOKENIZE","CHECKOUT","START_PAYMENT_FLOW"]),ze=E.extract(["TOKENIZE_STARTED","CHECKOUT_STARTED"]),Ve=t.z.object({type:ze}),He=E.extract(["BLUR","FOCUS","CHANGE"]),Ke=t.z.object({type:He,elementType:te,errors:t.z.array(t.z.string()).optional()}),Be=E.extract(["LOAD_ERROR","TOKENIZE_ERROR","CHECKOUT_ERROR"]),Ye=t.z.object({type:Be,message:h,headers:t.z.record(t.z.string(),t.z.string()).optional()}),Ze=E.extract(["VALIDATION_ERROR"]),Ge=t.z.object({type:Ze,elementType:ne,errors:t.z.array(t.z.string())}),Je=t.z.object({type:t.z.literal(E.enum.LAYOUT),height:h}),We=t.z.object({type:t.z.literal(E.enum.LOADED),sessionId:h,totalAmountAtoms:t.z.number(),currency:y,checkoutPaymentMethods:t.z.array(F)}),Qe=t.z.object({type:t.z.literal(E.enum.PAYMENT_FLOW_STARTED),nextActionMetadata:t.z.record(t.z.string(),t.z.any()),paymentFlowMetadata:t.z.any().optional(),startPFMetadata:t.z.optional(t.z.record(t.z.string(),t.z.any()))}),Xe=t.z.object({type:t.z.literal(E.enum.SETUP_PAYMENT_METHOD_SUCCESS),paymentMethodId:t.z.string()}),k=t.z.object({firstName:h,lastName:h,email:h,zipCode:h,country:h,promotionCode:y}),et=t.z.object({email:h,zipCode:h,country:h,promotionCode:y}),tt=E.extract(["TOKENIZE","CHECKOUT","START_PAYMENT_FLOW"]),nt=t.z.object({type:tt,sessionId:h,checkoutPaymentMethod:F,paymentFlowMetadata:t.z.any().optional(),doNotUseLegacyCCFlow:t.z.boolean().optional(),existingCCPMId:y}).extend(k.shape),rt=t.z.object({type:t.z.literal(E.enum.TOKENIZE_SUCCESS),isReadyForCheckout:t.z.boolean()}),ot=t.z.object({type:t.z.literal(E.enum.CHECKOUT_SUCCESS),invoiceUrls:t.z.array(t.z.string()),subscriptionIds:t.z.array(t.z.string()),customerId:t.z.string()}),st=t.z.discriminatedUnion("type",[Ve,Ke,Ye,Ge,Je,We,nt,rt,ot,Qe,Xe]),it=t.z.object({payload:st,nonce:h,formId:h,elementId:h});t.z.object({amountAtom:t.z.number(),currency:h}),t.z.object({secure_token:t.z.string(),promotion_code:t.z.string().optional()}),t.z.object({secure_token:t.z.string(),existing_cc_pm_id:j(t.z.string())});const at=t.z.object({payment_methods:t.z.array(qe)}),ct=t.z.object({elementType:t.z.string(),errors:t.z.array(t.z.string())});t.z.object({session_id:t.z.string()});const lt=t.z.object({success:t.z.literal(!1),error_type:t.z.literal("validation_error"),errors:t.z.array(ct)}),ut=t.z.discriminatedUnion("success",[t.z.object({success:t.z.literal(!0)}),lt]);t.z.object({session_id:t.z.string(),checkout_payment_method:F,non_cde_form_fields:k,do_not_use_legacy_cc_flow:t.z.boolean().optional(),existing_cc_pm_id:j(t.z.string())}),t.z.object({session_id:t.z.string(),checkout_payment_method:F,non_cde_form_fields:k});var M=(n=>(n.SUCCESS="success",n.FAILURE="failure",n.CANCELLED="cancelled",n))(M||{});const mt=t.z.object({status:t.z.enum(["success","failure","cancelled"])}),pt=t.z.object({type:t.z.string(),redirect_url:t.z.string(),initial_intent_id:t.z.string(),consent_id:t.z.string()}),ft=n=>{const e={};return Object.entries(n).forEach(([r,o])=>{try{const s=X.parse(r);Array.isArray(o)?e[s]=o:Array.isArray(o._errors)&&(e[s]=o._errors)}catch{return}}),e},dt=t.z.object({stripe_pk:t.z.string(),client_secret:t.z.string(),stripe_pm_id:t.z.string()}),ht=t.z.object({type:t.z.string(),client_secret:t.z.string(),stripe_pk:t.z.string()}),yt={usd:"usd",brl:"brl"},V=async n=>{for(let r=0;r<10;r++)oe()||await gt(500);if(!oe())throw new Error("Stripe JS not found.");return new Stripe(n)},_t=async(n,e,r,o,s)=>{const i=await V(n),a=yt[r.toLowerCase().trim()];return i.paymentRequest({country:"US",currency:a,total:{label:"Total",amount:e,pending:o},requestPayerName:!0,requestPayerEmail:!0,disableWallets:[]})},gt=n=>new Promise(e=>{setTimeout(e,n)}),oe=()=>"Stripe"in window,wt=async n=>new Promise((e,r)=>{try{n.on("paymentmethod",async o=>{e(o)}),n.on("cancel",()=>{r(new Error("Payment cancelled, please click Submit again to pay"))})}catch(o){r(o)}}),Et=async(n,e)=>{if(!n.stripe_pk||!n.client_secret)throw new Error(`Invalid next action metadata format: ${JSON.stringify(n)}`);const o=await(await V(n.stripe_pk)).confirmCardSetup(n.client_secret,{payment_method:e.paymentMethod.id});if(o.error)throw e.complete("fail"),new Error(`Payment failed: ${o.error.message??"unknown"}`);return e.complete("success"),o},bt=async n=>{var s,i,a,c;const r=await(await V(n.stripe_pk)).confirmCardSetup(n.client_secret,{payment_method:n.stripe_pm_id}),o=(s=r.setupIntent)==null?void 0:s.status;if(o!=="succeeded")throw o==="canceled"?new Error("Payment cancelled, please click Submit again to pay"):new Error(`${((i=r.error)==null?void 0:i.message)??((c=(a=r.setupIntent)==null?void 0:a.last_setup_error)==null?void 0:c.message)??"Payment failed, please click submit again to pay."}`)},Ct=n=>JSON.stringify(n),St=(n,e)=>Array.from(n.querySelectorAll("[data-opid]")??[]).reduce((s,i)=>{const a=i.getAttribute("data-opid");return a?{...s,[a]:i.value}:s},{}),Pt=n=>{try{return it.parse(n)}catch(e){throw e}},vt=(n,e,r,o,s)=>{const i={payload:o,nonce:Ae.v4(),formId:e,elementId:r};n.postMessage(JSON.stringify(i),s)},Ot=async n=>{if(typeof n!="object"||!n)return!1;try{const e={type:"ping"},r=await n.send(e);if(r!==!0)throw new Error(`Expected 'true' after ping, got ${JSON.stringify(r)}`);return!0}catch{return!1}},Rt=(n,e)=>!!n&&e,p=n=>t.z.nullable(n.optional());t.z.string().trim().min(1,{message:"Cannot be blank"});const kt=t.z.object({cde_response_type:t.z.literal("error"),message:t.z.string(),headers:t.z.record(t.z.string(),t.z.string()).optional()});t.z.enum(["usd","brl"]);const se=t.z.object({name:t.z.string(),amount_atom_off:p(t.z.number()),percent_off:p(t.z.number()),currency:p(t.z.string()),duration:t.z.string(),duration_in_months:p(t.z.number())}),ie=t.z.object({amount_subtotal_atom:t.z.number().int(),amount_total_atom:t.z.number().int(),currency:t.z.string(),description:p(t.z.string()),price_id:t.z.string(),billing_interval:p(t.z.string()),billing_interval_count:p(t.z.number().int()),quantity:t.z.number().int()}),Tt=t.z.record(t.z.string(),t.z.any()),At=t.z.object({name:t.z.string(),settings:p(Tt)}),L=t.z.object({provider:t.z.string(),processor_name:p(t.z.string()),metadata:p(t.z.record(t.z.string(),t.z.any()))}),It=t.z.object({quantity:t.z.number()}),jt=t.z.object({id:p(t.z.string()),billing_interval:p(t.z.string()),billing_interval_count:p(t.z.number().int()),subscription_items:t.z.array(It),trial_start:p(t.z.string()),trial_end:p(t.z.string())}),ae=t.z.object({amount_atom:t.z.number()}),Ft=t.z.object({amount_atom:t.z.number(),amount_atom_considering_discount_applied:t.z.number(),currency:t.z.string(),discount_amount_atoms:t.z.array(ae),subscription_item_id:t.z.string()}),Mt=t.z.object({coupon:se}),Lt=t.z.object({currency:t.z.string(),discounts:t.z.array(Mt),hosted_invoice_url:p(t.z.string()),lines:t.z.array(Ft),remaining_amount_atom:t.z.number(),tax_amount_atom:t.z.number(),total_amount_atom:t.z.number(),total_discount_amount_atoms:t.z.array(ae)}),ce=t.z.object({created:t.z.array(jt),invoices:t.z.array(Lt)}),le=t.z.object({preview:ce,preview_post_trial:p(ce),coupons:t.z.array(se)}),ue=t.z.object({status:t.z.literal("open"),token:t.z.string(),email:p(t.z.string()),line_items:t.z.array(ie),amount_subtotal_atom:t.z.number().int(),amount_total_atom:t.z.number().int(),brand:At,subs_preview:p(le),methods_available:t.z.array(L)}),me=t.z.discriminatedUnion("mode",[t.z.object({mode:t.z.literal("setup"),currency:t.z.nullable(t.z.undefined())}).extend(ue.shape),t.z.object({mode:t.z.enum(["payment","subscription"]),currency:t.z.string()}).extend(ue.shape)]),Dt=t.z.object({status:t.z.literal("complete")}),Nt=t.z.object({status:t.z.literal("expired")});t.z.union([me,Dt,Nt]),t.z.object({logo:t.z.string(),icon:t.z.string(),primary_color:t.z.string(),secondary_color:t.z.string()});const pe=t.z.object({invoice_urls:t.z.array(t.z.string()),subscription_ids:t.z.array(t.z.string()),customer_id:t.z.string()});t.z.object({secure_token:t.z.string(),payment_input:t.z.any(),customer_email:t.z.string(),customer_zip_code:t.z.string(),customer_country:t.z.string(),line_items:t.z.array(ie),total_amount_atom:t.z.number().int(),cancel_at_end:t.z.boolean(),checkout_payment_method:L,promotion_code:t.z.string().optional(),do_not_use_legacy_cc_flow:t.z.boolean().optional()});const xt=t.z.object({payment_method_id:t.z.string()});t.z.object({id:t.z.string(),return_url:t.z.string()});const Ut=t.z.object({type:t.z.string(),loc:t.z.array(t.z.string()),msg:t.z.string(),url:t.z.string()});t.z.array(Ut);const $t=t.z.object({required_user_actions:t.z.array(t.z.record(t.z.string(),t.z.any()))});t.z.object({fields:et,checkoutPaymentMethod:L}),t.z.object({session_id:t.z.string(),non_cde_form_fields:k,checkout_payment_method:L});const qt=t.z.object({required_user_actions:t.z.array(t.z.record(t.z.string(),t.z.any())),cc_pm_id:t.z.string()});t.z.record(t.z.any());const zt=n=>n.reduce((e,r)=>e+r,0);function Vt(n,e){var r=Object.setPrototypeOf;r?r(n,e):n.__proto__=e}function Ht(n,e){e===void 0&&(e=n.constructor);var r=Error.captureStackTrace;r&&r(n,e)}var Kt=function(){var n=function(r,o){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,i){s.__proto__=i}||function(s,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(s[a]=i[a])},n(r,o)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");n(e,r);function o(){this.constructor=e}e.prototype=r===null?Object.create(r):(o.prototype=r.prototype,new o)}}(),Bt=function(n){Kt(e,n);function e(r,o){var s=this.constructor,i=n.call(this,r,o)||this;return Object.defineProperty(i,"name",{value:s.name,enumerable:!1,configurable:!0}),Vt(i,s.prototype),Ht(i),i}return e}(Error);class fe extends Bt{constructor(e){const r=`[cde-client] Error querying CDE: ${e.message}`;super(r),this.response=e}get originalErrorMessage(){return this.response.message}}const b=async(n,e,r)=>{const o=await n.send(e);if(Zt(o))throw new fe(o);if(!Yt(o,r)){const s=r.safeParse(o);throw s.success?new Error("Invalid state"):s.error}return o},Yt=(n,e)=>e.safeParse(n).success,Zt=n=>kt.safeParse(n).success,Gt=async(n,e)=>await b(n,{type:"get_checkout_preview",payload:e},le),H=async n=>await b(n,{type:"get_prefill",payload:{}},me),Jt=async(n,e)=>await b(n,{type:"start_payment_flow_for_cc",payload:e},qt),Wt=async(n,e)=>await b(n,{type:"start_payment_flow_for_pr",payload:e},$t),de=async(n,e)=>await b(n,{type:"confirm_payment_flow",payload:e},at),Qt=async(n,e,r)=>{const o=await Gt(n,{secure_token:e,promotion_code:r}),s=new Set(o.preview.invoices.map(c=>c.currency));if(s.size!==1)throw new Error(`Expected exactly one currency, got ${s.size}`);const i=s.values().next().value??"usd",a=zt(o.preview.invoices.map(c=>c.remaining_amount_atom));return{currency:i,amountAtom:a}},Xt=async(n,e,r,o)=>{if(r)return{amountAtom:0,currency:"usd"};{o=o||void 0;const s=await Qt(n,e,o);return{amountAtom:s.amountAtom,currency:s.currency}}},en=async(n,e)=>{if(n.size===0)throw new Error("No CDE connections found");return await Promise.all(Array.from(n.values()).map(o=>b(o,{type:"tokenize_card",payload:e},ut)))},he=async(n,e)=>{try{return await b(n,{type:"checkout_card_elements",payload:e},pe)}catch(r){throw r}},tn=async(n,e)=>await b(n,{type:"setup_payment_method",payload:e},xt),nn=async(n,e)=>await b(n,{type:"checkout",payload:e},pe),ye=1e3,rn=async(n,e)=>{const o=await W.connectToChild({iframe:n,debug:!0,timeout:ye,childOrigin:"*"}).promise;return(await b(o,{type:"ping-3ds-status"},mt)).status},on="@keyframes fadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483648!important;display:flex;justify-content:center;align-items:center;background-color:#00000080}.container{max-width:500px;max-height:600px;width:100%;height:100%;background-color:#fff;position:relative;animation:fadeIn .3s ease-out}.frame{max-width:500px;max-height:600px;width:100%;height:100%;border:none}.cancel-button{position:absolute;background:transparent;border:none;font-size:1rem;color:#fff;cursor:pointer;top:-1.5rem;padding:0;right:0}",sn=n=>{const e=document.createElement("template");e.innerHTML=`
|
|
6
6
|
<style>
|
|
7
|
-
${
|
|
7
|
+
${on}
|
|
8
8
|
</style>
|
|
9
9
|
<div class="overlay">
|
|
10
10
|
<div class="container">
|
|
11
11
|
<button class="cancel-button">Cancel</button>
|
|
12
|
-
<iframe src="${
|
|
12
|
+
<iframe src="${n}" class="frame" id="three-ds-iframe" title="3D Secure verification" allow="payment"></iframe>
|
|
13
13
|
</div>
|
|
14
14
|
</div>
|
|
15
|
-
`;const
|
|
16
|
-
|
|
17
|
-
`)
|
|
18
|
-
`,s)}while(o!==-1);return i+=t.slice(s),i}const{stdout:Fe,stderr:Me}=Fn,ee=Symbol("GENERATOR"),R=Symbol("STYLER"),F=Symbol("IS_EMPTY"),De=["ansi","ansi","ansi256","ansi16m"],T=Object.create(null),xn=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");const n=Fe?Fe.level:0;t.level=e.level===void 0?n:e.level},Ln=t=>{const e=(...n)=>n.join(" ");return xn(e,t),Object.setPrototypeOf(e,M.prototype),e};function M(t){return Ln(t)}Object.setPrototypeOf(M.prototype,Function.prototype);for(const[t,e]of Object.entries(C))T[t]={get(){const n=B(this,ne(e.open,e.close,this[R]),this[F]);return Object.defineProperty(this,t,{value:n}),n}};T.visible={get(){const t=B(this,this[R],!0);return Object.defineProperty(this,"visible",{value:t}),t}};const te=(t,e,n,...o)=>t==="rgb"?e==="ansi16m"?C[n].ansi16m(...o):e==="ansi256"?C[n].ansi256(C.rgbToAnsi256(...o)):C[n].ansi(C.rgbToAnsi(...o)):t==="hex"?te("rgb",e,n,...C.hexToRgb(...o)):C[n][t](...o),Nn=["rgb","hex","ansi256"];for(const t of Nn){T[t]={get(){const{level:n}=this;return function(...o){const s=ne(te(t,De[n],"color",...o),C.color.close,this[R]);return B(this,s,this[F])}}};const e="bg"+t[0].toUpperCase()+t.slice(1);T[e]={get(){const{level:n}=this;return function(...o){const s=ne(te(t,De[n],"bgColor",...o),C.bgColor.close,this[R]);return B(this,s,this[F])}}}}const $n=Object.defineProperties(()=>{},{...T,level:{enumerable:!0,get(){return this[ee].level},set(t){this[ee].level=t}}}),ne=(t,e,n)=>{let o,s;return n===void 0?(o=t,s=e):(o=n.openAll+t,s=e+n.closeAll),{open:t,close:e,openAll:o,closeAll:s,parent:n}},B=(t,e,n)=>{const o=(...s)=>Un(o,s.length===1?""+s[0]:s.join(" "));return Object.setPrototypeOf(o,$n),o[ee]=t,o[R]=e,o[F]=n,o},Un=(t,e)=>{if(t.level<=0||!e)return t[F]?"":e;let n=t[R];if(n===void 0)return e;const{openAll:o,closeAll:s}=n;if(e.includes("\x1B"))for(;n!==void 0;)e=Mn(e,n.close,n.open),n=n.parent;const i=e.indexOf(`
|
|
19
|
-
`);return i!==-1&&(e=Dn(e,s,o,i)),o+e+s};Object.defineProperties(M.prototype,T);const z=M();M({level:Me?Me.level:0});const xe=t=>async e=>{try{e.flowCallbacks.onCheckoutStarted();const n=await t(e);if(n.mode==="setup")e.flowCallbacks.onSetupPaymentMethodSuccess(n.result.payment_method_id);else if(n.mode==="checkout")e.flowCallbacks.onCheckoutSuccess(n.result.invoice_urls,n.result.subscription_ids,n.result.customer_id);else throw new Error(`Unhandled mode: ${n}`)}catch(n){throw e.flowCallbacks.onCheckoutError(ue(n)),n}},qn=t=>async e=>{try{return await t(e)}catch(n){const{err__:o}=k("init-error-catcher");return o(n),{isAvailable:!1,reason:ue(n)}}},k=t=>{const e=(...o)=>{window.console.log(`${z.green.bold("ojs/")}${z.bold.gray(`${t}`)} `,...o)},n=(...o)=>{window.console.error(`${z.red.bold("ojs/")}${z.bold.gray(`${t}`)} `,...o)};return{log:e,err:n,log__:e,err__:n}},{log__:Bn,err__:Le}=k("common-cc"),Ne=(t,e)=>{const n=I.safeParse(t);if(!n.success){const o=n.error.format(),s=It(o);for(const[i,a]of Object.entries(s))e(i,a,i);throw Le("Got validation errors in non-CDE form fields",s),new Error("Got validation errors in non-CDE form fields")}return n.data},zn=(t,e)=>{for(const n of t)if(n.success===!1)throw n.errors.forEach(o=>{const s=he.safeParse(o.elementType);if(!s.success)Le(`Unknown field name in onValidationError: ${o.elementType}`);else{const i=s.data;e(i,o.errors)}}),Bn(`Error tokenizing card: got validation errors: ${JSON.stringify(n.errors)}`),new Error("Got validation errors while tokenizing card")},{err__:re}=k("commmon"),$e=t=>{if(t.payment_methods.length!==1)throw new Error(`Expected exactly one payment method, got ${t.payment_methods.length}`);return{payment_method_id:t.payment_methods[0].id}},Vn=(t,e)=>{const n=t.find(o=>e.safeParse(o).success);if(!n)throw re(`No CPMs found for model ${e}`),re(t),re("zodModel"),new Error(`No CPMs found for model ${e}`);return e.parse(n)},{log__:p,err__:Ue}=k("common-cc"),{log__:qe}=k("stripe-cc"),Hn=xe(async({context:t,checkoutPaymentMethod:e,nonCdeFormInputs:n,flowCallbacks:o})=>{var l;p("├ Running common CC flow...",{checkoutPaymentMethod:e});const s=Array.from(t.cdeConnections.values())[0],i=await Q(s);p(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);const a=Ne(n,o.onValidationError);p(`├ Tokenizing card info in CDE [Session: ${t.elementsSessionId}]`);const c=await En(t.cdeConnections,{session_id:t.elementsSessionId});zn(c,o.onValidationError);const m={session_id:t.elementsSessionId,checkout_payment_method:e,non_cde_form_fields:a};try{if(i.mode==="setup"){p(`├ Setting up payment method in CDE [Token: ${i.token}]`);const h=await Cn(s,m);return p(`╰ Setup completed successfully [PM ID: ${h.payment_method_id}]`),{mode:"setup",result:h}}else{p(`├ Initial checkout flow. Checking out card info in CDE [Session: ${t.elementsSessionId}]`);const h=await ke(s,m);return p("╰ Checkout completed successfully."),{mode:"checkout",result:h}}}catch(h){if(h instanceof Pe&&h.originalErrorMessage==="3DS_REQUIRED"){p("├ Card requires 3DS, starting non-legacy payment flow");const O=((l=h.response.headers)==null?void 0:l["op-should-use-new-flow"])==="true",_=await gn(s,m);if(p(`├ op-should-use-new-flow: ${O}`),p("├ Payment flow result:",_),O?await Kn(_,t.baseUrl):await Zn(_),i.mode==="setup"){p(`├ Confirming payment flow [cc_pm_id: ${_.cc_pm_id}]`);const v=await Oe(s,{secure_token:i.token,existing_cc_pm_id:_.cc_pm_id});p("├ Confirm payment flow result received Result:",v);const S=$e(v);return p(`╰ Setup completed successfully [PM ID: ${S.payment_method_id}]`),{mode:"setup",result:S}}else{p(`├ Checking out after 3DS flow [Flow: ${O?"new":"legacy"}]`);const v=await ke(s,{...m,existing_cc_pm_id:_.cc_pm_id,do_not_use_legacy_cc_flow:!O});return p("╰ Checkout completed successfully."),{mode:"checkout",result:v}}}throw Ue("╰ Error checking out card info in CDE"),Ue(h),h}}),Yn=t=>{const e=t.required_user_actions.find(n=>n.type==="stripe_3ds");if(!e)throw new Error("No stripe 3DS action found");return Ft.parse(e)},Gn=t=>{const e=t.required_user_actions.find(n=>n.type==="airwallex_payment_consent");if(!e)throw new Error("No common 3DS action found");return jt.parse(e)},Kn=async(t,e)=>{const n=Gn(t);p(`├ Using common 3DS flow [URL: ${n.redirect_url}]`);const o=await Tn({url:n.redirect_url,baseUrl:e});if(p(`╰ 3DS verification completed [Status: ${o}]`),o===$.CANCELLED)throw new Error("3DS verification cancelled");if(o===$.FAILURE)throw new Error("3DS verification failed")},Zn=async t=>{const e=Yn(t);qe(`├ Using stripe 3DS flow [Client Secret: ${e.client_secret.substring(0,8)}...]`),await Ut(e),qe("╰ Stripe 3DS flow completed successfully")},{log__:g,err__:Jn}=k("stripe-pr"),Wn=r.z.object({provider:r.z.union([r.z.literal("apple_pay"),r.z.literal("google_pay")]),processor_name:r.z.literal("stripe"),metadata:r.z.object({stripe_pk:r.z.string()})}),Qn=qn(async({context:t})=>{g("Checking if there are any CPMs for Stripe PR...");const e=Vn(t.checkoutPaymentMethods,Wn);g("Initializing Stripe PR flow...");const n=Array.from(t.cdeConnections.values())[0],o=await Q(n),s=o.mode==="setup";g("Getting initial preview amount");const i=await wn(n,o.token,s,void 0),a=await xt(e.metadata.stripe_pk,i.amountAtom,i.currency,s);g("Checking if can make payment");const c=await a.canMakePayment();return c===null?(Jn("canMakePayment returned null"),{isAvailable:!1,reason:"canMakePayment returned null"}):(g("Stripe PR flow initialized successfully. Can make payment",c),{isAvailable:!0,pr:a,availableProviders:{applePay:c.applePay,googlePay:c.googlePay}})}),Xn=xe(async({context:t,checkoutPaymentMethod:e,nonCdeFormInputs:n,flowCallbacks:o,customParams:s,initResult:i})=>{if(g("Running Stripe PR flow..."),s.provider!==e.provider)throw new Error(`Provider mismatch. Expected ${s.provider}, got ${e.provider}`);const a=Array.from(t.cdeConnections.values())[0],c=i.pr;g("Validating non-CDE form fields");const m=er(n),l=Ne(m,o.onValidationError);if(s!=null&&s.overridePaymentRequest){const S=s.overridePaymentRequest;g("Overriding PR amount with",S),tr(c,S.amount,S.pending)}g("Showing PR dialog..."),c.show();const h=await Nt(c);g("PR dialog finished. Starting payment flow...");const O=await _n(a,{fields:l,checkoutPaymentMethod:e}),_=nr(O);g("Confirming PR with Stripe..."),await $t(_,h);const v=await Q(a);if(v.mode==="setup"){g("Confirming payment flow for setup...");const S=await Oe(a,{secure_token:v.token});return{mode:"setup",result:$e(S)}}else{g("Performing checkout...");const S={secure_token:v.token,payment_input:{provider_type:e.provider},customer_email:l[P.EMAIL],customer_zip_code:l[P.ZIP_CODE],customer_country:l[P.COUNTRY],promotion_code:l[P.PROMOTION_CODE],line_items:v.line_items,total_amount_atom:v.amount_total_atom,cancel_at_end:!1,checkout_payment_method:e};return{mode:"checkout",result:await vn(a,S)}}}),er=t=>{const e={...t};return e[P.ZIP_CODE]||(g("Overriding empty zip code (only for google pay and apple pay)"),e[P.ZIP_CODE]="00000"),e},tr=(t,e,n)=>{t.update({total:{amount:e.amountAtom,label:"Total",pending:n},currency:e.currency})},nr=t=>{if(t.required_user_actions.length!==1)throw new Error(`Error occurred.
|
|
20
|
-
Details: got ${t.required_user_actions.length} required user actions`);return Mt.parse(t.required_user_actions[0])},Be=(t,e,n)=>{const o=t.filter(s=>s.provider===e);if(o.length===0)throw new Error(`No CPMs found with provider '${e}' and processor '${n}'`);if(o.length!==1)throw new Error(`More than one CPM found with provider '${e}' and processor '${n}'`);return o[0]},V={commonCC:{run:Hn},stripePR:{init:Qn,run:Xn}};function rr(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var H={};Object.defineProperty(H,"__esModule",{value:!0}),H.Observable=void 0;const ze=t=>!!Symbol[t],oe=t=>ze(t)?Symbol[t]:"@@"+t,or=oe("iterator"),se=oe("observable"),Ve=oe("species");function Y(t,e){let n=t[e];if(n!=null){if(typeof n!="function")throw new TypeError(n+" is not a function");return n}}function D(t){let e=t.constructor;return e!==void 0&&(e=e[Ve],e===null&&(e=void 0)),e!==void 0?e:K}function sr(t){return t instanceof K}function A(t){A.log?A.log(t):setTimeout(()=>{throw t})}function G(t){Promise.resolve().then(()=>{try{t()}catch(e){A(e)}})}function He(t){let e=t._cleanup;if(e!==void 0&&(t._cleanup=void 0,!!e))try{if(typeof e=="function")e();else{let n=Y(e,"unsubscribe");n&&n.call(e)}}catch(n){A(n)}}function ie(t){t._observer=void 0,t._queue=void 0,t._state="closed"}function ir(t){let e=t._queue;if(e){t._queue=void 0,t._state="ready";for(let n=0;n<e.length&&(Ye(t,e[n].type,e[n].value),t._state!=="closed");++n);}}function Ye(t,e,n){t._state="running";let o=t._observer;try{let s=Y(o,e);switch(e){case"next":s&&s.call(o,n);break;case"error":if(ie(t),s)s.call(o,n);else throw n;break;case"complete":ie(t),s&&s.call(o);break}}catch(s){A(s)}t._state==="closed"?He(t):t._state==="running"&&(t._state="ready")}function ae(t,e,n){if(t._state!=="closed"){if(t._state==="buffering"){t._queue.push({type:e,value:n});return}if(t._state!=="ready"){t._state="buffering",t._queue=[{type:e,value:n}],G(()=>ir(t));return}Ye(t,e,n)}}class ar{constructor(e,n){this._cleanup=void 0,this._observer=e,this._queue=void 0,this._state="initializing";let o=this,s={get closed(){return o._state==="closed"},next(i){ae(o,"next",i)},error(i){ae(o,"error",i)},complete(){ae(o,"complete")}};try{this._cleanup=n.call(void 0,s)}catch(i){s.error(i)}this._state==="initializing"&&(this._state="ready")}get closed(){return this._state==="closed"}unsubscribe(){this._state!=="closed"&&(ie(this),He(this))}}let K=class Z{constructor(e){if(!(this instanceof Z))throw new TypeError("Observable cannot be called as a function");if(typeof e!="function")throw new TypeError("Observable initializer must be a function");this._subscriber=e}subscribe(e){return(typeof e!="object"||e===null)&&(e={next:e,error:arguments[1],complete:arguments[2]}),new ar(e,this._subscriber)}forEach(e){return new Promise((n,o)=>{if(typeof e!="function"){o(new TypeError(e+" is not a function"));return}function s(){i.unsubscribe(),n()}let i=this.subscribe({next(a){try{e(a,s)}catch(c){o(c),i.unsubscribe()}},error:o,complete:n})})}map(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let n=D(this);return new n(o=>this.subscribe({next(s){try{s=e(s)}catch(i){return o.error(i)}o.next(s)},error(s){o.error(s)},complete(){o.complete()}}))}filter(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let n=D(this);return new n(o=>this.subscribe({next(s){try{if(!e(s))return}catch(i){return o.error(i)}o.next(s)},error(s){o.error(s)},complete(){o.complete()}}))}reduce(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let n=D(this),o=arguments.length>1,s=!1,a=arguments[1];return new n(c=>this.subscribe({next(m){let l=!s;if(s=!0,!l||o)try{a=e(a,m)}catch(h){return c.error(h)}else a=m},error(m){c.error(m)},complete(){if(!s&&!o)return c.error(new TypeError("Cannot reduce an empty sequence"));c.next(a),c.complete()}}))}async all(){let e=[];return await this.forEach(n=>e.push(n)),e}concat(...e){let n=D(this);return new n(o=>{let s,i=0;function a(c){s=c.subscribe({next(m){o.next(m)},error(m){o.error(m)},complete(){i===e.length?(s=void 0,o.complete()):a(n.from(e[i++]))}})}return a(this),()=>{s&&(s.unsubscribe(),s=void 0)}})}flatMap(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let n=D(this);return new n(o=>{let s=[],i=this.subscribe({next(c){if(e)try{c=e(c)}catch(l){return o.error(l)}let m=n.from(c).subscribe({next(l){o.next(l)},error(l){o.error(l)},complete(){let l=s.indexOf(m);l>=0&&s.splice(l,1),a()}});s.push(m)},error(c){o.error(c)},complete(){a()}});function a(){i.closed&&s.length===0&&o.complete()}return()=>{s.forEach(c=>c.unsubscribe()),i.unsubscribe()}})}[se](){return this}static from(e){let n=typeof this=="function"?this:Z;if(e==null)throw new TypeError(e+" is not an object");let o=Y(e,se);if(o){let s=o.call(e);if(Object(s)!==s)throw new TypeError(s+" is not an object");return sr(s)&&s.constructor===n?s:new n(i=>s.subscribe(i))}if(ze("iterator")&&(o=Y(e,or),o))return new n(s=>{G(()=>{if(!s.closed){for(let i of o.call(e))if(s.next(i),s.closed)return;s.complete()}})});if(Array.isArray(e))return new n(s=>{G(()=>{if(!s.closed){for(let i=0;i<e.length;++i)if(s.next(e[i]),s.closed)return;s.complete()}})});throw new TypeError(e+" is not observable")}static of(...e){let n=typeof this=="function"?this:Z;return new n(o=>{G(()=>{if(!o.closed){for(let s=0;s<e.length;++s)if(o.next(e[s]),o.closed)return;o.complete()}})})}static get[Ve](){return this}};H.Observable=K,Object.defineProperty(K,Symbol("extensions"),{value:{symbol:se,hostReportError:A},configurable:!0});var cr=H.Observable;const lr=rr(cr),{log__:ur,err__:mr}=k("init-flows"),fr=t=>({stripePR:pr("stripePR",V.stripePR.init({context:t}))}),pr=(t,e)=>{const n=new lr(o=>{o.next({status:"loading"}),e.then(s=>{o.next({status:"loaded",result:s})}).catch(s=>{o.next({status:"error",message:s.message})})});return n.subscribe({next:o=>{ur(`${t} flow result`,o)},error:o=>{throw mr(`${t} flow initialization error:
|
|
21
|
-
${JSON.stringify(o)}`),o}}),n},Ge={isLoading:!0,isAvailable:!1,startFlow:async()=>{}},Ke={isLoading:!1,isAvailable:!1,startFlow:async()=>{}};class hr{constructor(e){this.formInstance=e,this.config=e.config,this.formId=e.formId,this.eventTargets={},this.nonces=new Set}handleMessage(e){var c;if(!e.source)throw new Error("No source found");if(e.origin!==((c=this.formInstance.config._frameUrl)==null?void 0:c.origin)||typeof e.data=="object"&&e.data.penpal)return;const n=zt(JSON.parse(e.data));if(!this.validateEvent(n))return;const{elementId:s,payload:i}=n;switch(i.type){case"LAYOUT":this.handleLayoutEvent(i);break;case"FOCUS":this.handleFocusEvent(s,i.elementType);break;case"BLUR":this.handleBlurEvent(s,i.elementType);break;case"CHANGE":this.handleChangeEvent(s,i.elementType,i.errors);break;case"LOADED":this.handleLoadedEvent(e.source,s,i);break;case"LOAD_ERROR":this.handleLoadErrorEvent(i);break;case"VALIDATION_ERROR":this.handleValidationErrorEvent(i,s);break}}validateEvent(e){return e.formId!==this.formInstance.formId||!e.elementId||this.nonces.has(e.nonce)?!1:(this.nonces.add(e.nonce),!0)}handleLayoutEvent(e){const n=e.height?`${e.height}px`:"100%";this.formInstance.setFormHeight(n)}handleFocusEvent(e,n){this.config.onFocus&&this.config.onFocus(e,n)}handleBlurEvent(e,n){this.config.onBlur&&this.config.onBlur(e,n)}handleChangeEvent(e,n,o){this.config.onChange&&this.config.onChange(e,n,o)}async handleLoadedEvent(e,n,o){this.eventTargets[n]=e,this.formInstance.onCdeLoaded(o),this.config.onLoad&&this.config.onLoad(o.totalAmountAtoms,o.currency)}handleLoadErrorEvent(e){this.formInstance.config.onLoadError&&this.formInstance.config.onLoadError(e.message)}handleValidationErrorEvent(e,n){this.formInstance.config.onValidationError&&this.formInstance.config.onValidationError(e.elementType,e.errors,n)}postEventToFrame(e,n,o){Vt(e,this.formId,n,o,this.config.baseUrl)}}async function dr(t,e){const o=await le.connectToChild({iframe:t,debug:!0,childOrigin:e}).promise,s=await Ht(o);if(!Yt(o,s))throw new Error("Got invalid CDE connection object");return o}class yr{constructor(){this.connections=new Map}addConnection(e,n){this.connections.set(e,n)}getConnection(){const e=this.connections.values().next().value;if(!e)throw new Error("Connection not found");return e}getAllConnections(){return this.connections}}const x=class x{constructor(e){this.tryInitOjsFlows=()=>{this.ojsFlowsInitialization===null&&this.cdeLoadedPayload&&this.connectionManager.getAllConnections().size!==0&&(this.ojsFlowsInitialization=fr(this.createOjsFlowContext()),this.ojsFlowsInitialization.stripePR.subscribe(n=>this.onStripePRStatusChange(n)))},this.onCdeLoaded=n=>{this.cdeLoadedPayload||(this.cdeLoadedPayload=n,this.tryInitOjsFlows())},this.onStripePRStatusChange=n=>{var o,s,i,a,c,m;if(n.status==="loading")(s=(o=this.config).onPaymentRequestLoad)==null||s.call(o,{apple_pay:Ge,google_pay:Ge});else if(n.status==="error")(a=(i=this.config).onPaymentRequestLoad)==null||a.call(i,{apple_pay:Ke,google_pay:Ke});else if(n.status==="loaded"){const l=n.result,h=l.isAvailable&&l.availableProviders.applePay,O=l.isAvailable&&l.availableProviders.googlePay;(m=(c=this.config).onPaymentRequestLoad)==null||m.call(c,{apple_pay:{isLoading:!1,isAvailable:h,startFlow:async _=>h?this.submitPaymentRequest("apple_pay",l,_):void 0},google_pay:{isLoading:!1,isAvailable:O,startFlow:async _=>O?this.submitPaymentRequest("google_pay",l,_):void 0}})}},this.submitPaymentRequest=(n,o,s)=>{const i=this.createOjsFlowContext();return V.stripePR.run({context:i,checkoutPaymentMethod:Be(i.checkoutPaymentMethods,n),nonCdeFormInputs:this.getNonCdeFormInputs(),flowCallbacks:this.createOjsFlowCallbacks(),customParams:{provider:n,overridePaymentRequest:s==null?void 0:s.overridePaymentRequest},initResult:o})},x.assignAsSingleton(this),this.config={...e,baseUrl:e.baseUrl??"https://cde.getopenpay.com"},this.elements=null,this.formId=`opjs-form-${window.crypto.randomUUID()}`,this.referer=window.location.origin,this.formTarget=e.formTarget??"body",this.formProperties={height:"1px"},this.cdeLoadedPayload=null,this.ojsFlowsInitialization=null,this.checkoutFired=!1,this.connectionManager=new yr,this.eventHandler=new hr(this),this.ojsVersion="0.1.6",window.addEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}static assignAsSingleton(e){if(x.getInstance())throw new Error("OpenPay instance already exists. Only one instance is allowed.");window.ojs=e}static getInstance(){return window.ojs??null}getConnectionManager(){return this.connectionManager}setFormHeight(e){this.formProperties.height=e,this.elements&&Object.values(this.elements).forEach(n=>{n.node.style.height=e})}createElement(e,n={}){if(!this.config)throw new Error("OpenPay form not initialized");const o=st.parse(e),s=document.createElement("iframe"),i=this.buildQueryString(n);s.name=`${o}-element`;const a=new URL(`/app/v1/${s.name}`,this.config.baseUrl);a.search=i.toString(),s.src=a.href,this.config._frameUrl=a,s.style.border="none",s.style.width="100%";const c={type:o,node:s,mount:m=>{var l;return(l=document.querySelector(m))==null?void 0:l.appendChild(s)}};return this.connectToElement(c),this.elements?this.elements[o]=c:this.elements={[o]:c},c}buildQueryString(e){const n=new URLSearchParams;return n.append("referer",this.referer),n.append("formId",this.formId),e.styles&&n.append("styles",qt(e.styles)),n.append("secureToken",this.config.checkoutSecureToken),n}connectToElement(e){dr(e.node).then(n=>{this.connectionManager.addConnection(e.type,n),this.tryInitOjsFlows()}).catch(n=>{})}getFormDiv(){return document.querySelector(this.formTarget)??document.body}createOjsFlowContext(){const e=this.connectionManager.getAllConnections();if(!this.cdeLoadedPayload)throw new Error("Requested context while CDE not yet loaded");if(e.size===0)throw new Error("No CDE connections found");return{baseUrl:new URL(this.config.baseUrl??Je).origin,formDiv:this.getFormDiv(),elementsSessionId:this.cdeLoadedPayload.sessionId,checkoutPaymentMethods:this.cdeLoadedPayload.checkoutPaymentMethods,cdeConnections:e}}getNonCdeFormInputs(){return Bt(this.getFormDiv())}createOjsFlowCallbacks(){const e=()=>{};return{onCheckoutError:j("onCheckoutError",this.config.onCheckoutError??e),onCheckoutStarted:j("onCheckoutStarted",this.config.onCheckoutStarted??e),onCheckoutSuccess:j("onCheckoutSuccess",this.config.onCheckoutSuccess??e),onSetupPaymentMethodSuccess:j("onSetupPaymentMethodSuccess",this.config.onSetupPaymentMethodSuccess??e),onValidationError:j("onValidationError",this.config.onValidationError??e)}}submit(){const e=this.createOjsFlowContext();V.commonCC.run({context:e,checkoutPaymentMethod:Be(e.checkoutPaymentMethods,"credit_card"),nonCdeFormInputs:this.getNonCdeFormInputs(),flowCallbacks:this.createOjsFlowCallbacks(),customParams:void 0,initResult:void 0})}onPaymentRequestError(e){this.checkoutFired=!1,this.config.onCheckoutError&&this.config.onCheckoutError(e)}destroy(){for(const e of Object.values(this.elements??{}))e.node.remove();window.removeEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}};x.ojsFlows=V;let ce=x;w.FieldName=P,w.OpenPayForm=ce,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgudW1kLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3pvZCcpLCByZXF1aXJlKCd1dWlkJyksIHJlcXVpcmUoJ3BlbnBhbCcpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnem9kJywgJ3V1aWQnLCAncGVucGFsJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuT3BlblBheSA9IHt9LCBnbG9iYWwuem9kLCBnbG9iYWwudXVpZCwgZ2xvYmFsLnBlbnBhbCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCB6b2QsIHV1aWQsIHBlbnBhbCkgeyAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgRlJBTUVfQkFTRV9VUkwgPSBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCI7XG5cbiAgY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgbG9jOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgbXNnOiB6b2Quei5zdHJpbmcoKSxcbiAgICB1cmw6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gem9kLnouYXJyYXkoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSk7XG4gIGNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNvZGU6IHpvZC56LnN0cmluZygpLFxuICAgIG1lc3NhZ2U6IHpvZC56LnN0cmluZygpLFxuICAgIHBhdGg6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6b2Quei5hcnJheShab2RGaWVsZEVycm9yKTtcbiAgY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxuICB9O1xuICBjb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHJldHVybiBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFW2tleV0gPz8gb2dFcnJvck1lc3NhZ2U7XG4gIH07XG4gIGNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKHJlc3BvbnNlWzBdLm1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGAke2BQbGVhc2UgZml4IHRoZSBmb2xsb3dpbmcgZXJyb3JzOmB9XG4ke2J1bGxldGVkfWA7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzID0gKGVycm9ycykgPT4ge1xuICAgIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbiAgfTtcbiAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoaXNTdHJpbmdpZmllZEpzb25PYmplY3QoZS5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvcihvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlICsgXCJcIjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IFJlcXVpcmVkU3RyaW5nID0gem9kLnouc3RyaW5nKCkudHJpbSgpLm1pbigxLCB7IG1lc3NhZ2U6IGBDYW5ub3QgYmUgYmxhbmtgIH0pO1xuICBjb25zdCBPcHRpb25hbFN0cmluZyA9IHpvZC56LnN0cmluZygpLnRyaW0oKS5vcHRpb25hbCgpO1xuICBjb25zdCBudWxsT3JVbmRlZk9yJDEgPSAoelR5cGUpID0+IHpvZC56Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuICB2YXIgRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoRmllbGROYW1lMikgPT4ge1xuICAgIEZpZWxkTmFtZTJbXCJGSVJTVF9OQU1FXCJdID0gXCJmaXJzdE5hbWVcIjtcbiAgICBGaWVsZE5hbWUyW1wiTEFTVF9OQU1FXCJdID0gXCJsYXN0TmFtZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJFTUFJTFwiXSA9IFwiZW1haWxcIjtcbiAgICBGaWVsZE5hbWUyW1wiWklQX0NPREVcIl0gPSBcInppcENvZGVcIjtcbiAgICBGaWVsZE5hbWUyW1wiQ0lUWVwiXSA9IFwiY2l0eVwiO1xuICAgIEZpZWxkTmFtZTJbXCJTVEFURVwiXSA9IFwic3RhdGVcIjtcbiAgICBGaWVsZE5hbWUyW1wiQ09VTlRSWVwiXSA9IFwiY291bnRyeVwiO1xuICAgIEZpZWxkTmFtZTJbXCJBRERSRVNTXCJdID0gXCJhZGRyZXNzXCI7XG4gICAgRmllbGROYW1lMltcIlBIT05FXCJdID0gXCJwaG9uZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJQUk9NT1RJT05fQ09ERVwiXSA9IFwicHJvbW90aW9uQ29kZVwiO1xuICAgIHJldHVybiBGaWVsZE5hbWUyO1xuICB9KShGaWVsZE5hbWUgfHwge30pO1xuICBjb25zdCBGaWVsZE5hbWVFbnVtID0gem9kLnoubmF0aXZlRW51bShGaWVsZE5hbWUpO1xuICB2YXIgUHJpdmF0ZUZpZWxkTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFByaXZhdGVGaWVsZE5hbWUyKSA9PiB7XG4gICAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZE51bWJlclwiO1xuICAgIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmRFeHBpcnlcIjtcbiAgICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkQ3ZjXCI7XG4gICAgcmV0dXJuIFByaXZhdGVGaWVsZE5hbWUyO1xuICB9KShQcml2YXRlRmllbGROYW1lIHx8IHt9KTtcbiAgY29uc3QgUHJpdmF0ZUZpZWxkTmFtZUVudW0gPSB6b2Quei5uYXRpdmVFbnVtKFByaXZhdGVGaWVsZE5hbWUpO1xuICBjb25zdCBBbGxGaWVsZE5hbWVzID0gem9kLnoudW5pb24oW0ZpZWxkTmFtZUVudW0sIFByaXZhdGVGaWVsZE5hbWVFbnVtXSk7XG4gIHZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gICAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRcIl0gPSBcImNhcmRcIjtcbiAgICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmQtbnVtYmVyXCI7XG4gICAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICAgIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX0NWQ1wiXSA9IFwiY2FyZC1jdmNcIjtcbiAgICByZXR1cm4gRWxlbWVudFR5cGVFbnVtMjtcbiAgfSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbiAgY29uc3QgRWxlbWVudFR5cGUgPSB6b2Quei5uYXRpdmVFbnVtKEVsZW1lbnRUeXBlRW51bSk7XG4gIGNvbnN0IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxID0gem9kLnoub2JqZWN0KHtcbiAgICBwcm92aWRlcjogem9kLnouc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3IkMSh6b2Quei5zdHJpbmcoKSksXG4gICAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3IkMSh6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIGNvbnN0IFBheW1lbnRNZXRob2RNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBpZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgY2FyZE51bWJlcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgZXhwaXJ5OiBPcHRpb25hbFN0cmluZyxcbiAgICBjdmM6IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIGJhY2tncm91bmRDb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgY29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGZvbnRGYW1pbHk6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGZvbnRTaXplOiBPcHRpb25hbFN0cmluZyxcbiAgICBmb250V2VpZ2h0OiBPcHRpb25hbFN0cmluZyxcbiAgICBtYXJnaW46IE9wdGlvbmFsU3RyaW5nLFxuICAgIHBhZGRpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGxldHRlclNwYWNpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGxpbmVIZWlnaHQ6IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICBjb25zdCBFdmVudFR5cGUgPSB6b2Quei5lbnVtKFtcbiAgICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgICBcIkxBWU9VVFwiLFxuICAgIFwiTE9BREVEXCIsXG4gICAgXCJCTFVSXCIsXG4gICAgXCJGT0NVU1wiLFxuICAgIFwiQ0hBTkdFXCIsXG4gICAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gICAgXCJDSEVDS09VVF9TVEFSVEVEXCIsXG4gICAgXCJQQVlNRU5UX0ZMT1dfU1RBUlRFRFwiLFxuICAgIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICAgIFwiQ0hFQ0tPVVRfU1VDQ0VTU1wiLFxuICAgIFwiTE9BRF9FUlJPUlwiLFxuICAgIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICAgIFwiVE9LRU5JWkVfRVJST1JcIixcbiAgICBcIkNIRUNLT1VUX0VSUk9SXCIsXG4gICAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gICAgLy8gRm9ybSAtPiBFbGVtZW50XG4gICAgXCJUT0tFTklaRVwiLFxuICAgIFwiQ0hFQ0tPVVRcIixcbiAgICBcIlNUQVJUX1BBWU1FTlRfRkxPV1wiXG4gIF0pO1xuICBjb25zdCBHZW5lcmljRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVE9LRU5JWkVfU1RBUlRFRFwiLCBcIkNIRUNLT1VUX1NUQVJURURcIl0pO1xuICBjb25zdCBHZW5lcmljRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbiAgY29uc3QgSW5wdXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJCTFVSXCIsIFwiRk9DVVNcIiwgXCJDSEFOR0VcIl0pO1xuICBjb25zdCBJbnB1dEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogSW5wdXRFdmVudFR5cGUsXG4gICAgZWxlbWVudFR5cGU6IFByaXZhdGVGaWVsZE5hbWVFbnVtLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLm9wdGlvbmFsKClcbiAgfSk7XG4gIGNvbnN0IEVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiTE9BRF9FUlJPUlwiLCBcIlRPS0VOSVpFX0VSUk9SXCIsIFwiQ0hFQ0tPVVRfRVJST1JcIl0pO1xuICBjb25zdCBFcnJvckV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogRXJyb3JFdmVudFR5cGUsXG4gICAgbWVzc2FnZTogUmVxdWlyZWRTdHJpbmcsXG4gICAgaGVhZGVyczogem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSk7XG4gIGNvbnN0IFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlLFxuICAgIGVsZW1lbnRUeXBlOiBBbGxGaWVsZE5hbWVzLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICBjb25zdCBMYXlvdXRFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTEFZT1VUKSxcbiAgICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG4gIH0pO1xuICBjb25zdCBMb2FkZWRFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTE9BREVEKSxcbiAgICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICAgIHRvdGFsQW1vdW50QXRvbXM6IHpvZC56Lm51bWJlcigpLFxuICAgIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2RzOiB6b2Quei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QkMSlcbiAgfSk7XG4gIGNvbnN0IFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5QQVlNRU5UX0ZMT1dfU1RBUlRFRCksXG4gICAgbmV4dEFjdGlvbk1ldGFkYXRhOiB6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSxcbiAgICBwYXltZW50Rmxvd01ldGFkYXRhOiB6b2Quei5hbnkoKS5vcHRpb25hbCgpLFxuICAgIHN0YXJ0UEZNZXRhZGF0YTogem9kLnoub3B0aW9uYWwoem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSkpXG4gIH0pO1xuICBjb25zdCBTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSxcbiAgICBwYXltZW50TWV0aG9kSWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBSZXF1aXJlZEZvcm1GaWVsZHMgPSB6b2Quei5vYmplY3Qoe1xuICAgIFtcImZpcnN0TmFtZVwiIC8qIEZJUlNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICBjb25zdCBQUkZvcm1GaWVsZHMgPSB6b2Quei5vYmplY3Qoe1xuICAgIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICBjb25zdCBTdWJtaXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRVwiLCBcIkNIRUNLT1VUXCIsIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJdKTtcbiAgY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBTdWJtaXRFdmVudFR5cGUsXG4gICAgc2Vzc2lvbklkOiBSZXF1aXJlZFN0cmluZyxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGE6IHpvZC56LmFueSgpLm9wdGlvbmFsKCksXG4gICAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHpvZC56LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZ1xuICB9KS5leHRlbmQoUmVxdWlyZWRGb3JtRmllbGRzLnNoYXBlKTtcbiAgY29uc3QgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFX1NVQ0NFU1MpLFxuICAgIGlzUmVhZHlGb3JDaGVja291dDogem9kLnouYm9vbGVhbigpXG4gIH0pO1xuICBjb25zdCBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUyksXG4gICAgaW52b2ljZVVybHM6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBzdWJzY3JpcHRpb25JZHM6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBjdXN0b21lcklkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgRXZlbnRQYXlsb2FkID0gem9kLnouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgR2VuZXJpY0V2ZW50UGF5bG9hZCxcbiAgICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgICBFcnJvckV2ZW50UGF5bG9hZCxcbiAgICBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQsXG4gICAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICAgIExvYWRlZEV2ZW50UGF5bG9hZCxcbiAgICBTdWJtaXRFdmVudFBheWxvYWQsXG4gICAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICAgIENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCxcbiAgICBQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQsXG4gICAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbiAgXSk7XG4gIGNvbnN0IEVsZW1lbnRFdmVudCA9IHpvZC56Lm9iamVjdCh7XG4gICAgcGF5bG9hZDogRXZlbnRQYXlsb2FkLFxuICAgIG5vbmNlOiBSZXF1aXJlZFN0cmluZyxcbiAgICBmb3JtSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICAgIGVsZW1lbnRJZDogUmVxdWlyZWRTdHJpbmdcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgYW1vdW50QXRvbTogem9kLnoubnVtYmVyKCksXG4gICAgY3VycmVuY3k6IFJlcXVpcmVkU3RyaW5nXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlY3VyZV90b2tlbjogem9kLnouc3RyaW5nKCksXG4gICAgcHJvbW90aW9uX2NvZGU6IHpvZC56LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2VjdXJlX3Rva2VuOiB6b2Quei5zdHJpbmcoKSxcbiAgICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHBheW1lbnRfbWV0aG9kczogem9kLnouYXJyYXkoUGF5bWVudE1ldGhvZE1pbmltYWwpXG4gIH0pO1xuICBjb25zdCBGaWVsZFZhbGlkYXRpb25FcnJvciA9IHpvZC56Lm9iamVjdCh7XG4gICAgZWxlbWVudFR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlc3Npb25faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBzdWNjZXNzOiB6b2Quei5saXRlcmFsKGZhbHNlKSxcbiAgICBlcnJvcl90eXBlOiB6b2Quei5saXRlcmFsKFwidmFsaWRhdGlvbl9lcnJvclwiKSxcbiAgICBlcnJvcnM6IHpvZC56LmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxuICB9KTtcbiAgY29uc3QgVG9rZW5pemVDYXJkUmVzcG9uc2UgPSB6b2Quei5kaXNjcmltaW5hdGVkVW5pb24oXCJzdWNjZXNzXCIsIFtcbiAgICB6b2Quei5vYmplY3QoeyBzdWNjZXNzOiB6b2Quei5saXRlcmFsKHRydWUpIH0pLFxuICAgIFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2VcbiAgXSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2Vzc2lvbl9pZDogem9kLnouc3RyaW5nKCksXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6b2Quei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZXNzaW9uX2lkOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzXG4gIH0pO1xuICB2YXIgVGhyZWVEU1N0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyAoKFRocmVlRFNTdGF0dXMyKSA9PiB7XG4gICAgVGhyZWVEU1N0YXR1czJbXCJTVUNDRVNTXCJdID0gXCJzdWNjZXNzXCI7XG4gICAgVGhyZWVEU1N0YXR1czJbXCJGQUlMVVJFXCJdID0gXCJmYWlsdXJlXCI7XG4gICAgVGhyZWVEU1N0YXR1czJbXCJDQU5DRUxMRURcIl0gPSBcImNhbmNlbGxlZFwiO1xuICAgIHJldHVybiBUaHJlZURTU3RhdHVzMjtcbiAgfSkoVGhyZWVEU1N0YXR1cyB8fCB7fSk7XG4gIGNvbnN0IFBpbmczRFNTdGF0dXNSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6b2Quei5lbnVtKFtcInN1Y2Nlc3NcIiAvKiBTVUNDRVNTICovLCBcImZhaWx1cmVcIiAvKiBGQUlMVVJFICovLCBcImNhbmNlbGxlZFwiIC8qIENBTkNFTExFRCAqL10pXG4gIH0pO1xuICBjb25zdCBDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIHJlZGlyZWN0X3VybDogem9kLnouc3RyaW5nKCksXG4gICAgaW5pdGlhbF9pbnRlbnRfaWQ6IHpvZC56LnN0cmluZygpLFxuICAgIGNvbnNlbnRfaWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuXG4gIGNvbnN0IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZCA9IChlcnJvcikgPT4ge1xuICAgIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMoZXJyb3IpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZS5fZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpc3N1ZXNQZXJGaWVsZDtcbiAgfTtcblxuICBjb25zdCBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogem9kLnouc3RyaW5nKCksXG4gICAgY2xpZW50X3NlY3JldDogem9kLnouc3RyaW5nKCksXG4gICAgc3RyaXBlX3BtX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIGNsaWVudF9zZWNyZXQ6IHpvZC56LnN0cmluZygpLFxuICAgIHN0cmlwZV9wazogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IG91ckN1cnJlbmN5VG9UaGVpcnMgPSB7XG4gICAgdXNkOiBcInVzZFwiLFxuICAgIGJybDogXCJicmxcIlxuICB9O1xuICBjb25zdCBnZXRMb2FkZWRTdHJpcGUgPSBhc3luYyAocHVibGlzaGFibGVLZXkpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaXBlSnNQcmVzZW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaXBlID0gbmV3IFN0cmlwZShwdWJsaXNoYWJsZUtleSk7XG4gICAgcmV0dXJuIHN0cmlwZTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICAgIGNvbnN0IHBheW1lbnRSZXF1ZXN0ID0gc3RyaXBlLnBheW1lbnRSZXF1ZXN0KHtcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHN0cmlwZSBhY2NvdW50IGNvdW50cnkgYXMgc29vbiBhcyB3ZSBzdXBwb3J0IGl0XG4gICAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgICBjdXJyZW5jeTogc3RyaXBlQ3VycmVuY3ksXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgICBhbW91bnQ6IHRvdGFsQW1vdW50QXRvbSxcbiAgICAgICAgcGVuZGluZzogaXNBbW91bnRQZW5kaW5nXG4gICAgICB9LFxuICAgICAgcmVxdWVzdFBheWVyTmFtZTogdHJ1ZSxcbiAgICAgIHJlcXVlc3RQYXllckVtYWlsOiB0cnVlLFxuICAgICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICAgIH0pO1xuICAgIHJldHVybiBwYXltZW50UmVxdWVzdDtcbiAgfTtcbiAgY29uc3Qgc2xlZXAgPSAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIlN0cmlwZVwiIGluIHdpbmRvdztcbiAgfTtcbiAgY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2dCk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gICAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5leHQgYWN0aW9uIG1ldGFkYXRhIGZvcm1hdDogJHtKU09OLnN0cmluZ2lmeShuZXh0QWN0aW9uTWV0YWRhdGEpfWApO1xuICAgIH1cbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICAgIH0pO1xuICAgIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgZmFpbGVkOiAke2NvbmZpcm1SZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgdW5rbm93bmB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cgPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgICAgcGF5bWVudF9tZXRob2Q6IG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcG1faWRcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHRTdGF0dXMgPSBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5zdGF0dXM7XG4gICAgaWYgKHJlc3VsdFN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikgOyBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IGNhbmNlbGxlZCwgcGxlYXNlIGNsaWNrIFN1Ym1pdCBhZ2FpbiB0byBwYXlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtjb25maXJtUmVzdWx0LmVycm9yPy5tZXNzYWdlID8/IGNvbmZpcm1SZXN1bHQuc2V0dXBJbnRlbnQ/Lmxhc3Rfc2V0dXBfZXJyb3I/Lm1lc3NhZ2UgPz8gXCJQYXltZW50IGZhaWxlZCwgcGxlYXNlIGNsaWNrIHN1Ym1pdCBhZ2FpbiB0byBwYXkuXCJ9YFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcgPSAoc3R5bGVzKSA9PiB7XG4gICAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRTdHlsZXM7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gICAgY29uc3QgaW5jbHVkZWRJbnB1dHMgPSBBcnJheS5mcm9tKGZvcm1EaXYucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLW9waWRdXCIpID8/IFtdKTtcbiAgICBjb25zdCBleHRyYURhdGEgPSBpbmNsdWRlZElucHV0cy5yZWR1Y2UoKGFjYywgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm4gYWNjO1xuICAgICAgcmV0dXJuIHsgLi4uYWNjLCBba2V5XTogaW5wdXQudmFsdWUgfTtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIGV4dHJhRGF0YTtcbiAgfTtcbiAgY29uc3QgcGFyc2VFdmVudFBheWxvYWQgPSAoZXZlbnREYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBFbGVtZW50RXZlbnQucGFyc2UoZXZlbnREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG5vbmNlOiB1dWlkLnY0KCksXG4gICAgICBmb3JtSWQsXG4gICAgICBlbGVtZW50SWRcbiAgICB9O1xuICAgIHRhcmdldC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShldmVudCksIGJhc2VVcmwpO1xuICB9O1xuXG4gIGNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb2JqLnNlbmQocGluZyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICAgIHJldHVybiAhIW9iaiAmJiBpc1ZhbGlkO1xuICB9O1xuXG4gIGNvbnN0IG51bGxPclVuZGVmT3IgPSAoelR5cGUpID0+IHpvZC56Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuICB6b2Quei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG4gIGNvbnN0IENERVJlc3BvbnNlRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNkZV9yZXNwb25zZV90eXBlOiB6b2Quei5saXRlcmFsKFwiZXJyb3JcIiksXG4gICAgbWVzc2FnZTogem9kLnouc3RyaW5nKCksXG4gICAgaGVhZGVyczogem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgQ3VycmVuY3lFbnVtID0gem9kLnouZW51bShbXCJ1c2RcIiwgXCJicmxcIl0pO1xuICBjb25zdCBDb3Vwb25NaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBuYW1lOiB6b2Quei5zdHJpbmcoKSxcbiAgICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkpLFxuICAgIHBlcmNlbnRfb2ZmOiBudWxsT3JVbmRlZk9yKHpvZC56Lm51bWJlcigpKSxcbiAgICBjdXJyZW5jeTogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgZHVyYXRpb246IHpvZC56LnN0cmluZygpLFxuICAgIGR1cmF0aW9uX2luX21vbnRoczogbnVsbE9yVW5kZWZPcih6b2Quei5udW1iZXIoKSlcbiAgfSk7XG4gIGNvbnN0IExpbmVJdGVtID0gem9kLnoub2JqZWN0KHtcbiAgICBhbW91bnRfc3VidG90YWxfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgYW1vdW50X3RvdGFsX2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBkZXNjcmlwdGlvbjogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgcHJpY2VfaWQ6IHpvZC56LnN0cmluZygpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkuaW50KCkpLFxuICAgIHF1YW50aXR5OiB6b2Quei5udW1iZXIoKS5pbnQoKVxuICB9KTtcbiAgY29uc3QgQnJhbmRTZXR0aW5ncyA9IHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpO1xuICBjb25zdCBCcmFuZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgbmFtZTogem9kLnouc3RyaW5nKCksXG4gICAgc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoQnJhbmRTZXR0aW5ncylcbiAgfSk7XG4gIGNvbnN0IENoZWNrb3V0UGF5bWVudE1ldGhvZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPcih6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIGNvbnN0IFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBxdWFudGl0eTogem9kLnoubnVtYmVyKClcbiAgfSk7XG4gIGNvbnN0IFN1YnNjcmlwdGlvbk1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGlkOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHpvZC56Lm51bWJlcigpLmludCgpKSxcbiAgICBzdWJzY3JpcHRpb25faXRlbXM6IHpvZC56LmFycmF5KFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsKSxcbiAgICB0cmlhbF9zdGFydDogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgdHJpYWxfZW5kOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBhbW91bnRfYXRvbTogem9kLnoubnVtYmVyKClcbiAgfSk7XG4gIGNvbnN0IEludm9pY2VMaW5lSXRlbU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGFtb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICBhbW91bnRfYXRvbV9jb25zaWRlcmluZ19kaXNjb3VudF9hcHBsaWVkOiB6b2Quei5udW1iZXIoKSxcbiAgICBjdXJyZW5jeTogem9kLnouc3RyaW5nKCksXG4gICAgZGlzY291bnRfYW1vdW50X2F0b21zOiB6b2Quei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpLFxuICAgIHN1YnNjcmlwdGlvbl9pdGVtX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgRGlzY291bnRNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBjb3Vwb246IENvdXBvbk1pbmltYWxcbiAgfSk7XG4gIGNvbnN0IEludm9pY2VNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBjdXJyZW5jeTogem9kLnouc3RyaW5nKCksXG4gICAgZGlzY291bnRzOiB6b2Quei5hcnJheShEaXNjb3VudE1pbmltYWwpLFxuICAgIGhvc3RlZF9pbnZvaWNlX3VybDogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgbGluZXM6IHpvZC56LmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICAgIHJlbWFpbmluZ19hbW91bnRfYXRvbTogem9kLnoubnVtYmVyKCksXG4gICAgdGF4X2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICB0b3RhbF9hbW91bnRfYXRvbTogem9kLnoubnVtYmVyKCksXG4gICAgdG90YWxfZGlzY291bnRfYW1vdW50X2F0b21zOiB6b2Quei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpXG4gIH0pO1xuICBjb25zdCBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNyZWF0ZWQ6IHpvZC56LmFycmF5KFN1YnNjcmlwdGlvbk1pbmltYWwpLFxuICAgIGludm9pY2VzOiB6b2Quei5hcnJheShJbnZvaWNlTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IFByZXZpZXdDaGVja291dFJlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBwcmV2aWV3OiBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwsXG4gICAgcHJldmlld19wb3N0X3RyaWFsOiBudWxsT3JVbmRlZk9yKENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCksXG4gICAgY291cG9uczogem9kLnouYXJyYXkoQ291cG9uTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0YXR1czogem9kLnoubGl0ZXJhbChcIm9wZW5cIiksXG4gICAgdG9rZW46IHpvZC56LnN0cmluZygpLFxuICAgIGVtYWlsOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBsaW5lX2l0ZW1zOiB6b2Quei5hcnJheShMaW5lSXRlbSksXG4gICAgYW1vdW50X3N1YnRvdGFsX2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGFtb3VudF90b3RhbF9hdG9tOiB6b2Quei5udW1iZXIoKS5pbnQoKSxcbiAgICBicmFuZDogQnJhbmQsXG4gICAgc3Vic19wcmV2aWV3OiBudWxsT3JVbmRlZk9yKFByZXZpZXdDaGVja291dFJlc3BvbnNlKSxcbiAgICAvLyBOdWxsIGluIHNldHVwIG1vZGVcbiAgICBtZXRob2RzX2F2YWlsYWJsZTogem9kLnouYXJyYXkoQ2hlY2tvdXRQYXltZW50TWV0aG9kKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudEZvcm1QcmVmaWxsID0gem9kLnouZGlzY3JpbWluYXRlZFVuaW9uKFwibW9kZVwiLCBbXG4gICAgem9kLnoub2JqZWN0KHtcbiAgICAgIG1vZGU6IHpvZC56LmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICAgIGN1cnJlbmN5OiB6b2Quei5udWxsYWJsZSh6b2Quei51bmRlZmluZWQoKSlcbiAgICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSksXG4gICAgem9kLnoub2JqZWN0KHtcbiAgICAgIG1vZGU6IHpvZC56LmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgICBjdXJyZW5jeTogQ3VycmVuY3lFbnVtXG4gICAgfSkuZXh0ZW5kKF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24uc2hhcGUpXG4gIF0pO1xuICBjb25zdCBDb21wbGV0ZWRGb3JtUHJlZmlsbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6b2Quei5saXRlcmFsKFwiY29tcGxldGVcIilcbiAgfSk7XG4gIGNvbnN0IEV4cGlyZWRGb3JtUHJlZmlsbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6b2Quei5saXRlcmFsKFwiZXhwaXJlZFwiKVxuICB9KTtcbiAgem9kLnoudW5pb24oW1BheW1lbnRGb3JtUHJlZmlsbCwgQ29tcGxldGVkRm9ybVByZWZpbGwsIEV4cGlyZWRGb3JtUHJlZmlsbF0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIGxvZ286IHpvZC56LnN0cmluZygpLFxuICAgIGljb246IHpvZC56LnN0cmluZygpLFxuICAgIHByaW1hcnlfY29sb3I6IHpvZC56LnN0cmluZygpLFxuICAgIHNlY29uZGFyeV9jb2xvcjogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IENoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBpbnZvaWNlX3VybHM6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBzdWJzY3JpcHRpb25faWRzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgY3VzdG9tZXJfaWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlY3VyZV90b2tlbjogem9kLnouc3RyaW5nKCksXG4gICAgcGF5bWVudF9pbnB1dDogem9kLnouYW55KCksXG4gICAgLy8gU2hvdWxkIGZvbGxvdyBBbnlQYXltZW50SW5wdXQgZnJvbSBDREVcbiAgICBjdXN0b21lcl9lbWFpbDogem9kLnouc3RyaW5nKCksXG4gICAgY3VzdG9tZXJfemlwX2NvZGU6IHpvZC56LnN0cmluZygpLFxuICAgIGN1c3RvbWVyX2NvdW50cnk6IHpvZC56LnN0cmluZygpLFxuICAgIGxpbmVfaXRlbXM6IHpvZC56LmFycmF5KExpbmVJdGVtKSxcbiAgICB0b3RhbF9hbW91bnRfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgY2FuY2VsX2F0X2VuZDogem9kLnouYm9vbGVhbigpLFxuICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgcHJvbW90aW9uX2NvZGU6IHpvZC56LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogem9kLnouYm9vbGVhbigpLm9wdGlvbmFsKClcbiAgfSk7XG4gIGNvbnN0IFNldHVwQ2hlY2tvdXRSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcGF5bWVudF9tZXRob2RfaWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIGlkOiB6b2Quei5zdHJpbmcoKSxcbiAgICByZXR1cm5fdXJsOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIGxvYzogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIG1zZzogem9kLnouc3RyaW5nKCksXG4gICAgdXJsOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnouYXJyYXkoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IpO1xuICBjb25zdCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogem9kLnouYXJyYXkoem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSkpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIGZpZWxkczogUFJGb3JtRmllbGRzLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlc3Npb25faWQ6IHpvZC56LnN0cmluZygpLFxuICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kXG4gIH0pO1xuICBjb25zdCBTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6b2Quei5hcnJheSh6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSksXG4gICAgY2NfcG1faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICB6b2Quei5yZWNvcmQoem9kLnouYW55KCkpO1xuXG4gIGNvbnN0IHN1bSA9IChhcnIpID0+IHtcbiAgICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGZpeFByb3RvKHRhcmdldCwgcHJvdG90eXBlKSB7XG4gICAgdmFyIHNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuICAgIHNldFByb3RvdHlwZU9mID8gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90b3R5cGUpIDogdGFyZ2V0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTtcbiAgfVxuICBmdW5jdGlvbiBmaXhTdGFjayh0YXJnZXQsIGZuKSB7XG4gICAgaWYgKGZuID09PSB2b2lkIDApIHtcbiAgICAgIGZuID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICAgIH1cblxuICAgIHZhciBjYXB0dXJlU3RhY2tUcmFjZSA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlO1xuICAgIGNhcHR1cmVTdGFja1RyYWNlICYmIGNhcHR1cmVTdGFja1RyYWNlKHRhcmdldCwgZm4pO1xuICB9XG5cbiAgdmFyIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgICAgX19wcm90b19fOiBbXVxuICAgICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICAgIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gICAgICB9XG5cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdmFyIEN1c3RvbUVycm9yID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDdXN0b21FcnJvciwgX3N1cGVyKTtcblxuICAgIGZ1bmN0aW9uIEN1c3RvbUVycm9yKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcblxuICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSwgb3B0aW9ucykgfHwgdGhpcztcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCAnbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IF9uZXdUYXJnZXQubmFtZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBmaXhQcm90byhfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpO1xuICAgICAgZml4U3RhY2soX3RoaXMpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FcnJvcjtcbiAgfShFcnJvcik7XG5cbiAgY2xhc3MgQ2RlRXJyb3IgZXh0ZW5kcyBDdXN0b21FcnJvciB7XG4gICAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IGZyaWVuZGx5TWVzc2FnZSA9IGBbY2RlLWNsaWVudF0gRXJyb3IgcXVlcnlpbmcgQ0RFOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YDtcbiAgICAgIHN1cGVyKGZyaWVuZGx5TWVzc2FnZSk7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgfVxuICAgIGdldCBvcmlnaW5hbEVycm9yTWVzc2FnZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgfVxuICB9XG4gIGNvbnN0IHF1ZXJ5Q0RFID0gYXN5bmMgKGNkZUNvbm4sIGRhdGEsIHJlc3BvbnNlU2NoZW1hKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gICAgaWYgKGlzQ0RFUmVzcG9uc2VFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBDZGVFcnJvcihyZXNwb25zZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEocmVzcG9uc2UsIHJlc3BvbnNlU2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKTtcbiAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9O1xuICBjb25zdCBjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSA9ICh2YWx1ZSwgc2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3M7XG4gIH07XG4gIGNvbnN0IGlzQ0RFUmVzcG9uc2VFcnJvciA9IChyZXNwb25zZSkgPT4ge1xuICAgIHJldHVybiBDREVSZXNwb25zZUVycm9yLnNhZmVQYXJzZShyZXNwb25zZSkuc3VjY2VzcztcbiAgfTtcbiAgY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3ID0gYXN5bmMgKGNkZUNvbm4sIHJlcXVlc3QpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9jaGVja291dF9wcmV2aWV3XCIsIHBheWxvYWQ6IHJlcXVlc3QgfSwgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBnZXRQcmVmaWxsID0gYXN5bmMgKGNkZUNvbm4pID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9wcmVmaWxsXCIsIHBheWxvYWQ6IHt9IH0sIFBheW1lbnRGb3JtUHJlZmlsbCk7XG4gIH07XG4gIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBzdGFydFBheW1lbnRGbG93Rm9yUFIgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IGNvbmZpcm1QYXltZW50RmxvdyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjb25maXJtX3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIENvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgfTtcbiAgY29uc3QgZ2V0Q2hlY2tvdXRWYWx1ZSA9IGFzeW5jIChjZGVDb25uLCBzZWN1cmVUb2tlbiwgcHJvbW9Db2RlKSA9PiB7XG4gICAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3KGNkZUNvbm4sIHtcbiAgICAgIHNlY3VyZV90b2tlbjogc2VjdXJlVG9rZW4sXG4gICAgICBwcm9tb3Rpb25fY29kZTogcHJvbW9Db2RlXG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVuY2llcyA9IG5ldyBTZXQoY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5jdXJyZW5jeSkpO1xuICAgIGlmIChjdXJyZW5jaWVzLnNpemUgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgY3VycmVuY3ksIGdvdCAke2N1cnJlbmNpZXMuc2l6ZX1gKTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLnZhbHVlcygpLm5leHQoKS52YWx1ZSA/PyBcInVzZFwiO1xuICAgIGNvbnN0IGFtb3VudEF0b20gPSBzdW0oY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5yZW1haW5pbmdfYW1vdW50X2F0b20pKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVuY3ksXG4gICAgICBhbW91bnRBdG9tXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50ID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBpc1NldHVwTW9kZSwgcHJvbW9Db2RlKSA9PiB7XG4gICAgaWYgKGlzU2V0dXBNb2RlKSB7XG4gICAgICByZXR1cm4geyBhbW91bnRBdG9tOiAwLCBjdXJyZW5jeTogXCJ1c2RcIiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9tb0NvZGUgPSAhcHJvbW9Db2RlID8gdm9pZCAwIDogcHJvbW9Db2RlO1xuICAgICAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRWYWx1ZShjZGVDb25uLCBzZWN1cmVUb2tlbiwgcHJvbW9Db2RlKTtcbiAgICAgIHJldHVybiB7IGFtb3VudEF0b206IGNoZWNrb3V0UHJldmlldy5hbW91bnRBdG9tLCBjdXJyZW5jeTogY2hlY2tvdXRQcmV2aWV3LmN1cnJlbmN5IH07XG4gICAgfVxuICB9O1xuICBjb25zdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zID0gYXN5bmMgKGFsbENkZUNvbm5lY3Rpb25zLCBwYXlsb2FkKSA9PiB7XG4gICAgaWYgKGFsbENkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIENERSBjb25uZWN0aW9ucyBmb3VuZFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKGFsbENkZUNvbm5lY3Rpb25zLnZhbHVlcygpKS5tYXAoXG4gICAgICAgIChjZGVDb25uKSA9PiBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwidG9rZW5pemVfY2FyZFwiLCBwYXlsb2FkIH0sIFRva2VuaXplQ2FyZFJlc3BvbnNlKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlcztcbiAgfTtcbiAgY29uc3QgY2hlY2tvdXRDYXJkRWxlbWVudHMgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImNoZWNrb3V0X2NhcmRfZWxlbWVudHNcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzZXR1cF9wYXltZW50X21ldGhvZFwiLCBwYXlsb2FkIH0sIFNldHVwQ2hlY2tvdXRSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dFwiLCBwYXlsb2FkIH0sIENoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlKTtcbiAgfTtcbiAgY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG4gIGNvbnN0IHBpbmdDZGVGb3IzZHNTdGF0dXMgPSBhc3luYyAoaWZyYW1lLCBjaGlsZE9yaWdpbikgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBwZW5wYWwuY29ubmVjdFRvQ2hpbGQoe1xuICAgICAgaWZyYW1lLFxuICAgICAgZGVidWc6IHRydWUsXG4gICAgICB0aW1lb3V0OiBDREVfUE9MTElOR19JTlRFUlZBTCxcbiAgICAgIGNoaWxkT3JpZ2luXG4gICAgfSk7XG4gICAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeUNERShjb25uZWN0aW9uT2JqLCB7IHR5cGU6IFwicGluZy0zZHMtc3RhdHVzXCIgfSwgUGluZzNEU1N0YXR1c1Jlc3BvbnNlKTtcbiAgICByZXR1cm4gcmVzdWx0LnN0YXR1cztcbiAgfTtcblxuICBjb25zdCBzdHlsZXMkMiA9IFwiQGtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOSl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZSgxKX19Lm92ZXJsYXl7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoyMTQ3NDgzNjQ4IWltcG9ydGFudDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwODB9LmNvbnRhaW5lcnttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtwb3NpdGlvbjpyZWxhdGl2ZTthbmltYXRpb246ZmFkZUluIC4zcyBlYXNlLW91dH0uZnJhbWV7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6bm9uZX0uY2FuY2VsLWJ1dHRvbntwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dG9wOi0xLjVyZW07cGFkZGluZzowO3JpZ2h0OjB9XCI7XG5cbiAgY29uc3QgY3JlYXRlQW5kT3BlbkZyYW1lID0gKHVybCkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGBcbiAgICA8c3R5bGU+XG4gICAgICAke3N0eWxlcyQyfVxuICAgIDwvc3R5bGU+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGlmcmFtZSBzcmM9XCIke3VybH1cIiBjbGFzcz1cImZyYW1lXCIgaWQ9XCJ0aHJlZS1kcy1pZnJhbWVcIiB0aXRsZT1cIjNEIFNlY3VyZSB2ZXJpZmljYXRpb25cIiBhbGxvdz1cInBheW1lbnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gICAgY29uc3QgY2FuY2VsQnV0dG9uID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiLmNhbmNlbC1idXR0b25cIik7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcbiAgICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHN0YXJ0UG9sbGluZyhpZnJhbWUsIG9uU3VjY2VzcywgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcGluZ0NkZUZvcjNkc1N0YXR1cyhpZnJhbWUsIGNoaWxkT3JpZ2luKTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICBvblN1Y2Nlc3Moc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIGhhbmRsZVBvbGxpbmcoKTtcbiAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVQb2xsaW5nLCBDREVfUE9MTElOR19JTlRFUlZBTCk7XG4gICAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFdmVudHMoe1xuICAgIGVsZW1lbnRzLFxuICAgIHBvbGxpbmdJbnRlcnZhbCxcbiAgICByZXNvbHZlXG4gIH0pIHtcbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgICAgcmVzb2x2ZShUaHJlZURTU3RhdHVzLkNBTkNFTExFRCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICAgIH07XG4gICAgcmV0dXJuIGNsZWFudXBFdmVudExpc3RlbmVycztcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gICAgdXJsLFxuICAgIGJhc2VVcmxcbiAgfSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gY3JlYXRlQW5kT3BlbkZyYW1lKHVybCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRzLmhvc3QucmVtb3ZlKCk7XG4gICAgICAgIH0sIDFlMyk7XG4gICAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgICAgY2xlYW51cEV2ZW50TGlzdGVuZXJzPy4oKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzdGFydFBvbGxpbmcoZWxlbWVudHMuaWZyYW1lLCBvblN1Y2Nlc3MsIG5ldyBVUkwoYmFzZVVybCkub3JpZ2luKTtcbiAgICAgIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9IGhhbmRsZUV2ZW50cyh7XG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBwb2xsaW5nSW50ZXJ2YWwsXG4gICAgICAgIHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgQU5TSV9CQUNLR1JPVU5EX09GRlNFVCA9IDEwO1xuXG4gIGNvbnN0IHdyYXBBbnNpMTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG5cbiAgY29uc3Qgd3JhcEFuc2kyNTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcblxuICBjb25zdCB3cmFwQW5zaTE2bSA9IChvZmZzZXQgPSAwKSA9PiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JlZH07JHtncmVlbn07JHtibHVlfW1gO1xuXG4gIGNvbnN0IHN0eWxlcyQxID0ge1xuICBcdG1vZGlmaWVyOiB7XG4gIFx0XHRyZXNldDogWzAsIDBdLFxuICBcdFx0Ly8gMjEgaXNuJ3Qgd2lkZWx5IHN1cHBvcnRlZCBhbmQgMjIgZG9lcyB0aGUgc2FtZSB0aGluZ1xuICBcdFx0Ym9sZDogWzEsIDIyXSxcbiAgXHRcdGRpbTogWzIsIDIyXSxcbiAgXHRcdGl0YWxpYzogWzMsIDIzXSxcbiAgXHRcdHVuZGVybGluZTogWzQsIDI0XSxcbiAgXHRcdG92ZXJsaW5lOiBbNTMsIDU1XSxcbiAgXHRcdGludmVyc2U6IFs3LCAyN10sXG4gIFx0XHRoaWRkZW46IFs4LCAyOF0sXG4gIFx0XHRzdHJpa2V0aHJvdWdoOiBbOSwgMjldLFxuICBcdH0sXG4gIFx0Y29sb3I6IHtcbiAgXHRcdGJsYWNrOiBbMzAsIDM5XSxcbiAgXHRcdHJlZDogWzMxLCAzOV0sXG4gIFx0XHRncmVlbjogWzMyLCAzOV0sXG4gIFx0XHR5ZWxsb3c6IFszMywgMzldLFxuICBcdFx0Ymx1ZTogWzM0LCAzOV0sXG4gIFx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcbiAgXHRcdGN5YW46IFszNiwgMzldLFxuICBcdFx0d2hpdGU6IFszNywgMzldLFxuXG4gIFx0XHQvLyBCcmlnaHQgY29sb3JcbiAgXHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcbiAgXHRcdGdyYXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG4gIFx0XHRncmV5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuICBcdFx0cmVkQnJpZ2h0OiBbOTEsIDM5XSxcbiAgXHRcdGdyZWVuQnJpZ2h0OiBbOTIsIDM5XSxcbiAgXHRcdHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG4gIFx0XHRibHVlQnJpZ2h0OiBbOTQsIDM5XSxcbiAgXHRcdG1hZ2VudGFCcmlnaHQ6IFs5NSwgMzldLFxuICBcdFx0Y3lhbkJyaWdodDogWzk2LCAzOV0sXG4gIFx0XHR3aGl0ZUJyaWdodDogWzk3LCAzOV0sXG4gIFx0fSxcbiAgXHRiZ0NvbG9yOiB7XG4gIFx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcbiAgXHRcdGJnUmVkOiBbNDEsIDQ5XSxcbiAgXHRcdGJnR3JlZW46IFs0MiwgNDldLFxuICBcdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuICBcdFx0YmdCbHVlOiBbNDQsIDQ5XSxcbiAgXHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG4gIFx0XHRiZ0N5YW46IFs0NiwgNDldLFxuICBcdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cbiAgXHRcdC8vIEJyaWdodCBjb2xvclxuICBcdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuICBcdFx0YmdHcmF5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuICBcdFx0YmdHcmV5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuICBcdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcbiAgXHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcbiAgXHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG4gIFx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcbiAgXHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuICBcdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG4gIFx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV0sXG4gIFx0fSxcbiAgfTtcblxuICBPYmplY3Qua2V5cyhzdHlsZXMkMS5tb2RpZmllcik7XG4gIGNvbnN0IGZvcmVncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzJDEuY29sb3IpO1xuICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcyQxLmJnQ29sb3IpO1xuICBbLi4uZm9yZWdyb3VuZENvbG9yTmFtZXMsIC4uLmJhY2tncm91bmRDb2xvck5hbWVzXTtcblxuICBmdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcbiAgXHRjb25zdCBjb2RlcyA9IG5ldyBNYXAoKTtcblxuICBcdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcyQxKSkge1xuICBcdFx0Zm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXApKSB7XG4gIFx0XHRcdHN0eWxlcyQxW3N0eWxlTmFtZV0gPSB7XG4gIFx0XHRcdFx0b3BlbjogYFxcdTAwMUJbJHtzdHlsZVswXX1tYCxcbiAgXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYCxcbiAgXHRcdFx0fTtcblxuICBcdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzJDFbc3R5bGVOYW1lXTtcblxuICBcdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcbiAgXHRcdH1cblxuICBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcyQxLCBncm91cE5hbWUsIHtcbiAgXHRcdFx0dmFsdWU6IGdyb3VwLFxuICBcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcbiAgXHRcdH0pO1xuICBcdH1cblxuICBcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMkMSwgJ2NvZGVzJywge1xuICBcdFx0dmFsdWU6IGNvZGVzLFxuICBcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG4gIFx0fSk7XG5cbiAgXHRzdHlsZXMkMS5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG4gIFx0c3R5bGVzJDEuYmdDb2xvci5jbG9zZSA9ICdcXHUwMDFCWzQ5bSc7XG5cbiAgXHRzdHlsZXMkMS5jb2xvci5hbnNpID0gd3JhcEFuc2kxNigpO1xuICBcdHN0eWxlcyQxLmNvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NigpO1xuICBcdHN0eWxlcyQxLmNvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bSgpO1xuICBcdHN0eWxlcyQxLmJnQ29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG4gIFx0c3R5bGVzJDEuYmdDb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG4gIFx0c3R5bGVzJDEuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cbiAgXHQvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9RaXgtL2NvbG9yLWNvbnZlcnQvYmxvYi8zZjBlMGQ0ZTkyZTIzNTc5NmNjYjE3ZjZlODVjNzIwOTRhNjUxZjQ5L2NvbnZlcnNpb25zLmpzXG4gIFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3R5bGVzJDEsIHtcbiAgXHRcdHJnYlRvQW5zaTI1Njoge1xuICBcdFx0XHR2YWx1ZShyZWQsIGdyZWVuLCBibHVlKSB7XG4gIFx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2ZcbiAgXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cbiAgXHRcdFx0XHRpZiAocmVkID09PSBncmVlbiAmJiBncmVlbiA9PT0gYmx1ZSkge1xuICBcdFx0XHRcdFx0aWYgKHJlZCA8IDgpIHtcbiAgXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuICBcdFx0XHRcdFx0fVxuXG4gIFx0XHRcdFx0XHRpZiAocmVkID4gMjQ4KSB7XG4gIFx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG4gIFx0XHRcdFx0XHR9XG5cbiAgXHRcdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCgocmVkIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuICBcdFx0XHRcdH1cblxuICBcdFx0XHRcdHJldHVybiAxNlxuICBcdFx0XHRcdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHJlZCAvIDI1NSAqIDUpKVxuICBcdFx0XHRcdFx0KyAoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSlcbiAgXHRcdFx0XHRcdCsgTWF0aC5yb3VuZChibHVlIC8gMjU1ICogNSk7XG4gIFx0XHRcdH0sXG4gIFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuICBcdFx0fSxcbiAgXHRcdGhleFRvUmdiOiB7XG4gIFx0XHRcdHZhbHVlKGhleCkge1xuICBcdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSAvW2EtZlxcZF17Nn18W2EtZlxcZF17M30vaS5leGVjKGhleC50b1N0cmluZygxNikpO1xuICBcdFx0XHRcdGlmICghbWF0Y2hlcykge1xuICBcdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcbiAgXHRcdFx0XHR9XG5cbiAgXHRcdFx0XHRsZXQgW2NvbG9yU3RyaW5nXSA9IG1hdGNoZXM7XG5cbiAgXHRcdFx0XHRpZiAoY29sb3JTdHJpbmcubGVuZ3RoID09PSAzKSB7XG4gIFx0XHRcdFx0XHRjb2xvclN0cmluZyA9IFsuLi5jb2xvclN0cmluZ10ubWFwKGNoYXJhY3RlciA9PiBjaGFyYWN0ZXIgKyBjaGFyYWN0ZXIpLmpvaW4oJycpO1xuICBcdFx0XHRcdH1cblxuICBcdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuICBcdFx0XHRcdHJldHVybiBbXG4gIFx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG4gIFx0XHRcdFx0XHQoaW50ZWdlciA+PiAxNikgJiAweEZGLFxuICBcdFx0XHRcdFx0KGludGVnZXIgPj4gOCkgJiAweEZGLFxuICBcdFx0XHRcdFx0aW50ZWdlciAmIDB4RkYsXG4gIFx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWJpdHdpc2UgKi9cbiAgXHRcdFx0XHRdO1xuICBcdFx0XHR9LFxuICBcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcbiAgXHRcdH0sXG4gIFx0XHRoZXhUb0Fuc2kyNTY6IHtcbiAgXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMkMS5yZ2JUb0Fuc2kyNTYoLi4uc3R5bGVzJDEuaGV4VG9SZ2IoaGV4KSksXG4gIFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuICBcdFx0fSxcbiAgXHRcdGFuc2kyNTZUb0Fuc2k6IHtcbiAgXHRcdFx0dmFsdWUoY29kZSkge1xuICBcdFx0XHRcdGlmIChjb2RlIDwgOCkge1xuICBcdFx0XHRcdFx0cmV0dXJuIDMwICsgY29kZTtcbiAgXHRcdFx0XHR9XG5cbiAgXHRcdFx0XHRpZiAoY29kZSA8IDE2KSB7XG4gIFx0XHRcdFx0XHRyZXR1cm4gOTAgKyAoY29kZSAtIDgpO1xuICBcdFx0XHRcdH1cblxuICBcdFx0XHRcdGxldCByZWQ7XG4gIFx0XHRcdFx0bGV0IGdyZWVuO1xuICBcdFx0XHRcdGxldCBibHVlO1xuXG4gIFx0XHRcdFx0aWYgKGNvZGUgPj0gMjMyKSB7XG4gIFx0XHRcdFx0XHRyZWQgPSAoKChjb2RlIC0gMjMyKSAqIDEwKSArIDgpIC8gMjU1O1xuICBcdFx0XHRcdFx0Z3JlZW4gPSByZWQ7XG4gIFx0XHRcdFx0XHRibHVlID0gcmVkO1xuICBcdFx0XHRcdH0gZWxzZSB7XG4gIFx0XHRcdFx0XHRjb2RlIC09IDE2O1xuXG4gIFx0XHRcdFx0XHRjb25zdCByZW1haW5kZXIgPSBjb2RlICUgMzY7XG5cbiAgXHRcdFx0XHRcdHJlZCA9IE1hdGguZmxvb3IoY29kZSAvIDM2KSAvIDU7XG4gIFx0XHRcdFx0XHRncmVlbiA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gNikgLyA1O1xuICBcdFx0XHRcdFx0Ymx1ZSA9IChyZW1haW5kZXIgJSA2KSAvIDU7XG4gIFx0XHRcdFx0fVxuXG4gIFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBNYXRoLm1heChyZWQsIGdyZWVuLCBibHVlKSAqIDI7XG5cbiAgXHRcdFx0XHRpZiAodmFsdWUgPT09IDApIHtcbiAgXHRcdFx0XHRcdHJldHVybiAzMDtcbiAgXHRcdFx0XHR9XG5cbiAgXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICBcdFx0XHRcdGxldCByZXN1bHQgPSAzMCArICgoTWF0aC5yb3VuZChibHVlKSA8PCAyKSB8IChNYXRoLnJvdW5kKGdyZWVuKSA8PCAxKSB8IE1hdGgucm91bmQocmVkKSk7XG5cbiAgXHRcdFx0XHRpZiAodmFsdWUgPT09IDIpIHtcbiAgXHRcdFx0XHRcdHJlc3VsdCArPSA2MDtcbiAgXHRcdFx0XHR9XG5cbiAgXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuICBcdFx0XHR9LFxuICBcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcbiAgXHRcdH0sXG4gIFx0XHRyZ2JUb0Fuc2k6IHtcbiAgXHRcdFx0dmFsdWU6IChyZWQsIGdyZWVuLCBibHVlKSA9PiBzdHlsZXMkMS5hbnNpMjU2VG9BbnNpKHN0eWxlcyQxLnJnYlRvQW5zaTI1NihyZWQsIGdyZWVuLCBibHVlKSksXG4gIFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuICBcdFx0fSxcbiAgXHRcdGhleFRvQW5zaToge1xuICBcdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcyQxLmFuc2kyNTZUb0Fuc2koc3R5bGVzJDEuaGV4VG9BbnNpMjU2KGhleCkpLFxuICBcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcbiAgXHRcdH0sXG4gIFx0fSk7XG5cbiAgXHRyZXR1cm4gc3R5bGVzJDE7XG4gIH1cblxuICBjb25zdCBhbnNpU3R5bGVzID0gYXNzZW1ibGVTdHlsZXMoKTtcblxuICAvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuICBjb25zdCBsZXZlbCA9ICgoKSA9PiB7XG4gIFx0aWYgKG5hdmlnYXRvci51c2VyQWdlbnREYXRhKSB7XG4gIFx0XHRjb25zdCBicmFuZCA9IG5hdmlnYXRvci51c2VyQWdlbnREYXRhLmJyYW5kcy5maW5kKCh7YnJhbmR9KSA9PiBicmFuZCA9PT0gJ0Nocm9taXVtJyk7XG4gIFx0XHRpZiAoYnJhbmQgJiYgYnJhbmQudmVyc2lvbiA+IDkzKSB7XG4gIFx0XHRcdHJldHVybiAzO1xuICBcdFx0fVxuICBcdH1cblxuICBcdGlmICgvXFxiKENocm9tZXxDaHJvbWl1bSlcXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgXHRcdHJldHVybiAxO1xuICBcdH1cblxuICBcdHJldHVybiAwO1xuICB9KSgpO1xuXG4gIGNvbnN0IGNvbG9yU3VwcG9ydCA9IGxldmVsICE9PSAwICYmIHtcbiAgXHRsZXZlbCxcbiAgXHRoYXNCYXNpYzogdHJ1ZSxcbiAgXHRoYXMyNTY6IGxldmVsID49IDIsXG4gIFx0aGFzMTZtOiBsZXZlbCA+PSAzLFxuICB9O1xuXG4gIGNvbnN0IHN1cHBvcnRzQ29sb3IgPSB7XG4gIFx0c3Rkb3V0OiBjb2xvclN1cHBvcnQsXG4gIFx0c3RkZXJyOiBjb2xvclN1cHBvcnQsXG4gIH07XG5cbiAgLy8gVE9ETzogV2hlbiB0YXJnZXRpbmcgTm9kZS5qcyAxNiwgdXNlIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgLlxuICBmdW5jdGlvbiBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikge1xuICBcdGxldCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZyk7XG4gIFx0aWYgKGluZGV4ID09PSAtMSkge1xuICBcdFx0cmV0dXJuIHN0cmluZztcbiAgXHR9XG5cbiAgXHRjb25zdCBzdWJzdHJpbmdMZW5ndGggPSBzdWJzdHJpbmcubGVuZ3RoO1xuICBcdGxldCBlbmRJbmRleCA9IDA7XG4gIFx0bGV0IHJldHVyblZhbHVlID0gJyc7XG4gIFx0ZG8ge1xuICBcdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCBpbmRleCkgKyBzdWJzdHJpbmcgKyByZXBsYWNlcjtcbiAgXHRcdGVuZEluZGV4ID0gaW5kZXggKyBzdWJzdHJpbmdMZW5ndGg7XG4gIFx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZywgZW5kSW5kZXgpO1xuICBcdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cbiAgXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuICBcdHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIHByZWZpeCwgcG9zdGZpeCwgaW5kZXgpIHtcbiAgXHRsZXQgZW5kSW5kZXggPSAwO1xuICBcdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuICBcdGRvIHtcbiAgXHRcdGNvbnN0IGdvdENSID0gc3RyaW5nW2luZGV4IC0gMV0gPT09ICdcXHInO1xuICBcdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkpICsgcHJlZml4ICsgKGdvdENSID8gJ1xcclxcbicgOiAnXFxuJykgKyBwb3N0Zml4O1xuICBcdFx0ZW5kSW5kZXggPSBpbmRleCArIDE7XG4gIFx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nLCBlbmRJbmRleCk7XG4gIFx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuICBcdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCk7XG4gIFx0cmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgY29uc3Qge3N0ZG91dDogc3Rkb3V0Q29sb3IsIHN0ZGVycjogc3RkZXJyQ29sb3J9ID0gc3VwcG9ydHNDb2xvcjtcblxuICBjb25zdCBHRU5FUkFUT1IgPSBTeW1ib2woJ0dFTkVSQVRPUicpO1xuICBjb25zdCBTVFlMRVIgPSBTeW1ib2woJ1NUWUxFUicpO1xuICBjb25zdCBJU19FTVBUWSA9IFN5bWJvbCgnSVNfRU1QVFknKTtcblxuICAvLyBgc3VwcG9ydHNDb2xvci5sZXZlbGAg4oaSIGBhbnNpU3R5bGVzLmNvbG9yW25hbWVdYCBtYXBwaW5nXG4gIGNvbnN0IGxldmVsTWFwcGluZyA9IFtcbiAgXHQnYW5zaScsXG4gIFx0J2Fuc2knLFxuICBcdCdhbnNpMjU2JyxcbiAgXHQnYW5zaTE2bScsXG4gIF07XG5cbiAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBjb25zdCBhcHBseU9wdGlvbnMgPSAob2JqZWN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgXHRpZiAob3B0aW9ucy5sZXZlbCAmJiAhKE51bWJlci5pc0ludGVnZXIob3B0aW9ucy5sZXZlbCkgJiYgb3B0aW9ucy5sZXZlbCA+PSAwICYmIG9wdGlvbnMubGV2ZWwgPD0gMykpIHtcbiAgXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG4gIFx0fVxuXG4gIFx0Ly8gRGV0ZWN0IGxldmVsIGlmIG5vdCBzZXQgbWFudWFsbHlcbiAgXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG4gIFx0b2JqZWN0LmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gY29sb3JMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG4gIH07XG5cbiAgY29uc3QgY2hhbGtGYWN0b3J5ID0gb3B0aW9ucyA9PiB7XG4gIFx0Y29uc3QgY2hhbGsgPSAoLi4uc3RyaW5ncykgPT4gc3RyaW5ncy5qb2luKCcgJyk7XG4gIFx0YXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuICBcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgY3JlYXRlQ2hhbGsucHJvdG90eXBlKTtcblxuICBcdHJldHVybiBjaGFsaztcbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFsayhvcHRpb25zKSB7XG4gIFx0cmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcbiAgfVxuXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihjcmVhdGVDaGFsay5wcm90b3R5cGUsIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG5cbiAgZm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoYW5zaVN0eWxlcykpIHtcbiAgXHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcbiAgXHRcdGdldCgpIHtcbiAgXHRcdFx0Y29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGhpcywgY3JlYXRlU3R5bGVyKHN0eWxlLm9wZW4sIHN0eWxlLmNsb3NlLCB0aGlzW1NUWUxFUl0pLCB0aGlzW0lTX0VNUFRZXSk7XG4gIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBzdHlsZU5hbWUsIHt2YWx1ZTogYnVpbGRlcn0pO1xuICBcdFx0XHRyZXR1cm4gYnVpbGRlcjtcbiAgXHRcdH0sXG4gIFx0fTtcbiAgfVxuXG4gIHN0eWxlcy52aXNpYmxlID0ge1xuICBcdGdldCgpIHtcbiAgXHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIHRoaXNbU1RZTEVSXSwgdHJ1ZSk7XG4gIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Zpc2libGUnLCB7dmFsdWU6IGJ1aWxkZXJ9KTtcbiAgXHRcdHJldHVybiBidWlsZGVyO1xuICBcdH0sXG4gIH07XG5cbiAgY29uc3QgZ2V0TW9kZWxBbnNpID0gKG1vZGVsLCBsZXZlbCwgdHlwZSwgLi4uYXJndW1lbnRzXykgPT4ge1xuICBcdGlmIChtb2RlbCA9PT0gJ3JnYicpIHtcbiAgXHRcdGlmIChsZXZlbCA9PT0gJ2Fuc2kxNm0nKSB7XG4gIFx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kxNm0oLi4uYXJndW1lbnRzXyk7XG4gIFx0XHR9XG5cbiAgXHRcdGlmIChsZXZlbCA9PT0gJ2Fuc2kyNTYnKSB7XG4gIFx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kyNTYoYW5zaVN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uYXJndW1lbnRzXykpO1xuICBcdFx0fVxuXG4gIFx0XHRyZXR1cm4gYW5zaVN0eWxlc1t0eXBlXS5hbnNpKGFuc2lTdHlsZXMucmdiVG9BbnNpKC4uLmFyZ3VtZW50c18pKTtcbiAgXHR9XG5cbiAgXHRpZiAobW9kZWwgPT09ICdoZXgnKSB7XG4gIFx0XHRyZXR1cm4gZ2V0TW9kZWxBbnNpKCdyZ2InLCBsZXZlbCwgdHlwZSwgLi4uYW5zaVN0eWxlcy5oZXhUb1JnYiguLi5hcmd1bWVudHNfKSk7XG4gIFx0fVxuXG4gIFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pO1xuICB9O1xuXG4gIGNvbnN0IHVzZWRNb2RlbHMgPSBbJ3JnYicsICdoZXgnLCAnYW5zaTI1NiddO1xuXG4gIGZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuICBcdHN0eWxlc1ttb2RlbF0gPSB7XG4gIFx0XHRnZXQoKSB7XG4gIFx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuICBcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcbiAgXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnY29sb3InLCAuLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5jb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcbiAgXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcbiAgXHRcdFx0fTtcbiAgXHRcdH0sXG4gIFx0fTtcblxuICBcdGNvbnN0IGJnTW9kZWwgPSAnYmcnICsgbW9kZWxbMF0udG9VcHBlckNhc2UoKSArIG1vZGVsLnNsaWNlKDEpO1xuICBcdHN0eWxlc1tiZ01vZGVsXSA9IHtcbiAgXHRcdGdldCgpIHtcbiAgXHRcdFx0Y29uc3Qge2xldmVsfSA9IHRoaXM7XG4gIFx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuICBcdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdiZ0NvbG9yJywgLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcbiAgXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcbiAgXHRcdFx0fTtcbiAgXHRcdH0sXG4gIFx0fTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHtcbiAgXHQuLi5zdHlsZXMsXG4gIFx0bGV2ZWw6IHtcbiAgXHRcdGVudW1lcmFibGU6IHRydWUsXG4gIFx0XHRnZXQoKSB7XG4gIFx0XHRcdHJldHVybiB0aGlzW0dFTkVSQVRPUl0ubGV2ZWw7XG4gIFx0XHR9LFxuICBcdFx0c2V0KGxldmVsKSB7XG4gIFx0XHRcdHRoaXNbR0VORVJBVE9SXS5sZXZlbCA9IGxldmVsO1xuICBcdFx0fSxcbiAgXHR9LFxuICB9KTtcblxuICBjb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuICBcdGxldCBvcGVuQWxsO1xuICBcdGxldCBjbG9zZUFsbDtcbiAgXHRpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgXHRcdG9wZW5BbGwgPSBvcGVuO1xuICBcdFx0Y2xvc2VBbGwgPSBjbG9zZTtcbiAgXHR9IGVsc2Uge1xuICBcdFx0b3BlbkFsbCA9IHBhcmVudC5vcGVuQWxsICsgb3BlbjtcbiAgXHRcdGNsb3NlQWxsID0gY2xvc2UgKyBwYXJlbnQuY2xvc2VBbGw7XG4gIFx0fVxuXG4gIFx0cmV0dXJuIHtcbiAgXHRcdG9wZW4sXG4gIFx0XHRjbG9zZSxcbiAgXHRcdG9wZW5BbGwsXG4gIFx0XHRjbG9zZUFsbCxcbiAgXHRcdHBhcmVudCxcbiAgXHR9O1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUJ1aWxkZXIgPSAoc2VsZiwgX3N0eWxlciwgX2lzRW1wdHkpID0+IHtcbiAgXHQvLyBTaW5nbGUgYXJndW1lbnQgaXMgaG90IHBhdGgsIGltcGxpY2l0IGNvZXJjaW9uIGlzIGZhc3RlciB0aGFuIGFueXRoaW5nXG4gIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG4gIFx0Y29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiBhcHBseVN0eWxlKGJ1aWxkZXIsIChhcmd1bWVudHNfLmxlbmd0aCA9PT0gMSkgPyAoJycgKyBhcmd1bWVudHNfWzBdKSA6IGFyZ3VtZW50c18uam9pbignICcpKTtcblxuICBcdC8vIFdlIGFsdGVyIHRoZSBwcm90b3R5cGUgYmVjYXVzZSB3ZSBtdXN0IHJldHVybiBhIGZ1bmN0aW9uLCBidXQgdGhlcmUgaXNcbiAgXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcbiAgXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVpbGRlciwgcHJvdG8pO1xuXG4gIFx0YnVpbGRlcltHRU5FUkFUT1JdID0gc2VsZjtcbiAgXHRidWlsZGVyW1NUWUxFUl0gPSBfc3R5bGVyO1xuICBcdGJ1aWxkZXJbSVNfRU1QVFldID0gX2lzRW1wdHk7XG5cbiAgXHRyZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhcHBseVN0eWxlID0gKHNlbGYsIHN0cmluZykgPT4ge1xuICBcdGlmIChzZWxmLmxldmVsIDw9IDAgfHwgIXN0cmluZykge1xuICBcdFx0cmV0dXJuIHNlbGZbSVNfRU1QVFldID8gJycgOiBzdHJpbmc7XG4gIFx0fVxuXG4gIFx0bGV0IHN0eWxlciA9IHNlbGZbU1RZTEVSXTtcblxuICBcdGlmIChzdHlsZXIgPT09IHVuZGVmaW5lZCkge1xuICBcdFx0cmV0dXJuIHN0cmluZztcbiAgXHR9XG5cbiAgXHRjb25zdCB7b3BlbkFsbCwgY2xvc2VBbGx9ID0gc3R5bGVyO1xuICBcdGlmIChzdHJpbmcuaW5jbHVkZXMoJ1xcdTAwMUInKSkge1xuICBcdFx0d2hpbGUgKHN0eWxlciAhPT0gdW5kZWZpbmVkKSB7XG4gIFx0XHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuICBcdFx0XHQvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG4gIFx0XHRcdC8vIHdpbGwgYmUgY29sb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgc2ltcGx5IGJlICdwbGFpbicuXG4gIFx0XHRcdHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdHlsZXIuY2xvc2UsIHN0eWxlci5vcGVuKTtcblxuICBcdFx0XHRzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuICBcdFx0fVxuICBcdH1cblxuICBcdC8vIFdlIGNhbiBtb3ZlIGJvdGggbmV4dCBhY3Rpb25zIG91dCBvZiBsb29wLCBiZWNhdXNlIHJlbWFpbmluZyBhY3Rpb25zIGluIGxvb3Agd29uJ3QgaGF2ZVxuICBcdC8vIGFueS92aXNpYmxlIGVmZmVjdCBvbiBwYXJ0cyB3ZSBhZGQgaGVyZS4gQ2xvc2UgdGhlIHN0eWxpbmcgYmVmb3JlIGEgbGluZWJyZWFrIGFuZCByZW9wZW5cbiAgXHQvLyBhZnRlciBuZXh0IGxpbmUgdG8gZml4IGEgYmxlZWQgaXNzdWUgb24gbWFjT1M6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9jaGFsay9wdWxsLzkyXG4gIFx0Y29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcbiAgXHRpZiAobGZJbmRleCAhPT0gLTEpIHtcbiAgXHRcdHN0cmluZyA9IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIGNsb3NlQWxsLCBvcGVuQWxsLCBsZkluZGV4KTtcbiAgXHR9XG5cbiAgXHRyZXR1cm4gb3BlbkFsbCArIHN0cmluZyArIGNsb3NlQWxsO1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNyZWF0ZUNoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcblxuICBjb25zdCBjaGFsayA9IGNyZWF0ZUNoYWxrKCk7XG4gIGNyZWF0ZUNoYWxrKHtsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDB9KTtcblxuICBjb25zdCBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyA9IChzaW1wbGVPanNGbG93KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdGFydGVkKCk7XG4gICAgICAgIGNvbnN0IGZsb3dSZXN1bHQgPSBhd2FpdCBzaW1wbGVPanNGbG93KHBhcmFtcyk7XG4gICAgICAgIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyhmbG93UmVzdWx0LnJlc3VsdC5wYXltZW50X21ldGhvZF9pZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxvd1Jlc3VsdC5tb2RlID09PSBcImNoZWNrb3V0XCIpIHtcbiAgICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3VjY2VzcyhcbiAgICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0Lmludm9pY2VfdXJscyxcbiAgICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LnN1YnNjcmlwdGlvbl9pZHMsXG4gICAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5jdXN0b21lcl9pZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgbW9kZTogJHtmbG93UmVzdWx0fWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGNvbnN0IGFkZEVycm9yQ2F0Y2hlckZvckluaXQgPSAoaW5pdCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgaW5pdChwYXJhbXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgeyBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJpbml0LWVycm9yLWNhdGNoZXJcIik7XG4gICAgICAgIGVycl9fKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IGdldEVycm9yTWVzc2FnZShlcnJvcikgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBjb25zdCBjcmVhdGVPanNGbG93TG9nZ2VycyA9IChwcmVmaXgpID0+IHtcbiAgICBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4ge1xuICAgICAgd2luZG93W1wiY29uc29sZVwiXS5sb2coYCR7Y2hhbGsuZ3JlZW4uYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gICAgfTtcbiAgICBjb25zdCBlcnIgPSAoLi4uYXJncykgPT4ge1xuICAgICAgd2luZG93W1wiY29uc29sZVwiXS5lcnJvcihgJHtjaGFsay5yZWQuYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9nLFxuICAgICAgZXJyLFxuICAgICAgbG9nX186IGxvZyxcbiAgICAgIGVycl9fOiBlcnJcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHsgbG9nX186IGxvZ19fJDMsIGVycl9fOiBlcnJfXyQ0IH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbiAgY29uc3QgdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MgPSAobm9uQ2RlRm9ybUlucHV0cywgb25WYWxpZGF0aW9uRXJyb3IpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gUmVxdWlyZWRGb3JtRmllbGRzLnNhZmVQYXJzZShub25DZGVGb3JtSW5wdXRzKTtcbiAgICBpZiAoIXBheWxvYWQuc3VjY2Vzcykge1xuICAgICAgY29uc3QgZm9ybWF0dGVkID0gcGF5bG9hZC5lcnJvci5mb3JtYXQoKTtcbiAgICAgIGNvbnN0IGlzc3VlcyA9IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZChmb3JtYXR0ZWQpO1xuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBlcnJvcnNdIG9mIE9iamVjdC5lbnRyaWVzKGlzc3VlcykpIHtcbiAgICAgICAgb25WYWxpZGF0aW9uRXJyb3IoZmllbGROYW1lLCBlcnJvcnMsIGZpZWxkTmFtZSk7XG4gICAgICB9XG4gICAgICBlcnJfXyQ0KGBHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc2AsIGlzc3Vlcyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQuZGF0YTtcbiAgfTtcbiAgY29uc3QgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzID0gKHRva2VuaXplUmVzdWx0cywgb25WYWxpZGF0aW9uRXJyb3IpID0+IHtcbiAgICBmb3IgKGNvbnN0IHRva2VuaXplUmVzdWx0IG9mIHRva2VuaXplUmVzdWx0cykge1xuICAgICAgaWYgKHRva2VuaXplUmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgIHRva2VuaXplUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEFsbEZpZWxkTmFtZXMuc2FmZVBhcnNlKGVycm9yLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBlcnJfXyQ0KGBVbmtub3duIGZpZWxkIG5hbWUgaW4gb25WYWxpZGF0aW9uRXJyb3I6ICR7ZXJyb3IuZWxlbWVudFR5cGV9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHBhcnNlZC5kYXRhO1xuICAgICAgICAgICAgb25WYWxpZGF0aW9uRXJyb3IoZmllbGROYW1lLCBlcnJvci5lcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ19fJDMoYEVycm9yIHRva2VuaXppbmcgY2FyZDogZ290IHZhbGlkYXRpb24gZXJyb3JzOiAke0pTT04uc3RyaW5naWZ5KHRva2VuaXplUmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyB3aGlsZSB0b2tlbml6aW5nIGNhcmRcIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHsgZXJyX186IGVycl9fJDMgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW1vblwiKTtcbiAgY29uc3QgcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHBheW1lbnQgbWV0aG9kLCBnb3QgJHtyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RofWApO1xuICAgIH1cbiAgICByZXR1cm4geyBwYXltZW50X21ldGhvZF9pZDogcmVzcG9uc2UucGF5bWVudF9tZXRob2RzWzBdLmlkIH07XG4gIH07XG4gIGNvbnN0IGZpbmRDcG1NYXRjaGluZ1R5cGUgPSAoYWxsQ1BNcywgem9kTW9kZWwpID0+IHtcbiAgICBjb25zdCBjcG0gPSBhbGxDUE1zLmZpbmQoKGNwbTIpID0+IHpvZE1vZGVsLnNhZmVQYXJzZShjcG0yKS5zdWNjZXNzKTtcbiAgICBpZiAoIWNwbSkge1xuICAgICAgZXJyX18kMyhgTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWwgJHt6b2RNb2RlbH1gKTtcbiAgICAgIGVycl9fJDMoYWxsQ1BNcyk7XG4gICAgICBlcnJfXyQzKGB6b2RNb2RlbGApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbCAke3pvZE1vZGVsfWApO1xuICAgIH1cbiAgICByZXR1cm4gem9kTW9kZWwucGFyc2UoY3BtKTtcbiAgfTtcblxuICBjb25zdCB7IGxvZ19fOiBsb2dfXyQyLCBlcnJfXzogZXJyX18kMiB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG4gIGNvbnN0IHsgbG9nX186IHN0cmlwZUxvZ19fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1jY1wiKTtcbiAgY29uc3QgcnVuQ29tbW9uQ2NGbG93ID0gYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMoXG4gICAgYXN5bmMgKHsgY29udGV4dCwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzIH0pID0+IHtcbiAgICAgIGxvZ19fJDIoYOKUnCBSdW5uaW5nIGNvbW1vbiBDQyBmbG93Li4uYCwgeyBjaGVja291dFBheW1lbnRNZXRob2QgfSk7XG4gICAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgbG9nX18kMihg4pScIFZhbGlkYXRpbmcgbm9uLUNERSBmb3JtIGZpZWxkcyBbTW9kZTogJHtwcmVmaWxsLm1vZGV9XWApO1xuICAgICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgbG9nX18kMihg4pScIFRva2VuaXppbmcgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICAgIGNvbnN0IHRva2VuaXplQ2FyZFJlc3VsdHMgPSBhd2FpdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMsIHtcbiAgICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZFxuICAgICAgfSk7XG4gICAgICB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHModG9rZW5pemVDYXJkUmVzdWx0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgICBjb25zdCBjb21tb25DaGVja291dFBhcmFtcyA9IHtcbiAgICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZCxcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogbm9uQ2RlRm9ybUZpZWxkc1xuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBTZXR0aW5nIHVwIHBheW1lbnQgbWV0aG9kIGluIENERSBbVG9rZW46ICR7cHJlZmlsbC50b2tlbn1dYCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2V0dXBDaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgICAgbG9nX18kMihg4pWwIFNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgW1BNIElEOiAke3Jlc3VsdC5wYXltZW50X21ldGhvZF9pZH1dYCk7XG4gICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgSW5pdGlhbCBjaGVja291dCBmbG93LiBDaGVja2luZyBvdXQgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2RlRXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3Iub3JpZ2luYWxFcnJvck1lc3NhZ2UgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDYXJkIHJlcXVpcmVzIDNEUywgc3RhcnRpbmcgbm9uLWxlZ2FjeSBwYXltZW50IGZsb3dgKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFVzZU5ld0Zsb3cgPSBlcnJvci5yZXNwb25zZS5oZWFkZXJzPy5bXCJvcC1zaG91bGQtdXNlLW5ldy1mbG93XCJdID09PSBcInRydWVcIjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UGZSZXN1bHQgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIG9wLXNob3VsZC11c2UtbmV3LWZsb3c6ICR7c2hvdWxkVXNlTmV3Rmxvd31gKTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBQYXltZW50IGZsb3cgcmVzdWx0OmAsIHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFVzZU5ld0Zsb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY29tbW9uQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQsIGNvbnRleHQuYmFzZVVybCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBzdHJpcGVDQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IFtjY19wbV9pZDogJHtzdGFydFBmUmVzdWx0LmNjX3BtX2lkfV1gKTtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybSBwYXltZW50IGZsb3cgcmVzdWx0IHJlY2VpdmVkIFJlc3VsdDpgLCBjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Y3JlYXRlZFBheW1lbnRNZXRob2QucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7c2hvdWxkVXNlTmV3RmxvdyA/IFwibmV3XCIgOiBcImxlZ2FjeVwifV1gKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkNoZWNrb3V0UGFyYW1zLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkLFxuICAgICAgICAgICAgICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6ICFzaG91bGRVc2VOZXdGbG93XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXJyX18kMihg4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFYCk7XG4gICAgICAgIGVycl9fJDIoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIGNvbnN0IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwic3RyaXBlXzNkc1wiKTtcbiAgICBpZiAoIXN0cmlwZUFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2Uoc3RyaXBlQWN0aW9uKTtcbiAgfTtcbiAgY29uc3QgcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBjb21tb25BY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCIpO1xuICAgIGlmICghY29tbW9uQWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21tb24gM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShjb21tb25BY3Rpb24pO1xuICB9O1xuICBjb25zdCBjb21tb25DQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICAgIGxvZ19fJDIoYOKUnCBVc2luZyBjb21tb24gM0RTIGZsb3cgW1VSTDogJHtuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsfV1gKTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGFydDNkc1ZlcmlmaWNhdGlvbih7IHVybDogbmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybCwgYmFzZVVybCB9KTtcbiAgICBsb2dfXyQyKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtzdGF0dXN9XWApO1xuICAgIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5GQUlMVVJFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHN0cmlwZUNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0KSA9PiB7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gICAgc3RyaXBlTG9nX18oYOKUnCBVc2luZyBzdHJpcGUgM0RTIGZsb3cgW0NsaWVudCBTZWNyZXQ6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKTtcbiAgICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG4gICAgc3RyaXBlTG9nX18oXCLilbAgU3RyaXBlIDNEUyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kMSwgZXJyX186IGVycl9fJDEgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLXByXCIpO1xuICBjb25zdCBTdHJpcGVQckNwbSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LnVuaW9uKFt6b2Quei5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLCB6b2Quei5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKV0pLFxuICAgIHByb2Nlc3Nvcl9uYW1lOiB6b2Quei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICAgIG1ldGFkYXRhOiB6b2Quei5vYmplY3Qoe1xuICAgICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKVxuICAgIH0pXG4gIH0pO1xuICBjb25zdCBpbml0U3RyaXBlUHJGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgICBhc3luYyAoeyBjb250ZXh0IH0pID0+IHtcbiAgICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFBheW1lbnRNZXRob2QgPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlUHJDcG0pO1xuICAgICAgbG9nX18kMShgSW5pdGlhbGl6aW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgIGxvZ19fJDEoYEdldHRpbmcgaW5pdGlhbCBwcmV2aWV3IGFtb3VudGApO1xuICAgICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgICBjb25zdCBwciA9IGF3YWl0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0KFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2QubWV0YWRhdGEuc3RyaXBlX3BrLFxuICAgICAgICBpbml0aWFsUHJldmlldy5hbW91bnRBdG9tLFxuICAgICAgICBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgICAgaXNTZXR1cE1vZGVcbiAgICAgICk7XG4gICAgICBsb2dfXyQxKGBDaGVja2luZyBpZiBjYW4gbWFrZSBwYXltZW50YCk7XG4gICAgICBjb25zdCBjYW5NYWtlUGF5bWVudCA9IGF3YWl0IHByLmNhbk1ha2VQYXltZW50KCk7XG4gICAgICBpZiAoY2FuTWFrZVBheW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgZXJyX18kMShgY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbGApO1xuICAgICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogXCJjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsXCIgfTtcbiAgICAgIH1cbiAgICAgIGxvZ19fJDEoYFN0cmlwZSBQUiBmbG93IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4gQ2FuIG1ha2UgcGF5bWVudGAsIGNhbk1ha2VQYXltZW50KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcixcbiAgICAgICAgYXZhaWxhYmxlUHJvdmlkZXJzOiB7XG4gICAgICAgICAgYXBwbGVQYXk6IGNhbk1ha2VQYXltZW50LmFwcGxlUGF5LFxuICAgICAgICAgIGdvb2dsZVBheTogY2FuTWFrZVBheW1lbnQuZ29vZ2xlUGF5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICApO1xuICBjb25zdCBydW5TdHJpcGVQckZsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgICBhc3luYyAoe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zLFxuICAgICAgaW5pdFJlc3VsdFxuICAgIH0pID0+IHtcbiAgICAgIGxvZ19fJDEoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICAgIGlmIChjdXN0b21QYXJhbXMucHJvdmlkZXIgIT09IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVyIG1pc21hdGNoLiBFeHBlY3RlZCAke2N1c3RvbVBhcmFtcy5wcm92aWRlcn0sIGdvdCAke2NoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcn1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgICAgY29uc3QgcHIgPSBpbml0UmVzdWx0LnByO1xuICAgICAgbG9nX18kMShgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzYCk7XG4gICAgICBjb25zdCBjbGVhbmVkRm9ybUlucHV0cyA9IG92ZXJyaWRlRW1wdHlaaXBDb2RlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICAgICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKGNsZWFuZWRGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGlmIChjdXN0b21QYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QpIHtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBjdXN0b21QYXJhbXMub3ZlcnJpZGVQYXltZW50UmVxdWVzdDtcbiAgICAgICAgbG9nX18kMShgT3ZlcnJpZGluZyBQUiBhbW91bnQgd2l0aGAsIG92ZXJyaWRlKTtcbiAgICAgICAgdXBkYXRlUHJXaXRoQW1vdW50KHByLCBvdmVycmlkZS5hbW91bnQsIG92ZXJyaWRlLnBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgbG9nX18kMShgU2hvd2luZyBQUiBkaWFsb2cuLi5gKTtcbiAgICAgIHByLnNob3coKTtcbiAgICAgIGNvbnN0IHN0cmlwZVBtQWRkZWRFdmVudCA9IGF3YWl0IHdhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kKHByKTtcbiAgICAgIGxvZ19fJDEoYFBSIGRpYWxvZyBmaW5pc2hlZC4gU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yUFIoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBmaWVsZHM6IG5vbkNkZUZvcm1GaWVsZHMsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgICBsb2dfXyQxKGBDb25maXJtaW5nIFBSIHdpdGggU3RyaXBlLi4uYCk7XG4gICAgICBhd2FpdCBjb25maXJtU3RyaXBlUHJQTShuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQxKGBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBmb3Igc2V0dXAuLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMShgUGVyZm9ybWluZyBjaGVja291dC4uLmApO1xuICAgICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICAgIH0sXG4gICAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICAgIGN1c3RvbWVyX2NvdW50cnk6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkNPVU5UUlldLFxuICAgICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBwcmVmaWxsLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfVxuICApO1xuICBjb25zdCBvdmVycmlkZUVtcHR5WmlwQ29kZSA9IChmb3JtSW5wdXRzKSA9PiB7XG4gICAgY29uc3QgbmV3Rm9ybUlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICAgIGlmICghbmV3Rm9ybUlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdKSB7XG4gICAgICBsb2dfXyQxKGBPdmVycmlkaW5nIGVtcHR5IHppcCBjb2RlIChvbmx5IGZvciBnb29nbGUgcGF5IGFuZCBhcHBsZSBwYXkpYCk7XG4gICAgICBuZXdGb3JtSW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBcIjAwMDAwXCI7XG4gICAgfVxuICAgIHJldHVybiBuZXdGb3JtSW5wdXRzO1xuICB9O1xuICBjb25zdCB1cGRhdGVQcldpdGhBbW91bnQgPSAocHIsIGFtb3VudCwgaXNQZW5kaW5nKSA9PiB7XG4gICAgcHIudXBkYXRlKHtcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIGFtb3VudDogYW1vdW50LmFtb3VudEF0b20sXG4gICAgICAgIGxhYmVsOiBcIlRvdGFsXCIsXG4gICAgICAgIHBlbmRpbmc6IGlzUGVuZGluZ1xuICAgICAgfSxcbiAgICAgIGN1cnJlbmN5OiBhbW91bnQuY3VycmVuY3lcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG9jY3VycmVkLlxuRGV0YWlsczogZ290ICR7cmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aH0gcmVxdWlyZWQgdXNlciBhY3Rpb25zYCk7XG4gICAgfVxuICAgIHJldHVybiBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xuICB9O1xuXG4gIGNvbnN0IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QgPSAoY3Btcywgd2l0aFByb3ZpZGVyLCB3aXRoUHJvY2Vzc29yKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGNwbXMuZmlsdGVyKChjcG0pID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXNQcm9jZXNzb3IgPSB0cnVlIDtcbiAgICAgIGNvbnN0IG1hdGNoZXNQcm92aWRlciA9IGNwbS5wcm92aWRlciA9PT0gd2l0aFByb3ZpZGVyO1xuICAgICAgcmV0dXJuIG1hdGNoZXNQcm9jZXNzb3IgJiYgbWF0Y2hlc1Byb3ZpZGVyO1xuICAgIH0pO1xuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgICB9XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNbMF07XG4gIH07XG4gIGNvbnN0IE9qc0Zsb3dzID0ge1xuICAgIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gICAgLy8gU3RyaXBlXG4gICAgY29tbW9uQ0M6IHtcbiAgICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gICAgfSxcbiAgICBzdHJpcGVQUjoge1xuICAgICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICAgIHJ1bjogcnVuU3RyaXBlUHJGbG93XG4gICAgfVxuICAgIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcbiAgXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xuICB9XG5cbiAgdmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDIsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gdm9pZCAwO1xuXG4gIC8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbiAgY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbiAgY29uc3QgZ2V0U3ltYm9sID0gbmFtZSA9PiBoYXNTeW1ib2wobmFtZSkgPyBTeW1ib2xbbmFtZV0gOiAnQEAnICsgbmFtZTtcblxuICBjb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbiAgY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuICBjb25zdCBTeW1ib2xTcGVjaWVzID0gZ2V0U3ltYm9sKCdzcGVjaWVzJyk7IC8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG4gIGZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICAgIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgICBjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdG9yICE9PSB1bmRlZmluZWQgPyBjdG9yIDogT2JzZXJ2YWJsZSQxO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIE9ic2VydmFibGUkMTsgLy8gU1BFQzogQnJhbmQgY2hlY2tcbiAgfVxuXG4gIGZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gICAgaWYgKGhvc3RSZXBvcnRFcnJvci5sb2cpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBsZXQgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fY2xlYW51cDtcbiAgICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFjbGVhbnVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUuY2FsbChjbGVhbnVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gICAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gICAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO2Vsc2UgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdydW5uaW5nJykgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG4gIH1cblxuICBmdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm47XG5cbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2J1ZmZlcmluZyc7XG4gICAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH1dO1xuICAgICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG4gIH1cblxuICBjbGFzcyBTdWJzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgICAvLyBBU1NFUlQ6IG9ic2VydmVyIGlzIGFuIG9iamVjdFxuICAgICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnbmV4dCcsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICAgIG9uTm90aWZ5KHNlbGYsICdlcnJvcicsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnY29tcGxldGUnKTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdWJzY3JpcHRpb25PYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICAgIH1cblxuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIGxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihzdWJzY3JpYmVyKSB7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICAgIGVycm9yOiBhcmd1bWVudHNbMV0sXG4gICAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gICAgfVxuXG4gICAgZm9yRWFjaChmbikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWFwKGZuKSB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZpbHRlcihmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJlZHVjZShmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGxldCBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICAgIGlmICghZmlyc3QgfHwgaGFzU2VlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYWxsKCkge1xuICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0TmV4dChuZXh0KSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE5leHQodGhpcyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmxhdE1hcChmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXIpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmRG9uZSgpIHtcbiAgICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBbU3ltYm9sT2JzZXJ2YWJsZV0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbSh4KSB7XG4gICAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGxldCBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sT2JzZXJ2YWJsZSk7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgICAgaWYgKE9iamVjdChvYnNlcnZhYmxlKSAhPT0gb2JzZXJ2YWJsZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihvYnNlcnZhYmxlICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2ldKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvZiguLi5pdGVtcykge1xuICAgICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICB9O1xuXG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQxLCBTeW1ib2woJ2V4dGVuc2lvbnMnKSwge1xuICAgIHZhbHVlOiB7XG4gICAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgICBob3N0UmVwb3J0RXJyb3JcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICB2YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG4gIGNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbiAgY29uc3QgeyBsb2dfXywgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1mbG93c1wiKTtcbiAgY29uc3QgaW5pdGlhbGl6ZU9qc0Zsb3dzID0gKGNvbnRleHQpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RyaXBlIFBSXG4gICAgICBzdHJpcGVQUjogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVQUlwiLCBPanNGbG93cy5zdHJpcGVQUi5pbml0KHsgY29udGV4dCB9KSlcbiAgICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgICB9O1xuICB9O1xuICBjb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRpbmdcIiB9KTtcbiAgICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgICBsb2dfXyhgJHtmbG93TmFtZX0gZmxvdyByZXN1bHRgLCByZXN1bHQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgZXJyX18oYCR7Zmxvd05hbWV9IGZsb3cgaW5pdGlhbGl6YXRpb24gZXJyb3I6XG4ke0pTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH07XG5cbiAgY29uc3QgUFJfTE9BRElORyA9IHtcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgIH1cbiAgfTtcbiAgY29uc3QgUFJfRVJST1IgPSB7XG4gICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gICAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgfVxuICB9O1xuXG4gIGNsYXNzIE9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmb3JtSW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuZm9ybUluc3RhbmNlID0gZm9ybUluc3RhbmNlO1xuICAgICAgdGhpcy5jb25maWcgPSBmb3JtSW5zdGFuY2UuY29uZmlnO1xuICAgICAgdGhpcy5mb3JtSWQgPSBmb3JtSW5zdGFuY2UuZm9ybUlkO1xuICAgICAgdGhpcy5ldmVudFRhcmdldHMgPSB7fTtcbiAgICAgIHRoaXMubm9uY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICB9XG4gICAgaGFuZGxlTWVzc2FnZShldmVudCkge1xuICAgICAgaWYgKCFldmVudC5zb3VyY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5vcmlnaW4gIT09IHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5fZnJhbWVVcmw/Lm9yaWdpbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQuZGF0YVtcInBlbnBhbFwiXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudERhdGEgPSBwYXJzZUV2ZW50UGF5bG9hZChKU09OLnBhcnNlKGV2ZW50LmRhdGEpKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlRXZlbnQoZXZlbnREYXRhKTtcbiAgICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuICAgICAgY29uc3QgeyBlbGVtZW50SWQsIHBheWxvYWQgfSA9IGV2ZW50RGF0YTtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHBheWxvYWQudHlwZTtcbiAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJMQVlPVVRcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRk9DVVNcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBwYXlsb2FkLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkJMVVJcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ0hBTkdFXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUsIHBheWxvYWQuZXJyb3JzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxPQURFRFwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlTG9hZGVkRXZlbnQoZXZlbnQuc291cmNlLCBlbGVtZW50SWQsIHBheWxvYWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9BRF9FUlJPUlwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlTG9hZEVycm9yRXZlbnQocGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJWQUxJREFUSU9OX0VSUk9SXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JFdmVudChwYXlsb2FkLCBlbGVtZW50SWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWxpZGF0ZUV2ZW50KGV2ZW50RGF0YSkge1xuICAgICAgaWYgKGV2ZW50RGF0YS5mb3JtSWQgIT09IHRoaXMuZm9ybUluc3RhbmNlLmZvcm1JZCB8fCAhZXZlbnREYXRhLmVsZW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ub25jZXMuaGFzKGV2ZW50RGF0YS5ub25jZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5ub25jZXMuYWRkKGV2ZW50RGF0YS5ub25jZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFuZGxlTGF5b3V0RXZlbnQocGF5bG9hZCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gcGF5bG9hZC5oZWlnaHQgPyBgJHtwYXlsb2FkLmhlaWdodH1weGAgOiBcIjEwMCVcIjtcbiAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNldEZvcm1IZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25Gb2N1cykgdGhpcy5jb25maWcub25Gb2N1cyhlbGVtZW50SWQsIGZpZWxkKTtcbiAgICB9XG4gICAgaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgZmllbGQpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vbkJsdXIpIHRoaXMuY29uZmlnLm9uQmx1cihlbGVtZW50SWQsIGZpZWxkKTtcbiAgICB9XG4gICAgaGFuZGxlQ2hhbmdlRXZlbnQoZWxlbWVudElkLCBmaWVsZCwgZXJyb3JzKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25DaGFuZ2UpIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGVsZW1lbnRJZCwgZmllbGQsIGVycm9ycyk7XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZUxvYWRlZEV2ZW50KHNvdXJjZSwgZWxlbWVudElkLCBwYXlsb2FkKSB7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0c1tlbGVtZW50SWRdID0gc291cmNlO1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uub25DZGVMb2FkZWQocGF5bG9hZCk7XG4gICAgICBpZiAodGhpcy5jb25maWcub25Mb2FkKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uTG9hZChwYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMsIHBheWxvYWQuY3VycmVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uTG9hZEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IocGF5bG9hZC5tZXNzYWdlKTtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRhdGlvbkVycm9yRXZlbnQocGF5bG9hZCwgZWxlbWVudElkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcihwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXN5bmMgaGFuZGxlRXJyb3JFdmVudChwYXlsb2FkOiBFcnJvckV2ZW50UGF5bG9hZCkge1xuICAgIC8vICAgaWYgKHBheWxvYWQubWVzc2FnZSA9PT0gJzNEU19SRVFVSVJFRCcpIHtcbiAgICAvLyAgICAgY29uc3QgdGhyZWVEU1VybCA9IHBheWxvYWQuaGVhZGVycz8uWyd4LTNkcy1hdXRoLXVybCddID8/IFNJTVVMQVRFXzNEU19VUkw7XG4gICAgLy8gICAgIC8vIFRoaXMgd2lsbCBvcGVuIGEgcG9wdXAgYW5kIHByb2Nlc3MgdGhlIDNEUyBmbG93XG4gICAgLy8gICAgIC8vIHdpbGwgcmV0dXJuIGEgc3RhdHVzIGBzdWNjZXNzYCB8IGBmYWlsdXJlYCB8IGBjYW5jZWxsZWRgIHdoaWNoIHdlIGNhbiBjb250aW51ZSB3aXRoXG4gICAgLy8gICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiB0aHJlZURTVXJsLCBiYXNlVXJsOiB0aGlzLmNvbmZpZy5iYXNlVXJsISB9KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coJ/CflJAgM0RTIHN0YXR1czonLCBzdGF0dXMpO1xuICAgIC8vICAgICAvLyBUT0RPOiBjb250aW51ZSB3aXRoIHN0YXR1c1xuICAgIC8vICAgICBjb25zdCBjYXJkQ3BtID0gdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgICBpZiAoIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCB8fCAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pXG4gICAgLy8gICAgICAgcmV0dXJuO1xuICAgIC8vICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMpKSB7XG4gICAgLy8gICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAgIC8vICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAgIC8vICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgfSxcbiAgICAvLyAgICAgICAgIGZhbHNlXG4gICAgLy8gICAgICAgKTtcbiAgICAvLyAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gICAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gICAgLy8gICAgICAgdGhpcy50b2tlbml6ZWREYXRhID0gc3RhcnRQYXltZW50Rmxvd0V2ZW50O1xuICAgIC8vICAgICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgIC8vICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyBoYW5kbGVGb3JtU3VibWl0KCkge1xuICAgIC8vICAgaWYgKFxuICAgIC8vICAgICAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8XG4gICAgLy8gICAgICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5sZW5ndGggfHxcbiAgICAvLyAgICAgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yXG4gICAgLy8gICApIHtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgY2FyZENwbSA9IHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMuZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgaWYgKCFjYXJkQ3BtKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignQ2FyZCBub3QgYXZhaWxhYmxlIGFzIGEgcGF5bWVudCBtZXRob2QgaW4gY2hlY2tvdXQnKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IHRva2VuaXplRGF0YSA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgRXZlbnRUeXBlLmVudW0uVE9LRU5JWkUsXG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCEsXG4gICAgLy8gICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgIGNhcmRDcG0sXG4gICAgLy8gICAgIGZhbHNlXG4gICAgLy8gICApO1xuICAgIC8vICAgaWYgKCF0b2tlbml6ZURhdGEpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBjb25zdHJ1Y3RpbmcgdG9rZW5pemUgZGF0YScpO1xuICAgIC8vICAgfVxuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzKSkge1xuICAgIC8vICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gICAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgdG9rZW5pemVEYXRhKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHRoaXMudG9rZW5pemVkRGF0YSA9IHRva2VuaXplRGF0YTtcbiAgICAvLyB9XG4gICAgLy8gYXN5bmMgb25Vc2VyQ29tcGxldGVQYXltZW50UmVxdWVzdFVJKFxuICAgIC8vICAgc3RyaXBlUG06IFBheW1lbnRSZXF1ZXN0UGF5bWVudE1ldGhvZEV2ZW50LFxuICAgIC8vICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgICAvLyApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyAgIGlmICghdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcylcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cyA/PyB7fSkpIHtcbiAgICAvLyAgICAgY29uc3QgcGF5bWVudEZsb3dNZXRhZGF0YSA9IHsgc3RyaXBlUG1JZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCB9O1xuICAgIC8vICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gICAgLy8gICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAgIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gICAgLy8gICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIC8vICAgICAgIGZhbHNlLFxuICAgIC8vICAgICAgIHBheW1lbnRGbG93TWV0YWRhdGFcbiAgICAvLyAgICAgKTtcbiAgICAvLyAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAgIC8vICAgICB0aGlzLnN0cmlwZVBtID0gc3RyaXBlUG07XG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAgIC8vICAgICB0aGlzLnNldFRva2VuaXplZERhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKGVsZW1lbnQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgLy8gZW1pdEV2ZW50KGVsZW1lbnQubm9kZS5jb250ZW50V2luZG93ISwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50LCB0aGlzLmNvbmZpZy5iYXNlVXJsISk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBwb3N0RXZlbnRUb0ZyYW1lKHNvdXJjZSwgZWxlbWVudElkLCBkYXRhKSB7XG4gICAgICBlbWl0RXZlbnQoc291cmNlLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBkYXRhLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKGlmcmFtZSwgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gcGVucGFsLmNvbm5lY3RUb0NoaWxkKHtcbiAgICAgIGlmcmFtZSxcbiAgICAgIGRlYnVnOiB0cnVlLFxuICAgICAgY2hpbGRPcmlnaW5cbiAgICB9KTtcbiAgICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICAgIGNvbnN0IGlzVmFsaWRPYmplY3QgPSBhd2FpdCBjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0KGNvbm5lY3Rpb25PYmopO1xuICAgIGlmICghaXNSZXN1bHRWYWxpZChjb25uZWN0aW9uT2JqLCBpc1ZhbGlkT2JqZWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgaW52YWxpZCBDREUgY29ubmVjdGlvbiBvYmplY3RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbm5lY3Rpb25PYmo7XG4gIH1cbiAgY2xhc3MgQ29ubmVjdGlvbk1hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGFkZENvbm5lY3Rpb24oaWQsIGNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMuc2V0KGlkLCBjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgZ2V0Q29ubmVjdGlvbigpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIG5vdCBmb3VuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBnZXRBbGxDb25uZWN0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIGNsYXNzIE9wZW5QYXlGb3JtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jZGVMb2FkZWRQYXlsb2FkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCkuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gPSBpbml0aWFsaXplT2pzRmxvd3ModGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpKTtcbiAgICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uLnN0cmlwZVBSLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB0aGlzLm9uU3RyaXBlUFJTdGF0dXNDaGFuZ2Uoc3RhdHVzKSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5vbkNkZUxvYWRlZCA9IChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZGVMb2FkZWRQYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy50cnlJbml0T2pzRmxvd3MoKTtcbiAgICAgIH07XG4gICAgICB0aGlzLm9uU3RyaXBlUFJTdGF0dXNDaGFuZ2UgPSAoaW5pdFN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcub25QYXltZW50UmVxdWVzdExvYWQ/Lih7IGFwcGxlX3BheTogUFJfTE9BRElORywgZ29vZ2xlX3BheTogUFJfTE9BRElORyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcub25QYXltZW50UmVxdWVzdExvYWQ/Lih7IGFwcGxlX3BheTogUFJfRVJST1IsIGdvb2dsZV9wYXk6IFBSX0VSUk9SIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImxvYWRlZFwiKSB7XG4gICAgICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IGluaXRTdGF0dXMucmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGNhbkFwcGxlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheTtcbiAgICAgICAgICBjb25zdCBjYW5Hb29nbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmdvb2dsZVBheTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHtcbiAgICAgICAgICAgIGFwcGxlX3BheToge1xuICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuQXBwbGVQYXksXG4gICAgICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkFwcGxlUGF5ID8gdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdChcImFwcGxlX3BheVwiLCBpbml0UmVzdWx0LCB1c2VyUGFyYW1zKSA6IHZvaWQgMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdvb2dsZV9wYXk6IHtcbiAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkdvb2dsZVBheSxcbiAgICAgICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuR29vZ2xlUGF5ID8gdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdChcImdvb2dsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QgPSAocHJvdmlkZXIsIGluaXRSZXN1bHQsIHBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpO1xuICAgICAgICByZXR1cm4gT2pzRmxvd3Muc3RyaXBlUFIucnVuKHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIHByb3ZpZGVyKSxcbiAgICAgICAgICBub25DZGVGb3JtSW5wdXRzOiB0aGlzLmdldE5vbkNkZUZvcm1JbnB1dHMoKSxcbiAgICAgICAgICBmbG93Q2FsbGJhY2tzOiB0aGlzLmNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHsgcHJvdmlkZXIsIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCB9LFxuICAgICAgICAgIGluaXRSZXN1bHRcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgT3BlblBheUZvcm0uYXNzaWduQXNTaW5nbGV0b24odGhpcyk7XG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnLCBiYXNlVXJsOiBjb25maWcuYmFzZVVybCA/PyBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCIgfTtcbiAgICAgIHRoaXMuZWxlbWVudHMgPSBudWxsO1xuICAgICAgdGhpcy5mb3JtSWQgPSBgb3Bqcy1mb3JtLSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICAgIHRoaXMucmVmZXJlciA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICB0aGlzLmZvcm1UYXJnZXQgPSBjb25maWcuZm9ybVRhcmdldCA/PyBcImJvZHlcIjtcbiAgICAgIHRoaXMuZm9ybVByb3BlcnRpZXMgPSB7IGhlaWdodDogXCIxcHhcIiB9O1xuICAgICAgdGhpcy5jZGVMb2FkZWRQYXlsb2FkID0gbnVsbDtcbiAgICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgQ29ubmVjdGlvbk1hbmFnZXIoKTtcbiAgICAgIHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IE9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyKHRoaXMpO1xuICAgICAgdGhpcy5vanNWZXJzaW9uID0gXCIwLjEuNlwiO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuZXZlbnRIYW5kbGVyLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzLmV2ZW50SGFuZGxlcikpO1xuICAgIH1cbiAgICBzdGF0aWMge1xuICAgICAgdGhpcy5vanNGbG93cyA9IE9qc0Zsb3dzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NpZ24gdGhlIGluc3RhbmNlIHRvIHRoZSB3aW5kb3cgYXMgYSBzaW5nbGV0b25cbiAgICAgKiBAcGFyYW0gZm9ybSAtIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3NpZ25Bc1NpbmdsZXRvbihmb3JtKSB7XG4gICAgICBpZiAoT3BlblBheUZvcm0uZ2V0SW5zdGFuY2UoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuUGF5IGluc3RhbmNlIGFscmVhZHkgZXhpc3RzLiBPbmx5IG9uZSBpbnN0YW5jZSBpcyBhbGxvd2VkLlwiKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvd1tcIm9qc1wiXSA9IGZvcm07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5QYXlGb3JtXG4gICAgICogQHJldHVybnMgVGhlIE9wZW5QYXlGb3JtIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgcmV0dXJuIHdpbmRvd1tcIm9qc1wiXSA/PyBudWxsO1xuICAgIH1cbiAgICBnZXRDb25uZWN0aW9uTWFuYWdlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyO1xuICAgIH1cbiAgICBzZXRGb3JtSGVpZ2h0KGhlaWdodCkge1xuICAgICAgdGhpcy5mb3JtUHJvcGVydGllcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICBpZiAodGhpcy5lbGVtZW50cykge1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtZW50Lm5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRWxlbWVudChlbGVtZW50VmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBmb3JtIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBFbGVtZW50VHlwZS5wYXJzZShlbGVtZW50VmFsdWUpO1xuICAgICAgY29uc3QgZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSB0aGlzLmJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucyk7XG4gICAgICBmcmFtZS5uYW1lID0gYCR7dHlwZX0tZWxlbWVudGA7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAvYXBwL3YxLyR7ZnJhbWUubmFtZX1gLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICAgIHVybC5zZWFyY2ggPSBxdWVyeVN0cmluZy50b1N0cmluZygpO1xuICAgICAgZnJhbWUuc3JjID0gdXJsLmhyZWY7XG4gICAgICB0aGlzLmNvbmZpZy5fZnJhbWVVcmwgPSB1cmw7XG4gICAgICBmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcbiAgICAgIGZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICBjb25zdCBlbGVtZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBub2RlOiBmcmFtZSxcbiAgICAgICAgbW91bnQ6IChzZWxlY3RvcikgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LmFwcGVuZENoaWxkKGZyYW1lKVxuICAgICAgfTtcbiAgICAgIHRoaXMuY29ubmVjdFRvRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbdHlwZV0gPSBlbGVtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IHsgW3R5cGVdOiBlbGVtZW50IH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgYnVpbGRRdWVyeVN0cmluZyhvcHRpb25zKSB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInJlZmVyZXJcIiwgdGhpcy5yZWZlcmVyKTtcbiAgICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcImZvcm1JZFwiLCB0aGlzLmZvcm1JZCk7XG4gICAgICBpZiAob3B0aW9ucy5zdHlsZXMpIHtcbiAgICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic3R5bGVzXCIsIGNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nKG9wdGlvbnMuc3R5bGVzKSk7XG4gICAgICB9XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJzZWN1cmVUb2tlblwiLCB0aGlzLmNvbmZpZy5jaGVja291dFNlY3VyZVRva2VuKTtcbiAgICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgICB9XG4gICAgY29ubmVjdFRvRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBjcmVhdGVDb25uZWN0aW9uKGVsZW1lbnQubm9kZSkudGhlbigoY29ubikgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmFkZENvbm5lY3Rpb24oZWxlbWVudC50eXBlLCBjb25uKTtcbiAgICAgICAgdGhpcy50cnlJbml0T2pzRmxvd3MoKTtcbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHZvaWQgMCk7XG4gICAgfVxuICAgIGdldEZvcm1EaXYoKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuICAgIGNyZWF0ZU9qc0Zsb3dDb250ZXh0KCkge1xuICAgICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXF1ZXN0ZWQgY29udGV4dCB3aGlsZSBDREUgbm90IHlldCBsb2FkZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoY2RlQ29ubmVjdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBDREUgY29ubmVjdGlvbnMgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYXNlVXJsOiBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVcmwgPz8gRlJBTUVfQkFTRV9VUkwpLm9yaWdpbixcbiAgICAgICAgZm9ybURpdjogdGhpcy5nZXRGb3JtRGl2KCksXG4gICAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiB0aGlzLmNkZUxvYWRlZFBheWxvYWQuc2Vzc2lvbklkLFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2RzOiB0aGlzLmNkZUxvYWRlZFBheWxvYWQuY2hlY2tvdXRQYXltZW50TWV0aG9kcyxcbiAgICAgICAgY2RlQ29ubmVjdGlvbnNcbiAgICAgIH07XG4gICAgfVxuICAgIGdldE5vbkNkZUZvcm1JbnB1dHMoKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKHRoaXMuZ2V0Rm9ybURpdigpKTtcbiAgICB9XG4gICAgY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpIHtcbiAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgICAgb25DaGVja291dFN0YXJ0ZWQ6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3RhcnRlZFwiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0U3RhcnRlZCA/PyBub09wKSxcbiAgICAgICAgb25DaGVja291dFN1Y2Nlc3M6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3VjY2Vzc1wiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0U3VjY2VzcyA/PyBub09wKSxcbiAgICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFxuICAgICAgICAgIFwib25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzXCIsXG4gICAgICAgICAgdGhpcy5jb25maWcub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzID8/IG5vT3BcbiAgICAgICAgKSxcbiAgICAgICAgb25WYWxpZGF0aW9uRXJyb3I6IG1ha2VDYWxsYmFja1NhZmUoXCJvblZhbGlkYXRpb25FcnJvclwiLCB0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvciA/PyBub09wKVxuICAgICAgfTtcbiAgICB9XG4gICAgc3VibWl0KCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICAgIE9qc0Zsb3dzLmNvbW1vbkNDLnJ1bih7XG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFwiY3JlZGl0X2NhcmRcIiksXG4gICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IHRoaXMuZ2V0Tm9uQ2RlRm9ybUlucHV0cygpLFxuICAgICAgICBmbG93Q2FsbGJhY2tzOiB0aGlzLmNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSxcbiAgICAgICAgY3VzdG9tUGFyYW1zOiB2b2lkIDAsXG4gICAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBjdXN0b20gcGFyYW1zXG4gICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvblBheW1lbnRSZXF1ZXN0RXJyb3IoZXJyTXNnKSB7XG4gICAgICB0aGlzLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IpIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcihlcnJNc2cpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIE9iamVjdC52YWx1ZXModGhpcy5lbGVtZW50cyA/PyB7fSkpIHtcbiAgICAgICAgZWxlbWVudC5ub2RlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuZXZlbnRIYW5kbGVyLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzLmV2ZW50SGFuZGxlcikpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydHMuRmllbGROYW1lID0gRmllbGROYW1lO1xuICBleHBvcnRzLk9wZW5QYXlGb3JtID0gT3BlblBheUZvcm07XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cbn0pKTsiXSwKICAibWFwcGluZ3MiOiAiQ0FBQyxTQUFVQSxFQUFRQyxFQUFTLENBQzFCLE9BQU8sU0FBWSxVQUFZLE9BQU8sT0FBVyxJQUFjQSxFQUFRLFFBQVMsUUFBUSxLQUFLLEVBQUcsUUFBUSxNQUFNLEVBQUcsUUFBUSxRQUFRLENBQUMsRUFDbEksT0FBTyxRQUFXLFlBQWMsT0FBTyxJQUFNLE9BQU8sQ0FBQyxVQUFXLE1BQU8sT0FBUSxRQUFRLEVBQUdBLENBQU8sR0FDaEdELEVBQVMsT0FBTyxXQUFlLElBQWMsV0FBYUEsR0FBVSxLQUFNQyxFQUFRRCxFQUFPLFFBQVUsQ0FBQyxFQUFHQSxFQUFPLElBQUtBLEVBQU8sS0FBTUEsRUFBTyxNQUFNLEVBQ2hKLEdBQUcsS0FBTyxTQUFVRSxFQUFTQyxFQUFLQyxHQUFNQyxHQUFRLENBQUUsYUFFaEQsTUFBTUMsR0FBaUIsNkJBRWpCQyxHQUE0Qkos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QUFLLE9BQU8sbUJBQXFCdWIsQ0FBSSxDQUNoRyxDQUNGLENBQ0EsUUFBUyxDQUNQLE1BQU1sSSxFQUFVLEtBQUsscUJBQXFCLEVBQzFDNEMsRUFBUyxTQUFTLElBQUksQ0FDcEIsUUFBQTVDLEVBQ0Esc0JBQXVCd0MsR0FBZ0N4QyxFQUFRLHVCQUF3QixhQUFhLEVBQ3BHLGlCQUFrQixLQUFLLG9CQUFvQixFQUMzQyxjQUFlLEtBQUssdUJBQXVCLEVBQzNDLGFBQWMsT0FFZCxXQUFZLE1BRWQsQ0FBQyxDQUNILENBQ0Esc0JBQXNCbUksRUFBUSxDQUM1QixLQUFLLGNBQWdCLEdBQ2pCLEtBQUssT0FBTyxpQkFBaUIsS0FBSyxPQUFPLGdCQUFnQkEsQ0FBTSxDQUNyRSxDQUNBLFNBQVUsQ0FDUixVQUFXUixLQUFXLE9BQU8sT0FBTyxLQUFLLFVBQVksQ0FBQyxDQUFDLEVBQ3JEQSxFQUFRLEtBQUssT0FBTyxFQUV0QixPQUFPLG9CQUFvQixVQUFXLEtBQUssYUFBYSxjQUFjLEtBQUssS0FBSyxZQUFZLENBQUMsQ0FDL0YsQ0FDRixFQWxJSVYsRUFBSyxTQUFXckUsRUF4RXBCLElBQU13RixHQUFObkIsRUE0TUE5YixFQUFRLFVBQVlnQyxFQUNwQmhDLEVBQVEsWUFBY2lkLEdBRXRCLE9BQU8sZUFBZWpkLEVBQVMsT0FBTyxZQUFhLENBQUUsTUFBTyxRQUFTLENBQUMsQ0FFeEUsQ0FBRSIsCiAgIm5hbWVzIjogWyJnbG9iYWwiLCAiZmFjdG9yeSIsICJleHBvcnRzIiwgInpvZCIsICJ1dWlkIiwgInBlbnBhbCIsICJGUkFNRV9CQVNFX1VSTCIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UiLCAiWm9kRmllbGRFcnJvciIsICJab2RGaWVsZEVycm9ycyIsICJNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFIiwgImdldEh1bWFuRnJpZW5kbHlNZXNzYWdlIiwgIm9nRXJyb3JNZXNzYWdlIiwgImtleSIsICJpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCIsICJzdHIiLCAiY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJyZXNwb25zZSIsICJlcnIiLCAiY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyIsICJlcnJvcnMiLCAiZ2V0RXJyb3JNZXNzYWdlIiwgImUiLCAib2JqIiwgImUyIiwgIm1ha2VDYWxsYmFja1NhZmUiLCAiY2FsbGJhY2tOYW1lIiwgImZuIiwgImFyZ3MiLCAiUmVxdWlyZWRTdHJpbmciLCAiT3B0aW9uYWxTdHJpbmciLCAibnVsbE9yVW5kZWZPciQxIiwgInpUeXBlIiwgIkZpZWxkTmFtZSIsICJGaWVsZE5hbWUyIiwgIkZpZWxkTmFtZUVudW0iLCAiUHJpdmF0ZUZpZWxkTmFtZSIsICJQcml2YXRlRmllbGROYW1lMiIsICJQcml2YXRlRmllbGROYW1lRW51bSIsICJBbGxGaWVsZE5hbWVzIiwgIkVsZW1lbnRUeXBlRW51bSIsICJFbGVtZW50VHlwZUVudW0yIiwgIkVsZW1lbnRUeXBlIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCQxIiwgIlBheW1lbnRNZXRob2RNaW5pbWFsIiwgIkV2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRUeXBlIiwgIkdlbmVyaWNFdmVudFBheWxvYWQiLCAiSW5wdXRFdmVudFR5cGUiLCAiSW5wdXRFdmVudFBheWxvYWQiLCAiRXJyb3JFdmVudFR5cGUiLCAiRXJyb3JFdmVudFBheWxvYWQiLCAiVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCIsICJMYXlvdXRFdmVudFBheWxvYWQiLCAiTG9hZGVkRXZlbnRQYXlsb2FkIiwgIlBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCIsICJTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAiUFJGb3JtRmllbGRzIiwgIlN1Ym1pdEV2ZW50VHlwZSIsICJTdWJtaXRFdmVudFBheWxvYWQiLCAiVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkIiwgIkNoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJFdmVudFBheWxvYWQiLCAiRWxlbWVudEV2ZW50IiwgIkNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgIkZpZWxkVmFsaWRhdGlvbkVycm9yIiwgIlRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UiLCAiVG9rZW5pemVDYXJkUmVzcG9uc2UiLCAiVGhyZWVEU1N0YXR1cyIsICJUaHJlZURTU3RhdHVzMiIsICJQaW5nM0RTU3RhdHVzUmVzcG9uc2UiLCAiQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgImV4dHJhY3RJc3N1ZXNQZXJGaWVsZCIsICJlcnJvciIsICJpc3N1ZXNQZXJGaWVsZCIsICJ2YWx1ZSIsICJmaWVsZE5hbWUiLCAiU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgIlBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhIiwgIm91ckN1cnJlbmN5VG9UaGVpcnMiLCAiZ2V0TG9hZGVkU3RyaXBlIiwgInB1Ymxpc2hhYmxlS2V5IiwgImkiLCAiaXNTdHJpcGVKc1ByZXNlbnQiLCAic2xlZXAiLCAiY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QiLCAic3RyaXBlUHViS2V5IiwgInRvdGFsQW1vdW50QXRvbSIsICJjdXJyZW5jeSIsICJpc0Ftb3VudFBlbmRpbmciLCAiaXNMaW5rT25seSIsICJzdHJpcGUiLCAic3RyaXBlQ3VycmVuY3kiLCAidGltZW91dE1zIiwgInJlc29sdmUiLCAid2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QiLCAicGF5bWVudFJlcXVlc3QiLCAicmVqZWN0IiwgImV2dCIsICJjb25maXJtU3RyaXBlUHJQTSIsICJuZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlUG0iLCAiY29uZmlybVJlc3VsdCIsICJsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93IiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9kIiwgInJlc3VsdFN0YXR1cyIsICJjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyIsICJzdHlsZXMiLCAiY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtIiwgImZvcm1EaXYiLCAiaW5pdGlhbERpY3QiLCAiYWNjIiwgImlucHV0IiwgInBhcnNlRXZlbnRQYXlsb2FkIiwgImV2ZW50RGF0YSIsICJlbWl0RXZlbnQiLCAidGFyZ2V0IiwgImZvcm1JZCIsICJlbGVtZW50SWQiLCAicGF5bG9hZCIsICJiYXNlVXJsIiwgImV2ZW50IiwgImNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QiLCAicGluZyIsICJyZXN1bHQiLCAiaXNSZXN1bHRWYWxpZCIsICJpc1ZhbGlkIiwgIm51bGxPclVuZGVmT3IiLCAiQ0RFUmVzcG9uc2VFcnJvciIsICJDdXJyZW5jeUVudW0iLCAiQ291cG9uTWluaW1hbCIsICJMaW5lSXRlbSIsICJCcmFuZFNldHRpbmdzIiwgIkJyYW5kIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJTdWJzY3JpcHRpb25JdGVtTWluaW1hbCIsICJTdWJzY3JpcHRpb25NaW5pbWFsIiwgIkludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCIsICJJbnZvaWNlTGluZUl0ZW1NaW5pbWFsIiwgIkRpc2NvdW50TWluaW1hbCIsICJJbnZvaWNlTWluaW1hbCIsICJDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwiLCAiUHJldmlld0NoZWNrb3V0UmVzcG9uc2UiLCAiX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiIsICJQYXltZW50Rm9ybVByZWZpbGwiLCAiQ29tcGxldGVkRm9ybVByZWZpbGwiLCAiRXhwaXJlZEZvcm1QcmVmaWxsIiwgIkNoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlIiwgIlNldHVwQ2hlY2tvdXRSZXNwb25zZSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJTdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAiU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UiLCAic3VtIiwgImFyciIsICJhIiwgImIiLCAiZml4UHJvdG8iLCAicHJvdG90eXBlIiwgInNldFByb3RvdHlwZU9mIiwgImZpeFN0YWNrIiwgImNhcHR1cmVTdGFja1RyYWNlIiwgIl9fZXh0ZW5kcyIsICJfZXh0ZW5kU3RhdGljcyIsICJkIiwgInAiLCAiX18iLCAiQ3VzdG9tRXJyb3IiLCAiX3N1cGVyIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJfbmV3VGFyZ2V0IiwgIl90aGlzIiwgIkNkZUVycm9yIiwgImZyaWVuZGx5TWVzc2FnZSIsICJxdWVyeUNERSIsICJjZGVDb25uIiwgImRhdGEiLCAicmVzcG9uc2VTY2hlbWEiLCAiaXNDREVSZXNwb25zZUVycm9yIiwgImNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hIiwgInNjaGVtYSIsICJnZXRDaGVja291dFByZXZpZXciLCAicmVxdWVzdCIsICJnZXRQcmVmaWxsIiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiaWZyYW1lIiwgImNoaWxkT3JpZ2luIiwgImNvbm5lY3Rpb25PYmoiLCAic3R5bGVzJDIiLCAiY3JlYXRlQW5kT3BlbkZyYW1lIiwgInVybCIsICJ0ZW1wbGF0ZSIsICJob3N0IiwgInNoYWRvd1Jvb3QiLCAiY2FuY2VsQnV0dG9uIiwgInN0YXJ0UG9sbGluZyIsICJvblN1Y2Nlc3MiLCAiaGFuZGxlUG9sbGluZyIsICJzdGF0dXMiLCAicG9sbGluZ0ludGVydmFsIiwgImhhbmRsZUV2ZW50cyIsICJlbGVtZW50cyIsICJoYW5kbGVDYW5jZWwiLCAic3RhcnQzZHNWZXJpZmljYXRpb24iLCAiY2xlYW51cEV2ZW50TGlzdGVuZXJzIiwgIkFOU0lfQkFDS0dST1VORF9PRkZTRVQiLCAid3JhcEFuc2kxNiIsICJvZmZzZXQiLCAiY29kZSIsICJ3cmFwQW5zaTI1NiIsICJ3cmFwQW5zaTE2bSIsICJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIsICJzdHlsZXMkMSIsICJmb3JlZ3JvdW5kQ29sb3JOYW1lcyIsICJiYWNrZ3JvdW5kQ29sb3JOYW1lcyIsICJhc3NlbWJsZVN0eWxlcyIsICJjb2RlcyIsICJncm91cE5hbWUiLCAiZ3JvdXAiLCAic3R5bGVOYW1lIiwgInN0eWxlIiwgImhleCIsICJtYXRjaGVzIiwgImNvbG9yU3RyaW5nIiwgImNoYXJhY3RlciIsICJpbnRlZ2VyIiwgInJlbWFpbmRlciIsICJhbnNpU3R5bGVzIiwgImxldmVsIiwgImJyYW5kIiwgImNvbG9yU3VwcG9ydCIsICJzdXBwb3J0c0NvbG9yIiwgInN0cmluZ1JlcGxhY2VBbGwiLCAic3RyaW5nIiwgInN1YnN0cmluZyIsICJyZXBsYWNlciIsICJpbmRleCIsICJzdWJzdHJpbmdMZW5ndGgiLCAiZW5kSW5kZXgiLCAicmV0dXJuVmFsdWUiLCAic3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4IiwgInByZWZpeCIsICJwb3N0Zml4IiwgImdvdENSIiwgInN0ZG91dENvbG9yIiwgInN0ZGVyckNvbG9yIiwgIkdFTkVSQVRPUiIsICJTVFlMRVIiLCAiSVNfRU1QVFkiLCAibGV2ZWxNYXBwaW5nIiwgImFwcGx5T3B0aW9ucyIsICJvYmplY3QiLCAiY29sb3JMZXZlbCIsICJjaGFsa0ZhY3RvcnkiLCAiY2hhbGsiLCAic3RyaW5ncyIsICJjcmVhdGVDaGFsayIsICJidWlsZGVyIiwgImNyZWF0ZUJ1aWxkZXIiLCAiY3JlYXRlU3R5bGVyIiwgImdldE1vZGVsQW5zaSIsICJtb2RlbCIsICJ0eXBlIiwgImFyZ3VtZW50c18iLCAidXNlZE1vZGVscyIsICJzdHlsZXIiLCAiYmdNb2RlbCIsICJwcm90byIsICJvcGVuIiwgImNsb3NlIiwgInBhcmVudCIsICJvcGVuQWxsIiwgImNsb3NlQWxsIiwgInNlbGYiLCAiX3N0eWxlciIsICJfaXNFbXB0eSIsICJhcHBseVN0eWxlIiwgImxmSW5kZXgiLCAiYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMiLCAic2ltcGxlT2pzRmxvdyIsICJwYXJhbXMiLCAiZmxvd1Jlc3VsdCIsICJhZGRFcnJvckNhdGNoZXJGb3JJbml0IiwgImluaXQiLCAiZXJyX18iLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAibG9nIiwgImxvZ19fJDMiLCAiZXJyX18kNCIsICJ2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyIsICJub25DZGVGb3JtSW5wdXRzIiwgIm9uVmFsaWRhdGlvbkVycm9yIiwgImZvcm1hdHRlZCIsICJpc3N1ZXMiLCAidmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdCIsICJwYXJzZWQiLCAiZXJyX18kMyIsICJwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgImZpbmRDcG1NYXRjaGluZ1R5cGUiLCAiYWxsQ1BNcyIsICJ6b2RNb2RlbCIsICJjcG0iLCAiY3BtMiIsICJsb2dfXyQyIiwgImVycl9fJDIiLCAic3RyaXBlTG9nX18iLCAicnVuQ29tbW9uQ2NGbG93IiwgImNvbnRleHQiLCAiY2hlY2tvdXRQYXltZW50TWV0aG9kIiwgImZsb3dDYWxsYmFja3MiLCAiYW55Q2RlQ29ubmVjdGlvbiIsICJwcmVmaWxsIiwgIm5vbkNkZUZvcm1GaWVsZHMiLCAidG9rZW5pemVDYXJkUmVzdWx0cyIsICJjb21tb25DaGVja291dFBhcmFtcyIsICJzaG91bGRVc2VOZXdGbG93IiwgInN0YXJ0UGZSZXN1bHQiLCAiY29tbW9uQ0MzRFNGbG93IiwgInN0cmlwZUNDM0RTRmxvdyIsICJjcmVhdGVkUGF5bWVudE1ldGhvZCIsICJwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJzdHJpcGVBY3Rpb24iLCAiYWN0aW9uIiwgInBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgImNvbW1vbkFjdGlvbiIsICJsb2dfXyQxIiwgImVycl9fJDEiLCAiU3RyaXBlUHJDcG0iLCAiaW5pdFN0cmlwZVByRmxvdyIsICJpbml0aWFsUHJldmlldyIsICJwciIsICJjYW5NYWtlUGF5bWVudCIsICJydW5TdHJpcGVQckZsb3ciLCAiY3VzdG9tUGFyYW1zIiwgImluaXRSZXN1bHQiLCAiY2xlYW5lZEZvcm1JbnB1dHMiLCAib3ZlcnJpZGVFbXB0eVppcENvZGUiLCAib3ZlcnJpZGUiLCAidXBkYXRlUHJXaXRoQW1vdW50IiwgInN0cmlwZVBtQWRkZWRFdmVudCIsICJzdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAicGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YSIsICJjaGVja291dFJlcXVlc3QiLCAiZm9ybUlucHV0cyIsICJuZXdGb3JtSW5wdXRzIiwgImFtb3VudCIsICJpc1BlbmRpbmciLCAiZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCIsICJjcG1zIiwgIndpdGhQcm92aWRlciIsICJ3aXRoUHJvY2Vzc29yIiwgIk9qc0Zsb3dzIiwgImdldERlZmF1bHRFeHBvcnRGcm9tQ2pzIiwgIngiLCAiT2JzZXJ2YWJsZSQyIiwgImhhc1N5bWJvbCIsICJuYW1lIiwgImdldFN5bWJvbCIsICJTeW1ib2xJdGVyYXRvciIsICJTeW1ib2xPYnNlcnZhYmxlIiwgIlN5bWJvbFNwZWNpZXMiLCAiZ2V0TWV0aG9kIiwgImdldFNwZWNpZXMiLCAiY3RvciIsICJPYnNlcnZhYmxlJDEiLCAiaXNPYnNlcnZhYmxlIiwgImhvc3RSZXBvcnRFcnJvciIsICJlbnF1ZXVlIiwgImNsZWFudXBTdWJzY3JpcHRpb24iLCAic3Vic2NyaXB0aW9uIiwgImNsZWFudXAiLCAidW5zdWJzY3JpYmUiLCAiY2xvc2VTdWJzY3JpcHRpb24iLCAiZmx1c2hTdWJzY3JpcHRpb24iLCAicXVldWUiLCAibm90aWZ5U3Vic2NyaXB0aW9uIiwgIm9ic2VydmVyIiwgIm0iLCAib25Ob3RpZnkiLCAiU3Vic2NyaXB0aW9uIiwgInN1YnNjcmliZXIiLCAic3Vic2NyaXB0aW9uT2JzZXJ2ZXIiLCAiT2JzZXJ2YWJsZSIsICJkb25lIiwgIkMiLCAiaGFzU2VlZCIsICJoYXNWYWx1ZSIsICJmaXJzdCIsICJ2YWx1ZXMiLCAic291cmNlcyIsICJzdGFydE5leHQiLCAibmV4dCIsICJ2IiwgInN1YnNjcmlwdGlvbnMiLCAib3V0ZXIiLCAiaW5uZXIiLCAiY29tcGxldGVJZkRvbmUiLCAicyIsICJtZXRob2QiLCAib2JzZXJ2YWJsZSIsICJpdGVtIiwgIml0ZW1zIiwgInplbk9ic2VydmFibGUiLCAibG9nX18iLCAiaW5pdGlhbGl6ZU9qc0Zsb3dzIiwgInJ1bkluaXRGbG93QXNPYnNlcnZhYmxlIiwgImZsb3dOYW1lIiwgImluaXRGbG93IiwgIlBSX0xPQURJTkciLCAiUFJfRVJST1IiLCAiT3BlblBheUZvcm1FdmVudEhhbmRsZXIiLCAiZm9ybUluc3RhbmNlIiwgImhlaWdodCIsICJmaWVsZCIsICJzb3VyY2UiLCAiY3JlYXRlQ29ubmVjdGlvbiIsICJpc1ZhbGlkT2JqZWN0IiwgIkNvbm5lY3Rpb25NYW5hZ2VyIiwgImlkIiwgImNvbm5lY3Rpb24iLCAiX09wZW5QYXlGb3JtIiwgImNvbmZpZyIsICJpbml0U3RhdHVzIiwgIl9lIiwgIl9mIiwgImNhbkFwcGxlUGF5IiwgImNhbkdvb2dsZVBheSIsICJ1c2VyUGFyYW1zIiwgInByb3ZpZGVyIiwgImZvcm0iLCAiZWxlbWVudCIsICJlbGVtZW50VmFsdWUiLCAiZnJhbWUiLCAicXVlcnlTdHJpbmciLCAic2VsZWN0b3IiLCAiY29ubiIsICJjZGVDb25uZWN0aW9ucyIsICJub09wIiwgImVyck1zZyIsICJPcGVuUGF5Rm9ybSJdCn0K
|
|
15
|
+
`;const r=document.createElement("div"),o=r.attachShadow({mode:"open"});o.appendChild(e.content.cloneNode(!0));const s=o.querySelector("#three-ds-iframe"),i=o.querySelector(".cancel-button");return document.body.appendChild(r),{host:r,iframe:s,cancelButton:i}};function an(n,e,r){const o=async()=>{try{const i=await rn(n,r);i&&(clearInterval(s),e(i))}catch{}};o();const s=setInterval(o,ye);return s}function cn({elements:n,pollingInterval:e,resolve:r}){const o=()=>{clearInterval(e),n.host.remove(),r(M.CANCELLED)};return n.cancelButton.addEventListener("click",o),()=>{n.cancelButton.removeEventListener("click",o)}}async function ln({url:n,baseUrl:e}){const r=sn(n);return new Promise(o=>{const s=c=>{setTimeout(()=>{r.host.remove()},1e3),o(c),a==null||a()},i=an(r.iframe,s,new URL(e).origin),a=cn({elements:r,pollingInterval:i,resolve:o})})}const _e=n=>async e=>{try{e.flowCallbacks.onCheckoutStarted();const r=await n(e);if(r.mode==="setup")e.flowCallbacks.onSetupPaymentMethodSuccess(r.result.payment_method_id);else if(r.mode==="checkout")e.flowCallbacks.onCheckoutSuccess(r.result.invoice_urls,r.result.subscription_ids,r.result.customer_id);else throw new Error(`Unhandled mode: ${r}`)}catch(r){throw e.flowCallbacks.onCheckoutError(Q(r)),r}},un=n=>async e=>{try{return await n(e)}catch(r){const{err__:o}=v("init-error-catcher");return o(r),{isAvailable:!1,reason:Q(r)}}},v=n=>{const e=(...o)=>{window.console.log(`${I.green.bold("ojs/")}${I.bold.gray(`${n}`)} `,...o)},r=(...o)=>{window.console.error(`${I.red.bold("ojs/")}${I.bold.gray(`${n}`)} `,...o)};return{log:e,err:r,log__:e,err__:r}},{log__:mn,err__:ge}=v("common-cc"),we=(n,e)=>{const r=k.safeParse(n);if(!r.success){const o=r.error.format(),s=ft(o);for(const[i,a]of Object.entries(s))e(i,a,i);throw ge("Got validation errors in non-CDE form fields",s),new Error("Got validation errors in non-CDE form fields")}return r.data},pn=(n,e)=>{for(const r of n)if(r.success===!1)throw r.errors.forEach(o=>{const s=ne.safeParse(o.elementType);if(!s.success)ge(`Unknown field name in onValidationError: ${o.elementType}`);else{const i=s.data;e(i,o.errors)}}),mn(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`),new Error("Got validation errors while tokenizing card")},{err__:K}=v("commmon"),Ee=n=>{if(n.payment_methods.length!==1)throw new Error(`Expected exactly one payment method, got ${n.payment_methods.length}`);return{payment_method_id:n.payment_methods[0].id}},fn=(n,e)=>{const r=n.find(o=>e.safeParse(o).success);if(!r)throw K(`No CPMs found for model ${e}`),K(n),K("zodModel"),new Error(`No CPMs found for model ${e}`);return e.parse(r)},{log__:d,err__:be}=v("common-cc"),{log__:Ce}=v("stripe-cc"),dn=_e(async({context:n,checkoutPaymentMethod:e,nonCdeFormInputs:r,flowCallbacks:o})=>{var u;d("├ Running common CC flow...",{checkoutPaymentMethod:e});const s=Array.from(n.cdeConnections.values())[0],i=await H(s);d(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);const a=we(r,o.onValidationError);d(`├ Tokenizing card info in CDE [Session: ${n.elementsSessionId}]`);const c=await en(n.cdeConnections,{session_id:n.elementsSessionId});pn(c,o.onValidationError);const l={session_id:n.elementsSessionId,checkout_payment_method:e,non_cde_form_fields:a};try{if(i.mode==="setup"){d(`├ Setting up payment method in CDE [Token: ${i.token}]`);const m=await tn(s,l);return d(`╰ Setup completed successfully [PM ID: ${m.payment_method_id}]`),{mode:"setup",result:m}}else{d(`├ Initial checkout flow. Checking out card info in CDE [Session: ${n.elementsSessionId}]`);const m=await he(s,l);return d("╰ Checkout completed successfully."),{mode:"checkout",result:m}}}catch(m){if(m instanceof fe&&m.originalErrorMessage==="3DS_REQUIRED"){d("├ Card requires 3DS, starting non-legacy payment flow");const P=((u=m.response.headers)==null?void 0:u["op-should-use-new-flow"])==="true",g=await Jt(s,l);if(d(`├ op-should-use-new-flow: ${P}`),d("├ Payment flow result:",g),P?await _n(g,n.baseUrl):await gn(g),i.mode==="setup"){d(`├ Confirming payment flow [cc_pm_id: ${g.cc_pm_id}]`);const C=await de(s,{secure_token:i.token,existing_cc_pm_id:g.cc_pm_id});d("├ Confirm payment flow result received Result:",C);const S=Ee(C);return d(`╰ Setup completed successfully [PM ID: ${S.payment_method_id}]`),{mode:"setup",result:S}}else{d(`├ Checking out after 3DS flow [Flow: ${P?"new":"legacy"}]`);const C=await he(s,{...l,existing_cc_pm_id:g.cc_pm_id,do_not_use_legacy_cc_flow:!P});return d("╰ Checkout completed successfully."),{mode:"checkout",result:C}}}throw be("╰ Error checking out card info in CDE"),be(m),m}}),hn=n=>{const e=n.required_user_actions.find(r=>r.type==="stripe_3ds");if(!e)throw new Error("No stripe 3DS action found");return dt.parse(e)},yn=n=>{const e=n.required_user_actions.find(r=>r.type==="airwallex_payment_consent");if(!e)throw new Error("No common 3DS action found");return pt.parse(e)},_n=async(n,e)=>{const r=yn(n);d(`├ Using common 3DS flow [URL: ${r.redirect_url}]`);const o=await ln({url:r.redirect_url,baseUrl:e});if(d(`╰ 3DS verification completed [Status: ${o}]`),o===M.CANCELLED)throw new Error("3DS verification cancelled");if(o===M.FAILURE)throw new Error("3DS verification failed")},gn=async n=>{const e=hn(n);Ce(`├ Using stripe 3DS flow [Client Secret: ${e.client_secret.substring(0,8)}...]`),await bt(e),Ce("╰ Stripe 3DS flow completed successfully")},{log__:_,err__:wn}=v("stripe-pr"),En=t.z.object({provider:t.z.union([t.z.literal("apple_pay"),t.z.literal("google_pay")]),processor_name:t.z.literal("stripe"),metadata:t.z.object({stripe_pk:t.z.string()})}),bn=un(async({context:n})=>{_("Checking if there are any CPMs for Stripe PR...");const e=fn(n.checkoutPaymentMethods,En);_("Initializing Stripe PR flow...");const r=Array.from(n.cdeConnections.values())[0],o=await H(r),s=o.mode==="setup";_("Getting initial preview amount");const i=await Xt(r,o.token,s,void 0),a=await _t(e.metadata.stripe_pk,i.amountAtom,i.currency,s);_("Checking if can make payment");const c=await a.canMakePayment();return c===null?(wn("canMakePayment returned null"),{isAvailable:!1,reason:"canMakePayment returned null"}):(_("Stripe PR flow initialized successfully. Can make payment",c),{isAvailable:!0,pr:a,availableProviders:{applePay:c.applePay,googlePay:c.googlePay}})}),Cn=_e(async({context:n,checkoutPaymentMethod:e,nonCdeFormInputs:r,flowCallbacks:o,customParams:s,initResult:i})=>{if(_("Running Stripe PR flow..."),s.provider!==e.provider)throw new Error(`Provider mismatch. Expected ${s.provider}, got ${e.provider}`);const a=Array.from(n.cdeConnections.values())[0],c=i.pr;if(s!=null&&s.overridePaymentRequest){const S=s.overridePaymentRequest;_("Overriding PR amount with",S),Pn(c,S.amount,S.pending)}_("Showing PR dialog..."),c.show();const l=await wt(c);_("Stripe PM added event:",l),_("Merging PM fields with form fields...");const u=Sn(r,l),m=we(u,o.onValidationError);_("PR dialog finished. Starting payment flow...");const P=await Wt(a,{fields:m,checkoutPaymentMethod:e}),g=vn(P);_("Confirming PR with Stripe..."),await Et(g,l);const C=await H(a);if(C.mode==="setup"){_("Confirming payment flow for setup...");const S=await de(a,{secure_token:C.token});return{mode:"setup",result:Ee(S)}}else{_("Performing checkout...");const S={secure_token:C.token,payment_input:{provider_type:e.provider},customer_email:m[f.EMAIL],customer_zip_code:m[f.ZIP_CODE],customer_country:m[f.COUNTRY],promotion_code:m[f.PROMOTION_CODE],line_items:C.line_items,total_amount_atom:C.amount_total_atom,cancel_at_end:!1,checkout_payment_method:e};return{mode:"checkout",result:await nn(a,S)}}}),Sn=(n,e)=>{var a,c,l,u;const r={...n},[o,...s]=((c=(a=e.payerName)==null?void 0:a.trim())==null?void 0:c.split(/\s+/))??[],i=s.join(" ")||void 0;return r[f.FIRST_NAME]=r[f.FIRST_NAME]||o||"_OP_UNKNOWN",r[f.LAST_NAME]=r[f.LAST_NAME]||i||"_OP_UNKNOWN",r[f.EMAIL]=r[f.EMAIL]||e.payerEmail||"op_unfilled@getopenpay.com",r[f.ZIP_CODE]=r[f.ZIP_CODE]||((l=e.shippingAddress)==null?void 0:l.postalCode)||"00000",r[f.COUNTRY]=r[f.COUNTRY]||((u=e.shippingAddress)==null?void 0:u.country)||"US",_("Final form inputs:",r),r},Pn=(n,e,r)=>{n.update({total:{amount:e.amountAtom,label:"Total",pending:r},currency:e.currency})},vn=n=>{if(n.required_user_actions.length!==1)throw new Error(`Error occurred.
|
|
16
|
+
Details: got ${n.required_user_actions.length} required user actions`);return ht.parse(n.required_user_actions[0])},Se=(n,e,r)=>{const o=n.filter(s=>s.provider===e);if(o.length===0)throw new Error(`No CPMs found with provider '${e}' and processor '${r}'`);if(o.length!==1)throw new Error(`More than one CPM found with provider '${e}' and processor '${r}'`);return o[0]},D={commonCC:{run:dn},stripePR:{init:bn,run:Cn}};function On(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var N={};Object.defineProperty(N,"__esModule",{value:!0}),N.Observable=void 0;const Pe=n=>!!Symbol[n],B=n=>Pe(n)?Symbol[n]:"@@"+n,Rn=B("iterator"),Y=B("observable"),ve=B("species");function x(n,e){let r=n[e];if(r!=null){if(typeof r!="function")throw new TypeError(r+" is not a function");return r}}function T(n){let e=n.constructor;return e!==void 0&&(e=e[ve],e===null&&(e=void 0)),e!==void 0?e:$}function kn(n){return n instanceof $}function O(n){O.log?O.log(n):setTimeout(()=>{throw n})}function U(n){Promise.resolve().then(()=>{try{n()}catch(e){O(e)}})}function Oe(n){let e=n._cleanup;if(e!==void 0&&(n._cleanup=void 0,!!e))try{if(typeof e=="function")e();else{let r=x(e,"unsubscribe");r&&r.call(e)}}catch(r){O(r)}}function Z(n){n._observer=void 0,n._queue=void 0,n._state="closed"}function Tn(n){let e=n._queue;if(e){n._queue=void 0,n._state="ready";for(let r=0;r<e.length&&(Re(n,e[r].type,e[r].value),n._state!=="closed");++r);}}function Re(n,e,r){n._state="running";let o=n._observer;try{let s=x(o,e);switch(e){case"next":s&&s.call(o,r);break;case"error":if(Z(n),s)s.call(o,r);else throw r;break;case"complete":Z(n),s&&s.call(o);break}}catch(s){O(s)}n._state==="closed"?Oe(n):n._state==="running"&&(n._state="ready")}function G(n,e,r){if(n._state!=="closed"){if(n._state==="buffering"){n._queue.push({type:e,value:r});return}if(n._state!=="ready"){n._state="buffering",n._queue=[{type:e,value:r}],U(()=>Tn(n));return}Re(n,e,r)}}class An{constructor(e,r){this._cleanup=void 0,this._observer=e,this._queue=void 0,this._state="initializing";let o=this,s={get closed(){return o._state==="closed"},next(i){G(o,"next",i)},error(i){G(o,"error",i)},complete(){G(o,"complete")}};try{this._cleanup=r.call(void 0,s)}catch(i){s.error(i)}this._state==="initializing"&&(this._state="ready")}get closed(){return this._state==="closed"}unsubscribe(){this._state!=="closed"&&(Z(this),Oe(this))}}let $=class q{constructor(e){if(!(this instanceof q))throw new TypeError("Observable cannot be called as a function");if(typeof e!="function")throw new TypeError("Observable initializer must be a function");this._subscriber=e}subscribe(e){return(typeof e!="object"||e===null)&&(e={next:e,error:arguments[1],complete:arguments[2]}),new An(e,this._subscriber)}forEach(e){return new Promise((r,o)=>{if(typeof e!="function"){o(new TypeError(e+" is not a function"));return}function s(){i.unsubscribe(),r()}let i=this.subscribe({next(a){try{e(a,s)}catch(c){o(c),i.unsubscribe()}},error:o,complete:r})})}map(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=T(this);return new r(o=>this.subscribe({next(s){try{s=e(s)}catch(i){return o.error(i)}o.next(s)},error(s){o.error(s)},complete(){o.complete()}}))}filter(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=T(this);return new r(o=>this.subscribe({next(s){try{if(!e(s))return}catch(i){return o.error(i)}o.next(s)},error(s){o.error(s)},complete(){o.complete()}}))}reduce(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=T(this),o=arguments.length>1,s=!1,a=arguments[1];return new r(c=>this.subscribe({next(l){let u=!s;if(s=!0,!u||o)try{a=e(a,l)}catch(m){return c.error(m)}else a=l},error(l){c.error(l)},complete(){if(!s&&!o)return c.error(new TypeError("Cannot reduce an empty sequence"));c.next(a),c.complete()}}))}async all(){let e=[];return await this.forEach(r=>e.push(r)),e}concat(...e){let r=T(this);return new r(o=>{let s,i=0;function a(c){s=c.subscribe({next(l){o.next(l)},error(l){o.error(l)},complete(){i===e.length?(s=void 0,o.complete()):a(r.from(e[i++]))}})}return a(this),()=>{s&&(s.unsubscribe(),s=void 0)}})}flatMap(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=T(this);return new r(o=>{let s=[],i=this.subscribe({next(c){if(e)try{c=e(c)}catch(u){return o.error(u)}let l=r.from(c).subscribe({next(u){o.next(u)},error(u){o.error(u)},complete(){let u=s.indexOf(l);u>=0&&s.splice(u,1),a()}});s.push(l)},error(c){o.error(c)},complete(){a()}});function a(){i.closed&&s.length===0&&o.complete()}return()=>{s.forEach(c=>c.unsubscribe()),i.unsubscribe()}})}[Y](){return this}static from(e){let r=typeof this=="function"?this:q;if(e==null)throw new TypeError(e+" is not an object");let o=x(e,Y);if(o){let s=o.call(e);if(Object(s)!==s)throw new TypeError(s+" is not an object");return kn(s)&&s.constructor===r?s:new r(i=>s.subscribe(i))}if(Pe("iterator")&&(o=x(e,Rn),o))return new r(s=>{U(()=>{if(!s.closed){for(let i of o.call(e))if(s.next(i),s.closed)return;s.complete()}})});if(Array.isArray(e))return new r(s=>{U(()=>{if(!s.closed){for(let i=0;i<e.length;++i)if(s.next(e[i]),s.closed)return;s.complete()}})});throw new TypeError(e+" is not observable")}static of(...e){let r=typeof this=="function"?this:q;return new r(o=>{U(()=>{if(!o.closed){for(let s=0;s<e.length;++s)if(o.next(e[s]),o.closed)return;o.complete()}})})}static get[ve](){return this}};N.Observable=$,Object.defineProperty($,Symbol("extensions"),{value:{symbol:Y,hostReportError:O},configurable:!0});var In=N.Observable;const jn=On(In),{log__:Fn,err__:Mn}=v("init-flows"),Ln=n=>({stripePR:Dn("stripePR",D.stripePR.init({context:n}))}),Dn=(n,e)=>{const r=new jn(o=>{o.next({status:"loading"}),e.then(s=>{o.next({status:"loaded",result:s})}).catch(s=>{o.next({status:"error",message:s.message})})});return r.subscribe({next:o=>{Fn(`${n} flow result`,o)},error:o=>{throw Mn(`${n} flow initialization error:
|
|
17
|
+
${JSON.stringify(o)}`),o}}),r},ke={isLoading:!0,isAvailable:!1,startFlow:async()=>{}},Te={isLoading:!1,isAvailable:!1,startFlow:async()=>{}};class Nn{constructor(e){this.formInstance=e,this.config=e.config,this.formId=e.formId,this.eventTargets={},this.nonces=new Set}handleMessage(e){var c;if(!e.source)throw new Error("No source found");if(e.origin!==((c=this.formInstance.config._frameUrl)==null?void 0:c.origin)||typeof e.data=="object"&&e.data.penpal)return;const r=Pt(JSON.parse(e.data));if(!this.validateEvent(r))return;const{elementId:s,payload:i}=r;switch(i.type){case"LAYOUT":this.handleLayoutEvent(i);break;case"FOCUS":this.handleFocusEvent(s,i.elementType);break;case"BLUR":this.handleBlurEvent(s,i.elementType);break;case"CHANGE":this.handleChangeEvent(s,i.elementType,i.errors);break;case"LOADED":this.handleLoadedEvent(e.source,s,i);break;case"LOAD_ERROR":this.handleLoadErrorEvent(i);break;case"VALIDATION_ERROR":this.handleValidationErrorEvent(i,s);break}}validateEvent(e){return e.formId!==this.formInstance.formId||!e.elementId||this.nonces.has(e.nonce)?!1:(this.nonces.add(e.nonce),!0)}handleLayoutEvent(e){const r=e.height?`${e.height}px`:"100%";this.formInstance.setFormHeight(r)}handleFocusEvent(e,r){this.config.onFocus&&this.config.onFocus(e,r)}handleBlurEvent(e,r){this.config.onBlur&&this.config.onBlur(e,r)}handleChangeEvent(e,r,o){this.config.onChange&&this.config.onChange(e,r,o)}async handleLoadedEvent(e,r,o){this.eventTargets[r]=e,this.formInstance.onCdeLoaded(o),this.config.onLoad&&this.config.onLoad(o.totalAmountAtoms,o.currency)}handleLoadErrorEvent(e){this.formInstance.config.onLoadError&&this.formInstance.config.onLoadError(e.message)}handleValidationErrorEvent(e,r){this.formInstance.config.onValidationError&&this.formInstance.config.onValidationError(e.elementType,e.errors,r)}postEventToFrame(e,r,o){vt(e,this.formId,r,o,this.config.baseUrl)}}async function xn(n,e){const o=await W.connectToChild({iframe:n,debug:!1,childOrigin:e}).promise,s=await Ot(o);if(!Rt(o,s))throw new Error("Got invalid CDE connection object");return o}class Un{constructor(){this.connections=new Map}addConnection(e,r){this.connections.set(e,r)}getConnection(){const e=this.connections.values().next().value;if(!e)throw new Error("Connection not found");return e}getAllConnections(){return this.connections}}const A=class A{constructor(e){this.tryInitOjsFlows=()=>{this.ojsFlowsInitialization===null&&this.cdeLoadedPayload&&this.connectionManager.getAllConnections().size!==0&&(this.ojsFlowsInitialization=Ln(this.createOjsFlowContext()),this.ojsFlowsInitialization.stripePR.subscribe(r=>this.onStripePRStatusChange(r)))},this.onCdeLoaded=r=>{this.cdeLoadedPayload||(this.cdeLoadedPayload=r,this.tryInitOjsFlows())},this.onStripePRStatusChange=r=>{var o,s,i,a,c,l;if(r.status==="loading")(s=(o=this.config).onPaymentRequestLoad)==null||s.call(o,{apple_pay:ke,google_pay:ke});else if(r.status==="error")(a=(i=this.config).onPaymentRequestLoad)==null||a.call(i,{apple_pay:Te,google_pay:Te});else if(r.status==="loaded"){const u=r.result,m=u.isAvailable&&u.availableProviders.applePay,P=u.isAvailable&&u.availableProviders.googlePay;(l=(c=this.config).onPaymentRequestLoad)==null||l.call(c,{apple_pay:{isLoading:!1,isAvailable:m,startFlow:async g=>m?this.submitPaymentRequest("apple_pay",u,g):void 0},google_pay:{isLoading:!1,isAvailable:P,startFlow:async g=>P?this.submitPaymentRequest("google_pay",u,g):void 0}})}},this.submitPaymentRequest=(r,o,s)=>{const i=this.createOjsFlowContext();return D.stripePR.run({context:i,checkoutPaymentMethod:Se(i.checkoutPaymentMethods,r),nonCdeFormInputs:this.getNonCdeFormInputs(),flowCallbacks:this.createOjsFlowCallbacks(),customParams:{provider:r,overridePaymentRequest:s==null?void 0:s.overridePaymentRequest},initResult:o})},A.assignAsSingleton(this),this.config={...e,baseUrl:e.baseUrl??"https://cde.getopenpay.com"},this.elements=null,this.formId=`opjs-form-${window.crypto.randomUUID()}`,this.referer=window.location.origin,this.formTarget=e.formTarget??"body",this.formProperties={height:"1px"},this.cdeLoadedPayload=null,this.ojsFlowsInitialization=null,this.checkoutFired=!1,this.connectionManager=new Un,this.eventHandler=new Nn(this),this.ojsVersion="0.1.7",window.addEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}static assignAsSingleton(e){if(A.getInstance())throw new Error("OpenPay instance already exists. Only one instance is allowed.");window.ojs=e}static getInstance(){return window.ojs??null}getConnectionManager(){return this.connectionManager}setFormHeight(e){this.formProperties.height=e,this.elements&&Object.values(this.elements).forEach(r=>{r.node.style.height=e})}createElement(e,r={}){if(!this.config)throw new Error("OpenPay form not initialized");const o=$e.parse(e),s=document.createElement("iframe"),i=this.buildQueryString(r);s.name=`${o}-element`;const a=new URL(`/app/v1/${s.name}`,this.config.baseUrl);a.search=i.toString(),s.src=a.href,this.config._frameUrl=a,s.style.border="none",s.style.width="100%";const c={type:o,node:s,mount:l=>{var u;return(u=document.querySelector(l))==null?void 0:u.appendChild(s)}};return this.connectToElement(c),this.elements?this.elements[o]=c:this.elements={[o]:c},c}buildQueryString(e){const r=new URLSearchParams;return r.append("referer",this.referer),r.append("formId",this.formId),e.styles&&r.append("styles",Ct(e.styles)),r.append("secureToken",this.config.checkoutSecureToken),r}connectToElement(e){xn(e.node).then(r=>{this.connectionManager.addConnection(e.type,r),this.tryInitOjsFlows()}).catch(r=>{})}getFormDiv(){return document.querySelector(this.formTarget)??document.body}createOjsFlowContext(){const e=this.connectionManager.getAllConnections();if(!this.cdeLoadedPayload)throw new Error("Requested context while CDE not yet loaded");if(e.size===0)throw new Error("No CDE connections found");return{baseUrl:new URL(this.config.baseUrl??Ie).origin,formDiv:this.getFormDiv(),elementsSessionId:this.cdeLoadedPayload.sessionId,checkoutPaymentMethods:this.cdeLoadedPayload.checkoutPaymentMethods,cdeConnections:e}}getNonCdeFormInputs(){return St(this.getFormDiv())}createOjsFlowCallbacks(){const e=()=>{};return{onCheckoutError:R("onCheckoutError",this.config.onCheckoutError??e),onCheckoutStarted:R("onCheckoutStarted",this.config.onCheckoutStarted??e),onCheckoutSuccess:R("onCheckoutSuccess",this.config.onCheckoutSuccess??e),onSetupPaymentMethodSuccess:R("onSetupPaymentMethodSuccess",this.config.onSetupPaymentMethodSuccess??e),onValidationError:R("onValidationError",this.config.onValidationError??e)}}submit(){const e=this.createOjsFlowContext();D.commonCC.run({context:e,checkoutPaymentMethod:Se(e.checkoutPaymentMethods,"credit_card"),nonCdeFormInputs:this.getNonCdeFormInputs(),flowCallbacks:this.createOjsFlowCallbacks(),customParams:void 0,initResult:void 0})}onPaymentRequestError(e){this.checkoutFired=!1,this.config.onCheckoutError&&this.config.onCheckoutError(e)}destroy(){for(const e of Object.values(this.elements??{}))e.node.remove();window.removeEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}};A.ojsFlows=D;let J=A;w.FieldName=f,w.OpenPayForm=J,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgudW1kLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3pvZCcpLCByZXF1aXJlKCd1dWlkJyksIHJlcXVpcmUoJ3BlbnBhbCcpLCByZXF1aXJlKCdjaGFsaycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnem9kJywgJ3V1aWQnLCAncGVucGFsJywgJ2NoYWxrJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuT3BlblBheSA9IHt9LCBnbG9iYWwuem9kLCBnbG9iYWwudXVpZCwgZ2xvYmFsLnBlbnBhbCwgZ2xvYmFsLmNoYWxrKSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIHpvZCwgdXVpZCwgcGVucGFsLCBjaGFsaykgeyAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgRlJBTUVfQkFTRV9VUkwgPSBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCI7XG5cbiAgY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgbG9jOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgbXNnOiB6b2Quei5zdHJpbmcoKSxcbiAgICB1cmw6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gem9kLnouYXJyYXkoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSk7XG4gIGNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNvZGU6IHpvZC56LnN0cmluZygpLFxuICAgIG1lc3NhZ2U6IHpvZC56LnN0cmluZygpLFxuICAgIHBhdGg6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6b2Quei5hcnJheShab2RGaWVsZEVycm9yKTtcbiAgY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxuICB9O1xuICBjb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHJldHVybiBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFW2tleV0gPz8gb2dFcnJvck1lc3NhZ2U7XG4gIH07XG4gIGNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKHJlc3BvbnNlWzBdLm1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGAke2BQbGVhc2UgZml4IHRoZSBmb2xsb3dpbmcgZXJyb3JzOmB9XG4ke2J1bGxldGVkfWA7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzID0gKGVycm9ycykgPT4ge1xuICAgIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbiAgfTtcbiAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoaXNTdHJpbmdpZmllZEpzb25PYmplY3QoZS5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvcihvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlICsgXCJcIjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IFJlcXVpcmVkU3RyaW5nID0gem9kLnouc3RyaW5nKCkudHJpbSgpLm1pbigxLCB7IG1lc3NhZ2U6IGBDYW5ub3QgYmUgYmxhbmtgIH0pO1xuICBjb25zdCBPcHRpb25hbFN0cmluZyA9IHpvZC56LnN0cmluZygpLnRyaW0oKS5vcHRpb25hbCgpO1xuICBjb25zdCBudWxsT3JVbmRlZk9yJDEgPSAoelR5cGUpID0+IHpvZC56Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuICB2YXIgRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoRmllbGROYW1lMikgPT4ge1xuICAgIEZpZWxkTmFtZTJbXCJGSVJTVF9OQU1FXCJdID0gXCJmaXJzdE5hbWVcIjtcbiAgICBGaWVsZE5hbWUyW1wiTEFTVF9OQU1FXCJdID0gXCJsYXN0TmFtZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJFTUFJTFwiXSA9IFwiZW1haWxcIjtcbiAgICBGaWVsZE5hbWUyW1wiWklQX0NPREVcIl0gPSBcInppcENvZGVcIjtcbiAgICBGaWVsZE5hbWUyW1wiQ0lUWVwiXSA9IFwiY2l0eVwiO1xuICAgIEZpZWxkTmFtZTJbXCJTVEFURVwiXSA9IFwic3RhdGVcIjtcbiAgICBGaWVsZE5hbWUyW1wiQ09VTlRSWVwiXSA9IFwiY291bnRyeVwiO1xuICAgIEZpZWxkTmFtZTJbXCJBRERSRVNTXCJdID0gXCJhZGRyZXNzXCI7XG4gICAgRmllbGROYW1lMltcIlBIT05FXCJdID0gXCJwaG9uZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJQUk9NT1RJT05fQ09ERVwiXSA9IFwicHJvbW90aW9uQ29kZVwiO1xuICAgIHJldHVybiBGaWVsZE5hbWUyO1xuICB9KShGaWVsZE5hbWUgfHwge30pO1xuICBjb25zdCBGaWVsZE5hbWVFbnVtID0gem9kLnoubmF0aXZlRW51bShGaWVsZE5hbWUpO1xuICB2YXIgUHJpdmF0ZUZpZWxkTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFByaXZhdGVGaWVsZE5hbWUyKSA9PiB7XG4gICAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZE51bWJlclwiO1xuICAgIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmRFeHBpcnlcIjtcbiAgICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkQ3ZjXCI7XG4gICAgcmV0dXJuIFByaXZhdGVGaWVsZE5hbWUyO1xuICB9KShQcml2YXRlRmllbGROYW1lIHx8IHt9KTtcbiAgY29uc3QgUHJpdmF0ZUZpZWxkTmFtZUVudW0gPSB6b2Quei5uYXRpdmVFbnVtKFByaXZhdGVGaWVsZE5hbWUpO1xuICBjb25zdCBBbGxGaWVsZE5hbWVzID0gem9kLnoudW5pb24oW0ZpZWxkTmFtZUVudW0sIFByaXZhdGVGaWVsZE5hbWVFbnVtXSk7XG4gIHZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gICAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRcIl0gPSBcImNhcmRcIjtcbiAgICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmQtbnVtYmVyXCI7XG4gICAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICAgIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX0NWQ1wiXSA9IFwiY2FyZC1jdmNcIjtcbiAgICByZXR1cm4gRWxlbWVudFR5cGVFbnVtMjtcbiAgfSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbiAgY29uc3QgRWxlbWVudFR5cGUgPSB6b2Quei5uYXRpdmVFbnVtKEVsZW1lbnRUeXBlRW51bSk7XG4gIGNvbnN0IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxID0gem9kLnoub2JqZWN0KHtcbiAgICBwcm92aWRlcjogem9kLnouc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3IkMSh6b2Quei5zdHJpbmcoKSksXG4gICAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3IkMSh6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIGNvbnN0IFBheW1lbnRNZXRob2RNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBpZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgY2FyZE51bWJlcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgZXhwaXJ5OiBPcHRpb25hbFN0cmluZyxcbiAgICBjdmM6IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIGJhY2tncm91bmRDb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgY29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGZvbnRGYW1pbHk6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGZvbnRTaXplOiBPcHRpb25hbFN0cmluZyxcbiAgICBmb250V2VpZ2h0OiBPcHRpb25hbFN0cmluZyxcbiAgICBtYXJnaW46IE9wdGlvbmFsU3RyaW5nLFxuICAgIHBhZGRpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGxldHRlclNwYWNpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGxpbmVIZWlnaHQ6IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICBjb25zdCBFdmVudFR5cGUgPSB6b2Quei5lbnVtKFtcbiAgICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgICBcIkxBWU9VVFwiLFxuICAgIFwiTE9BREVEXCIsXG4gICAgXCJCTFVSXCIsXG4gICAgXCJGT0NVU1wiLFxuICAgIFwiQ0hBTkdFXCIsXG4gICAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gICAgXCJDSEVDS09VVF9TVEFSVEVEXCIsXG4gICAgXCJQQVlNRU5UX0ZMT1dfU1RBUlRFRFwiLFxuICAgIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICAgIFwiQ0hFQ0tPVVRfU1VDQ0VTU1wiLFxuICAgIFwiTE9BRF9FUlJPUlwiLFxuICAgIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICAgIFwiVE9LRU5JWkVfRVJST1JcIixcbiAgICBcIkNIRUNLT1VUX0VSUk9SXCIsXG4gICAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gICAgLy8gRm9ybSAtPiBFbGVtZW50XG4gICAgXCJUT0tFTklaRVwiLFxuICAgIFwiQ0hFQ0tPVVRcIixcbiAgICBcIlNUQVJUX1BBWU1FTlRfRkxPV1wiXG4gIF0pO1xuICBjb25zdCBHZW5lcmljRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVE9LRU5JWkVfU1RBUlRFRFwiLCBcIkNIRUNLT1VUX1NUQVJURURcIl0pO1xuICBjb25zdCBHZW5lcmljRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbiAgY29uc3QgSW5wdXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJCTFVSXCIsIFwiRk9DVVNcIiwgXCJDSEFOR0VcIl0pO1xuICBjb25zdCBJbnB1dEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogSW5wdXRFdmVudFR5cGUsXG4gICAgZWxlbWVudFR5cGU6IFByaXZhdGVGaWVsZE5hbWVFbnVtLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLm9wdGlvbmFsKClcbiAgfSk7XG4gIGNvbnN0IEVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiTE9BRF9FUlJPUlwiLCBcIlRPS0VOSVpFX0VSUk9SXCIsIFwiQ0hFQ0tPVVRfRVJST1JcIl0pO1xuICBjb25zdCBFcnJvckV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogRXJyb3JFdmVudFR5cGUsXG4gICAgbWVzc2FnZTogUmVxdWlyZWRTdHJpbmcsXG4gICAgaGVhZGVyczogem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSk7XG4gIGNvbnN0IFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlLFxuICAgIGVsZW1lbnRUeXBlOiBBbGxGaWVsZE5hbWVzLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICBjb25zdCBMYXlvdXRFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTEFZT1VUKSxcbiAgICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG4gIH0pO1xuICBjb25zdCBMb2FkZWRFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTE9BREVEKSxcbiAgICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICAgIHRvdGFsQW1vdW50QXRvbXM6IHpvZC56Lm51bWJlcigpLFxuICAgIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2RzOiB6b2Quei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QkMSlcbiAgfSk7XG4gIGNvbnN0IFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5QQVlNRU5UX0ZMT1dfU1RBUlRFRCksXG4gICAgbmV4dEFjdGlvbk1ldGFkYXRhOiB6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSxcbiAgICBwYXltZW50Rmxvd01ldGFkYXRhOiB6b2Quei5hbnkoKS5vcHRpb25hbCgpLFxuICAgIHN0YXJ0UEZNZXRhZGF0YTogem9kLnoub3B0aW9uYWwoem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSkpXG4gIH0pO1xuICBjb25zdCBTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSxcbiAgICBwYXltZW50TWV0aG9kSWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBSZXF1aXJlZEZvcm1GaWVsZHMgPSB6b2Quei5vYmplY3Qoe1xuICAgIFtcImZpcnN0TmFtZVwiIC8qIEZJUlNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICBjb25zdCBQUkZvcm1GaWVsZHMgPSB6b2Quei5vYmplY3Qoe1xuICAgIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG4gIH0pO1xuICBjb25zdCBTdWJtaXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRVwiLCBcIkNIRUNLT1VUXCIsIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJdKTtcbiAgY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBTdWJtaXRFdmVudFR5cGUsXG4gICAgc2Vzc2lvbklkOiBSZXF1aXJlZFN0cmluZyxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGE6IHpvZC56LmFueSgpLm9wdGlvbmFsKCksXG4gICAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHpvZC56LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZ1xuICB9KS5leHRlbmQoUmVxdWlyZWRGb3JtRmllbGRzLnNoYXBlKTtcbiAgY29uc3QgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFX1NVQ0NFU1MpLFxuICAgIGlzUmVhZHlGb3JDaGVja291dDogem9kLnouYm9vbGVhbigpXG4gIH0pO1xuICBjb25zdCBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUyksXG4gICAgaW52b2ljZVVybHM6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBzdWJzY3JpcHRpb25JZHM6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBjdXN0b21lcklkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgRXZlbnRQYXlsb2FkID0gem9kLnouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgR2VuZXJpY0V2ZW50UGF5bG9hZCxcbiAgICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgICBFcnJvckV2ZW50UGF5bG9hZCxcbiAgICBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQsXG4gICAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICAgIExvYWRlZEV2ZW50UGF5bG9hZCxcbiAgICBTdWJtaXRFdmVudFBheWxvYWQsXG4gICAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICAgIENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCxcbiAgICBQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQsXG4gICAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbiAgXSk7XG4gIGNvbnN0IEVsZW1lbnRFdmVudCA9IHpvZC56Lm9iamVjdCh7XG4gICAgcGF5bG9hZDogRXZlbnRQYXlsb2FkLFxuICAgIG5vbmNlOiBSZXF1aXJlZFN0cmluZyxcbiAgICBmb3JtSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICAgIGVsZW1lbnRJZDogUmVxdWlyZWRTdHJpbmdcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgYW1vdW50QXRvbTogem9kLnoubnVtYmVyKCksXG4gICAgY3VycmVuY3k6IFJlcXVpcmVkU3RyaW5nXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlY3VyZV90b2tlbjogem9kLnouc3RyaW5nKCksXG4gICAgcHJvbW90aW9uX2NvZGU6IHpvZC56LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2VjdXJlX3Rva2VuOiB6b2Quei5zdHJpbmcoKSxcbiAgICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHBheW1lbnRfbWV0aG9kczogem9kLnouYXJyYXkoUGF5bWVudE1ldGhvZE1pbmltYWwpXG4gIH0pO1xuICBjb25zdCBGaWVsZFZhbGlkYXRpb25FcnJvciA9IHpvZC56Lm9iamVjdCh7XG4gICAgZWxlbWVudFR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlc3Npb25faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBzdWNjZXNzOiB6b2Quei5saXRlcmFsKGZhbHNlKSxcbiAgICBlcnJvcl90eXBlOiB6b2Quei5saXRlcmFsKFwidmFsaWRhdGlvbl9lcnJvclwiKSxcbiAgICBlcnJvcnM6IHpvZC56LmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxuICB9KTtcbiAgY29uc3QgVG9rZW5pemVDYXJkUmVzcG9uc2UgPSB6b2Quei5kaXNjcmltaW5hdGVkVW5pb24oXCJzdWNjZXNzXCIsIFtcbiAgICB6b2Quei5vYmplY3QoeyBzdWNjZXNzOiB6b2Quei5saXRlcmFsKHRydWUpIH0pLFxuICAgIFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2VcbiAgXSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2Vzc2lvbl9pZDogem9kLnouc3RyaW5nKCksXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6b2Quei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZXNzaW9uX2lkOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzXG4gIH0pO1xuICB2YXIgVGhyZWVEU1N0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyAoKFRocmVlRFNTdGF0dXMyKSA9PiB7XG4gICAgVGhyZWVEU1N0YXR1czJbXCJTVUNDRVNTXCJdID0gXCJzdWNjZXNzXCI7XG4gICAgVGhyZWVEU1N0YXR1czJbXCJGQUlMVVJFXCJdID0gXCJmYWlsdXJlXCI7XG4gICAgVGhyZWVEU1N0YXR1czJbXCJDQU5DRUxMRURcIl0gPSBcImNhbmNlbGxlZFwiO1xuICAgIHJldHVybiBUaHJlZURTU3RhdHVzMjtcbiAgfSkoVGhyZWVEU1N0YXR1cyB8fCB7fSk7XG4gIGNvbnN0IFBpbmczRFNTdGF0dXNSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6b2Quei5lbnVtKFtcInN1Y2Nlc3NcIiAvKiBTVUNDRVNTICovLCBcImZhaWx1cmVcIiAvKiBGQUlMVVJFICovLCBcImNhbmNlbGxlZFwiIC8qIENBTkNFTExFRCAqL10pXG4gIH0pO1xuICBjb25zdCBDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIHJlZGlyZWN0X3VybDogem9kLnouc3RyaW5nKCksXG4gICAgaW5pdGlhbF9pbnRlbnRfaWQ6IHpvZC56LnN0cmluZygpLFxuICAgIGNvbnNlbnRfaWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuXG4gIGNvbnN0IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZCA9IChlcnJvcikgPT4ge1xuICAgIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMoZXJyb3IpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZS5fZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpc3N1ZXNQZXJGaWVsZDtcbiAgfTtcblxuICBjb25zdCBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogem9kLnouc3RyaW5nKCksXG4gICAgY2xpZW50X3NlY3JldDogem9kLnouc3RyaW5nKCksXG4gICAgc3RyaXBlX3BtX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LnN0cmluZygpLFxuICAgIGNsaWVudF9zZWNyZXQ6IHpvZC56LnN0cmluZygpLFxuICAgIHN0cmlwZV9wazogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IG91ckN1cnJlbmN5VG9UaGVpcnMgPSB7XG4gICAgdXNkOiBcInVzZFwiLFxuICAgIGJybDogXCJicmxcIlxuICB9O1xuICBjb25zdCBnZXRMb2FkZWRTdHJpcGUgPSBhc3luYyAocHVibGlzaGFibGVLZXkpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzU3RyaXBlSnNQcmVzZW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaXBlID0gbmV3IFN0cmlwZShwdWJsaXNoYWJsZUtleSk7XG4gICAgcmV0dXJuIHN0cmlwZTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICAgIGNvbnN0IHBheW1lbnRSZXF1ZXN0ID0gc3RyaXBlLnBheW1lbnRSZXF1ZXN0KHtcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHN0cmlwZSBhY2NvdW50IGNvdW50cnkgYXMgc29vbiBhcyB3ZSBzdXBwb3J0IGl0XG4gICAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgICBjdXJyZW5jeTogc3RyaXBlQ3VycmVuY3ksXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgICBhbW91bnQ6IHRvdGFsQW1vdW50QXRvbSxcbiAgICAgICAgcGVuZGluZzogaXNBbW91bnRQZW5kaW5nXG4gICAgICB9LFxuICAgICAgcmVxdWVzdFBheWVyTmFtZTogdHJ1ZSxcbiAgICAgIHJlcXVlc3RQYXllckVtYWlsOiB0cnVlLFxuICAgICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICAgIH0pO1xuICAgIHJldHVybiBwYXltZW50UmVxdWVzdDtcbiAgfTtcbiAgY29uc3Qgc2xlZXAgPSAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIlN0cmlwZVwiIGluIHdpbmRvdztcbiAgfTtcbiAgY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2dCk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gICAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5leHQgYWN0aW9uIG1ldGFkYXRhIGZvcm1hdDogJHtKU09OLnN0cmluZ2lmeShuZXh0QWN0aW9uTWV0YWRhdGEpfWApO1xuICAgIH1cbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICAgIH0pO1xuICAgIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgZmFpbGVkOiAke2NvbmZpcm1SZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgdW5rbm93bmB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpcm1SZXN1bHQ7XG4gIH07XG4gIGNvbnN0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cgPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgICAgcGF5bWVudF9tZXRob2Q6IG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcG1faWRcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHRTdGF0dXMgPSBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5zdGF0dXM7XG4gICAgaWYgKHJlc3VsdFN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikgOyBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IGNhbmNlbGxlZCwgcGxlYXNlIGNsaWNrIFN1Ym1pdCBhZ2FpbiB0byBwYXlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtjb25maXJtUmVzdWx0LmVycm9yPy5tZXNzYWdlID8/IGNvbmZpcm1SZXN1bHQuc2V0dXBJbnRlbnQ/Lmxhc3Rfc2V0dXBfZXJyb3I/Lm1lc3NhZ2UgPz8gXCJQYXltZW50IGZhaWxlZCwgcGxlYXNlIGNsaWNrIHN1Ym1pdCBhZ2FpbiB0byBwYXkuXCJ9YFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcgPSAoc3R5bGVzKSA9PiB7XG4gICAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRTdHlsZXM7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gICAgY29uc3QgaW5jbHVkZWRJbnB1dHMgPSBBcnJheS5mcm9tKGZvcm1EaXYucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLW9waWRdXCIpID8/IFtdKTtcbiAgICBjb25zdCBleHRyYURhdGEgPSBpbmNsdWRlZElucHV0cy5yZWR1Y2UoKGFjYywgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm4gYWNjO1xuICAgICAgcmV0dXJuIHsgLi4uYWNjLCBba2V5XTogaW5wdXQudmFsdWUgfTtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIGV4dHJhRGF0YTtcbiAgfTtcbiAgY29uc3QgcGFyc2VFdmVudFBheWxvYWQgPSAoZXZlbnREYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBFbGVtZW50RXZlbnQucGFyc2UoZXZlbnREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG5vbmNlOiB1dWlkLnY0KCksXG4gICAgICBmb3JtSWQsXG4gICAgICBlbGVtZW50SWRcbiAgICB9O1xuICAgIHRhcmdldC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShldmVudCksIGJhc2VVcmwpO1xuICB9O1xuXG4gIGNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb2JqLnNlbmQocGluZyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICAgIHJldHVybiAhIW9iaiAmJiBpc1ZhbGlkO1xuICB9O1xuXG4gIGNvbnN0IG51bGxPclVuZGVmT3IgPSAoelR5cGUpID0+IHpvZC56Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuICB6b2Quei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG4gIGNvbnN0IENERVJlc3BvbnNlRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNkZV9yZXNwb25zZV90eXBlOiB6b2Quei5saXRlcmFsKFwiZXJyb3JcIiksXG4gICAgbWVzc2FnZTogem9kLnouc3RyaW5nKCksXG4gICAgaGVhZGVyczogem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICB9KTtcbiAgem9kLnouZW51bShbXCJ1c2RcIiwgXCJicmxcIl0pO1xuICBjb25zdCBDb3Vwb25NaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBuYW1lOiB6b2Quei5zdHJpbmcoKSxcbiAgICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkpLFxuICAgIHBlcmNlbnRfb2ZmOiBudWxsT3JVbmRlZk9yKHpvZC56Lm51bWJlcigpKSxcbiAgICBjdXJyZW5jeTogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgZHVyYXRpb246IHpvZC56LnN0cmluZygpLFxuICAgIGR1cmF0aW9uX2luX21vbnRoczogbnVsbE9yVW5kZWZPcih6b2Quei5udW1iZXIoKSlcbiAgfSk7XG4gIGNvbnN0IExpbmVJdGVtID0gem9kLnoub2JqZWN0KHtcbiAgICBhbW91bnRfc3VidG90YWxfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgYW1vdW50X3RvdGFsX2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBkZXNjcmlwdGlvbjogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgcHJpY2VfaWQ6IHpvZC56LnN0cmluZygpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkuaW50KCkpLFxuICAgIHF1YW50aXR5OiB6b2Quei5udW1iZXIoKS5pbnQoKVxuICB9KTtcbiAgY29uc3QgQnJhbmRTZXR0aW5ncyA9IHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpO1xuICBjb25zdCBCcmFuZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgbmFtZTogem9kLnouc3RyaW5nKCksXG4gICAgc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoQnJhbmRTZXR0aW5ncylcbiAgfSk7XG4gIGNvbnN0IENoZWNrb3V0UGF5bWVudE1ldGhvZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPcih6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIGNvbnN0IFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBxdWFudGl0eTogem9kLnoubnVtYmVyKClcbiAgfSk7XG4gIGNvbnN0IFN1YnNjcmlwdGlvbk1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGlkOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHpvZC56Lm51bWJlcigpLmludCgpKSxcbiAgICBzdWJzY3JpcHRpb25faXRlbXM6IHpvZC56LmFycmF5KFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsKSxcbiAgICB0cmlhbF9zdGFydDogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgdHJpYWxfZW5kOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBhbW91bnRfYXRvbTogem9kLnoubnVtYmVyKClcbiAgfSk7XG4gIGNvbnN0IEludm9pY2VMaW5lSXRlbU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGFtb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICBhbW91bnRfYXRvbV9jb25zaWRlcmluZ19kaXNjb3VudF9hcHBsaWVkOiB6b2Quei5udW1iZXIoKSxcbiAgICBjdXJyZW5jeTogem9kLnouc3RyaW5nKCksXG4gICAgZGlzY291bnRfYW1vdW50X2F0b21zOiB6b2Quei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpLFxuICAgIHN1YnNjcmlwdGlvbl9pdGVtX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgRGlzY291bnRNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBjb3Vwb246IENvdXBvbk1pbmltYWxcbiAgfSk7XG4gIGNvbnN0IEludm9pY2VNaW5pbWFsID0gem9kLnoub2JqZWN0KHtcbiAgICBjdXJyZW5jeTogem9kLnouc3RyaW5nKCksXG4gICAgZGlzY291bnRzOiB6b2Quei5hcnJheShEaXNjb3VudE1pbmltYWwpLFxuICAgIGhvc3RlZF9pbnZvaWNlX3VybDogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgbGluZXM6IHpvZC56LmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICAgIHJlbWFpbmluZ19hbW91bnRfYXRvbTogem9kLnoubnVtYmVyKCksXG4gICAgdGF4X2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICB0b3RhbF9hbW91bnRfYXRvbTogem9kLnoubnVtYmVyKCksXG4gICAgdG90YWxfZGlzY291bnRfYW1vdW50X2F0b21zOiB6b2Quei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpXG4gIH0pO1xuICBjb25zdCBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNyZWF0ZWQ6IHpvZC56LmFycmF5KFN1YnNjcmlwdGlvbk1pbmltYWwpLFxuICAgIGludm9pY2VzOiB6b2Quei5hcnJheShJbnZvaWNlTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IFByZXZpZXdDaGVja291dFJlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBwcmV2aWV3OiBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwsXG4gICAgcHJldmlld19wb3N0X3RyaWFsOiBudWxsT3JVbmRlZk9yKENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCksXG4gICAgY291cG9uczogem9kLnouYXJyYXkoQ291cG9uTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0YXR1czogem9kLnoubGl0ZXJhbChcIm9wZW5cIiksXG4gICAgdG9rZW46IHpvZC56LnN0cmluZygpLFxuICAgIGVtYWlsOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBsaW5lX2l0ZW1zOiB6b2Quei5hcnJheShMaW5lSXRlbSksXG4gICAgYW1vdW50X3N1YnRvdGFsX2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGFtb3VudF90b3RhbF9hdG9tOiB6b2Quei5udW1iZXIoKS5pbnQoKSxcbiAgICBicmFuZDogQnJhbmQsXG4gICAgc3Vic19wcmV2aWV3OiBudWxsT3JVbmRlZk9yKFByZXZpZXdDaGVja291dFJlc3BvbnNlKSxcbiAgICAvLyBOdWxsIGluIHNldHVwIG1vZGVcbiAgICBtZXRob2RzX2F2YWlsYWJsZTogem9kLnouYXJyYXkoQ2hlY2tvdXRQYXltZW50TWV0aG9kKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudEZvcm1QcmVmaWxsID0gem9kLnouZGlzY3JpbWluYXRlZFVuaW9uKFwibW9kZVwiLCBbXG4gICAgem9kLnoub2JqZWN0KHtcbiAgICAgIG1vZGU6IHpvZC56LmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICAgIGN1cnJlbmN5OiB6b2Quei5udWxsYWJsZSh6b2Quei51bmRlZmluZWQoKSlcbiAgICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSksXG4gICAgem9kLnoub2JqZWN0KHtcbiAgICAgIG1vZGU6IHpvZC56LmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgICBjdXJyZW5jeTogem9kLnouc3RyaW5nKClcbiAgICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSlcbiAgXSk7XG4gIGNvbnN0IENvbXBsZXRlZEZvcm1QcmVmaWxsID0gem9kLnoub2JqZWN0KHtcbiAgICBzdGF0dXM6IHpvZC56LmxpdGVyYWwoXCJjb21wbGV0ZVwiKVxuICB9KTtcbiAgY29uc3QgRXhwaXJlZEZvcm1QcmVmaWxsID0gem9kLnoub2JqZWN0KHtcbiAgICBzdGF0dXM6IHpvZC56LmxpdGVyYWwoXCJleHBpcmVkXCIpXG4gIH0pO1xuICB6b2Quei51bmlvbihbUGF5bWVudEZvcm1QcmVmaWxsLCBDb21wbGV0ZWRGb3JtUHJlZmlsbCwgRXhwaXJlZEZvcm1QcmVmaWxsXSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgbG9nbzogem9kLnouc3RyaW5nKCksXG4gICAgaWNvbjogem9kLnouc3RyaW5nKCksXG4gICAgcHJpbWFyeV9jb2xvcjogem9kLnouc3RyaW5nKCksXG4gICAgc2Vjb25kYXJ5X2NvbG9yOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3QgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIGludm9pY2VfdXJsczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIHN1YnNjcmlwdGlvbl9pZHM6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBjdXN0b21lcl9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2VjdXJlX3Rva2VuOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwYXltZW50X2lucHV0OiB6b2Quei5hbnkoKSxcbiAgICAvLyBTaG91bGQgZm9sbG93IEFueVBheW1lbnRJbnB1dCBmcm9tIENERVxuICAgIGN1c3RvbWVyX2VtYWlsOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjdXN0b21lcl96aXBfY29kZTogem9kLnouc3RyaW5nKCksXG4gICAgY3VzdG9tZXJfY291bnRyeTogem9kLnouc3RyaW5nKCksXG4gICAgbGluZV9pdGVtczogem9kLnouYXJyYXkoTGluZUl0ZW0pLFxuICAgIHRvdGFsX2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKS5pbnQoKSxcbiAgICBjYW5jZWxfYXRfZW5kOiB6b2Quei5ib29sZWFuKCksXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBwcm9tb3Rpb25fY29kZTogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6b2Quei5ib29sZWFuKCkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgU2V0dXBDaGVja291dFJlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBwYXltZW50X21ldGhvZF9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgaWQ6IHpvZC56LnN0cmluZygpLFxuICAgIHJldHVybl91cmw6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgbG9jOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgbXNnOiB6b2Quei5zdHJpbmcoKSxcbiAgICB1cmw6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICB6b2Quei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvcik7XG4gIGNvbnN0IFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6b2Quei5hcnJheSh6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgZmllbGRzOiBQUkZvcm1GaWVsZHMsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2Vzc2lvbl9pZDogem9kLnouc3RyaW5nKCksXG4gICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzLFxuICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgfSk7XG4gIGNvbnN0IFN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICByZXF1aXJlZF91c2VyX2FjdGlvbnM6IHpvZC56LmFycmF5KHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKSxcbiAgICBjY19wbV9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56LnJlY29yZCh6b2Quei5hbnkoKSk7XG5cbiAgY29uc3Qgc3VtID0gKGFycikgPT4ge1xuICAgIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZml4UHJvdG8odGFyZ2V0LCBwcm90b3R5cGUpIHtcbiAgICB2YXIgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4gICAgc2V0UHJvdG90eXBlT2YgPyBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSkgOiB0YXJnZXQuX19wcm90b19fID0gcHJvdG90eXBlO1xuICB9XG4gIGZ1bmN0aW9uIGZpeFN0YWNrKHRhcmdldCwgZm4pIHtcbiAgICBpZiAoZm4gPT09IHZvaWQgMCkge1xuICAgICAgZm4gPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgdmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG4gICAgY2FwdHVyZVN0YWNrVHJhY2UgJiYgY2FwdHVyZVN0YWNrVHJhY2UodGFyZ2V0LCBmbik7XG4gIH1cblxuICB2YXIgX19leHRlbmRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgICAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgICBfX3Byb3RvX186IFtdXG4gICAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZC5fX3Byb3RvX18gPSBiO1xuICAgICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcblxuICAgICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICAgIGZ1bmN0aW9uIF9fKCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICAgIH1cblxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gIH0oKTtcblxuICB2YXIgQ3VzdG9tRXJyb3IgPSBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbUVycm9yLCBfc3VwZXIpO1xuXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlLCBvcHRpb25zKSB8fCB0aGlzO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX3RoaXMsICduYW1lJywge1xuICAgICAgICB2YWx1ZTogX25ld1RhcmdldC5uYW1lLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGZpeFByb3RvKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICBmaXhTdGFjayhfdGhpcyk7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIEN1c3RvbUVycm9yO1xuICB9KEVycm9yKTtcblxuICBjbGFzcyBDZGVFcnJvciBleHRlbmRzIEN1c3RvbUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgICAgY29uc3QgZnJpZW5kbHlNZXNzYWdlID0gYFtjZGUtY2xpZW50XSBFcnJvciBxdWVyeWluZyBDREU6ICR7cmVzcG9uc2UubWVzc2FnZX1gO1xuICAgICAgc3VwZXIoZnJpZW5kbHlNZXNzYWdlKTtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB9XG4gICAgZ2V0IG9yaWdpbmFsRXJyb3JNZXNzYWdlKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UubWVzc2FnZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcXVlcnlDREUgPSBhc3luYyAoY2RlQ29ubiwgZGF0YSwgcmVzcG9uc2VTY2hlbWEpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNkZUNvbm4uc2VuZChkYXRhKTtcbiAgICBpZiAoaXNDREVSZXNwb25zZUVycm9yKHJlc3BvbnNlKSkge1xuICAgICAgdGhyb3cgbmV3IENkZUVycm9yKHJlc3BvbnNlKTtcbiAgICB9XG4gICAgaWYgKCFjaGVja0lmQ29uZm9ybXNUb1NjaGVtYShyZXNwb25zZSwgcmVzcG9uc2VTY2hlbWEpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UocmVzcG9uc2UpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlXCIpO1xuICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH07XG4gIGNvbnN0IGNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hID0gKHZhbHVlLCBzY2hlbWEpID0+IHtcbiAgICByZXR1cm4gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2VzcztcbiAgfTtcbiAgY29uc3QgaXNDREVSZXNwb25zZUVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuIENERVJlc3BvbnNlRXJyb3Iuc2FmZVBhcnNlKHJlc3BvbnNlKS5zdWNjZXNzO1xuICB9O1xuICBjb25zdCBnZXRDaGVja291dFByZXZpZXcgPSBhc3luYyAoY2RlQ29ubiwgcmVxdWVzdCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X2NoZWNrb3V0X3ByZXZpZXdcIiwgcGF5bG9hZDogcmVxdWVzdCB9LCBQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IGdldFByZWZpbGwgPSBhc3luYyAoY2RlQ29ubikgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X3ByZWZpbGxcIiwgcGF5bG9hZDoge30gfSwgUGF5bWVudEZvcm1QcmVmaWxsKTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvckNDID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInN0YXJ0X3BheW1lbnRfZmxvd19mb3JfY2NcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUiA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX3ByXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgfTtcbiAgY29uc3QgY29uZmlybVBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImNvbmZpcm1fcGF5bWVudF9mbG93XCIsIHBheWxvYWQgfSwgQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBnZXRDaGVja291dFZhbHVlID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpID0+IHtcbiAgICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXcoY2RlQ29ubiwge1xuICAgICAgc2VjdXJlX3Rva2VuOiBzZWN1cmVUb2tlbixcbiAgICAgIHByb21vdGlvbl9jb2RlOiBwcm9tb0NvZGVcbiAgICB9KTtcbiAgICBjb25zdCBjdXJyZW5jaWVzID0gbmV3IFNldChjaGVja291dFByZXZpZXcucHJldmlldy5pbnZvaWNlcy5tYXAoKGludikgPT4gaW52LmN1cnJlbmN5KSk7XG4gICAgaWYgKGN1cnJlbmNpZXMuc2l6ZSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBjdXJyZW5jeSwgZ290ICR7Y3VycmVuY2llcy5zaXplfWApO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IFwidXNkXCI7XG4gICAgY29uc3QgYW1vdW50QXRvbSA9IHN1bShjaGVja291dFByZXZpZXcucHJldmlldy5pbnZvaWNlcy5tYXAoKGludikgPT4gaW52LnJlbWFpbmluZ19hbW91bnRfYXRvbSkpO1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW5jeSxcbiAgICAgIGFtb3VudEF0b21cbiAgICB9O1xuICB9O1xuICBjb25zdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIGlzU2V0dXBNb2RlLCBwcm9tb0NvZGUpID0+IHtcbiAgICBpZiAoaXNTZXR1cE1vZGUpIHtcbiAgICAgIHJldHVybiB7IGFtb3VudEF0b206IDAsIGN1cnJlbmN5OiBcInVzZFwiIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21vQ29kZSA9ICFwcm9tb0NvZGUgPyB2b2lkIDAgOiBwcm9tb0NvZGU7XG4gICAgICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFZhbHVlKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpO1xuICAgICAgcmV0dXJuIHsgYW1vdW50QXRvbTogY2hlY2tvdXRQcmV2aWV3LmFtb3VudEF0b20sIGN1cnJlbmN5OiBjaGVja291dFByZXZpZXcuY3VycmVuY3kgfTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMgPSBhc3luYyAoYWxsQ2RlQ29ubmVjdGlvbnMsIHBheWxvYWQpID0+IHtcbiAgICBpZiAoYWxsQ2RlQ29ubmVjdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIEFycmF5LmZyb20oYWxsQ2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpLm1hcChcbiAgICAgICAgKGNkZUNvbm4pID0+IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ0b2tlbml6ZV9jYXJkXCIsIHBheWxvYWQgfSwgVG9rZW5pemVDYXJkUmVzcG9uc2UpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2VzO1xuICB9O1xuICBjb25zdCBjaGVja291dENhcmRFbGVtZW50cyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRfY2FyZF9lbGVtZW50c1wiLCBwYXlsb2FkIH0sIENoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXR1cENoZWNrb3V0ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInNldHVwX3BheW1lbnRfbWV0aG9kXCIsIHBheWxvYWQgfSwgU2V0dXBDaGVja291dFJlc3BvbnNlKTtcbiAgfTtcbiAgY29uc3QgcGVyZm9ybUNoZWNrb3V0ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImNoZWNrb3V0XCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBDREVfUE9MTElOR19JTlRFUlZBTCA9IDFlMztcbiAgY29uc3QgcGluZ0NkZUZvcjNkc1N0YXR1cyA9IGFzeW5jIChpZnJhbWUsIGNoaWxkT3JpZ2luKSA9PiB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHBlbnBhbC5jb25uZWN0VG9DaGlsZCh7XG4gICAgICBpZnJhbWUsXG4gICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgIHRpbWVvdXQ6IENERV9QT0xMSU5HX0lOVEVSVkFMLFxuICAgICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgICAvLyBUT0RPOiB1c2Ugd2l0aCBwcm9wZXIgY2hpbGRPcmlnaW5cbiAgICB9KTtcbiAgICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5Q0RFKGNvbm5lY3Rpb25PYmosIHsgdHlwZTogXCJwaW5nLTNkcy1zdGF0dXNcIiB9LCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UpO1xuICAgIHJldHVybiByZXN1bHQuc3RhdHVzO1xuICB9O1xuXG4gIGNvbnN0IHN0eWxlcyA9IFwiQGtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOSl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZSgxKX19Lm92ZXJsYXl7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoyMTQ3NDgzNjQ4IWltcG9ydGFudDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwODB9LmNvbnRhaW5lcnttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtwb3NpdGlvbjpyZWxhdGl2ZTthbmltYXRpb246ZmFkZUluIC4zcyBlYXNlLW91dH0uZnJhbWV7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6bm9uZX0uY2FuY2VsLWJ1dHRvbntwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dG9wOi0xLjVyZW07cGFkZGluZzowO3JpZ2h0OjB9XCI7XG5cbiAgY29uc3QgY3JlYXRlQW5kT3BlbkZyYW1lID0gKHVybCkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGBcbiAgICA8c3R5bGU+XG4gICAgICAke3N0eWxlc31cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxpZnJhbWUgc3JjPVwiJHt1cmx9XCIgY2xhc3M9XCJmcmFtZVwiIGlkPVwidGhyZWUtZHMtaWZyYW1lXCIgdGl0bGU9XCIzRCBTZWN1cmUgdmVyaWZpY2F0aW9uXCIgYWxsb3c9XCJwYXltZW50XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb25zdCBzaGFkb3dSb290ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICBjb25zdCBpZnJhbWUgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCIjdGhyZWUtZHMtaWZyYW1lXCIpO1xuICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gICAgcmV0dXJuIHsgaG9zdCwgaWZyYW1lLCBjYW5jZWxCdXR0b24gfTtcbiAgfTtcblxuICBmdW5jdGlvbiBzdGFydFBvbGxpbmcoaWZyYW1lLCBvblN1Y2Nlc3MsIGNoaWxkT3JpZ2luKSB7XG4gICAgY29uc3QgaGFuZGxlUG9sbGluZyA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHBpbmdDZGVGb3IzZHNTdGF0dXMoaWZyYW1lLCBjaGlsZE9yaWdpbik7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgICAgb25TdWNjZXNzKHN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB9XG4gICAgfTtcbiAgICBoYW5kbGVQb2xsaW5nKCk7XG4gICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwoaGFuZGxlUG9sbGluZywgQ0RFX1BPTExJTkdfSU5URVJWQUwpO1xuICAgIHJldHVybiBwb2xsaW5nSW50ZXJ2YWw7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlRXZlbnRzKHtcbiAgICBlbGVtZW50cyxcbiAgICBwb2xsaW5nSW50ZXJ2YWwsXG4gICAgcmVzb2x2ZVxuICB9KSB7XG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICAgIHJlc29sdmUoVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpO1xuICAgIH07XG4gICAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgIGVsZW1lbnRzLmNhbmNlbEJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2FuY2VsKTtcbiAgICB9O1xuICAgIHJldHVybiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnQzZHNWZXJpZmljYXRpb24oe1xuICAgIHVybCxcbiAgICBiYXNlVXJsXG4gIH0pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZUFuZE9wZW5GcmFtZSh1cmwpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKHN0YXR1cykgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgICAgICB9LCAxZTMpO1xuICAgICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICAgIGNsZWFudXBFdmVudExpc3RlbmVycz8uKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc3RhcnRQb2xsaW5nKGVsZW1lbnRzLmlmcmFtZSwgb25TdWNjZXNzLCBuZXcgVVJMKGJhc2VVcmwpLm9yaWdpbik7XG4gICAgICBjb25zdCBjbGVhbnVwRXZlbnRMaXN0ZW5lcnMgPSBoYW5kbGVFdmVudHMoe1xuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgcG9sbGluZ0ludGVydmFsLFxuICAgICAgICByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzID0gKHNpbXBsZU9qc0Zsb3cpID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgICAgY29uc3QgZmxvd1Jlc3VsdCA9IGF3YWl0IHNpbXBsZU9qc0Zsb3cocGFyYW1zKTtcbiAgICAgICAgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGZsb3dSZXN1bHQucmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkKTtcbiAgICAgICAgfSBlbHNlIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwiY2hlY2tvdXRcIikge1xuICAgICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdWNjZXNzKFxuICAgICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuaW52b2ljZV91cmxzLFxuICAgICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LmN1c3RvbWVyX2lkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBtb2RlOiAke2Zsb3dSZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRFcnJvcihnZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbml0KHBhcmFtcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCB7IGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZXJyb3ItY2F0Y2hlclwiKTtcbiAgICAgICAgZXJyX18oZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSB9O1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGNvbnN0IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzID0gKHByZWZpeCkgPT4ge1xuICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmxvZyhgJHtjaGFsay5ncmVlbi5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIGNvbnN0IGVyciA9ICguLi5hcmdzKSA9PiB7XG4gICAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmVycm9yKGAke2NoYWxrLnJlZC5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBsb2csXG4gICAgICBlcnIsXG4gICAgICBsb2dfXzogbG9nLFxuICAgICAgZXJyX186IGVyclxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kMywgZXJyX186IGVycl9fJDQgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuICBjb25zdCB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyA9IChub25DZGVGb3JtSW5wdXRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBSZXF1aXJlZEZvcm1GaWVsZHMuc2FmZVBhcnNlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICAgIGlmICghcGF5bG9hZC5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yc10gb2YgT2JqZWN0LmVudHJpZXMoaXNzdWVzKSkge1xuICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgIH1cbiAgICAgIGVycl9fJDQoYEdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzYCwgaXNzdWVzKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZC5kYXRhO1xuICB9O1xuICBjb25zdCB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMgPSAodG9rZW5pemVSZXN1bHRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgIGZvciAoY29uc3QgdG9rZW5pemVSZXN1bHQgb2YgdG9rZW5pemVSZXN1bHRzKSB7XG4gICAgICBpZiAodG9rZW5pemVSZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdG9rZW5pemVSZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gQWxsRmllbGROYW1lcy5zYWZlUGFyc2UoZXJyb3IuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGVycl9fJDQoYFVua25vd24gZmllbGQgbmFtZSBpbiBvblZhbGlkYXRpb25FcnJvcjogJHtlcnJvci5lbGVtZW50VHlwZX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gcGFyc2VkLmRhdGE7XG4gICAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9yLmVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9nX18kMyhgRXJyb3IgdG9rZW5pemluZyBjYXJkOiBnb3QgdmFsaWRhdGlvbiBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5pemVSZXN1bHQuZXJyb3JzKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIHdoaWxlIHRva2VuaXppbmcgY2FyZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgeyBlcnJfXzogZXJyX18kMyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tbW9uXCIpO1xuICBjb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke3Jlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBheW1lbnRfbWV0aG9kX2lkOiByZXNwb25zZS5wYXltZW50X21ldGhvZHNbMF0uaWQgfTtcbiAgfTtcbiAgY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICAgIGNvbnN0IGNwbSA9IGFsbENQTXMuZmluZCgoY3BtMikgPT4gem9kTW9kZWwuc2FmZVBhcnNlKGNwbTIpLnN1Y2Nlc3MpO1xuICAgIGlmICghY3BtKSB7XG4gICAgICBlcnJfXyQzKGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbCAke3pvZE1vZGVsfWApO1xuICAgICAgZXJyX18kMyhhbGxDUE1zKTtcbiAgICAgIGVycl9fJDMoYHpvZE1vZGVsYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsICR7em9kTW9kZWx9YCk7XG4gICAgfVxuICAgIHJldHVybiB6b2RNb2RlbC5wYXJzZShjcG0pO1xuICB9O1xuXG4gIGNvbnN0IHsgbG9nX186IGxvZ19fJDIsIGVycl9fOiBlcnJfXyQyIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbiAgY29uc3QgeyBsb2dfXzogc3RyaXBlTG9nX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLWNjXCIpO1xuICBjb25zdCBydW5Db21tb25DY0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgICBhc3luYyAoeyBjb250ZXh0LCBjaGVja291dFBheW1lbnRNZXRob2QsIG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgICAgbG9nX18kMihg4pScIFJ1bm5pbmcgY29tbW9uIENDIGZsb3cuLi5gLCB7IGNoZWNrb3V0UGF5bWVudE1ldGhvZCB9KTtcbiAgICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgICBsb2dfXyQyKGDilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzIFtNb2RlOiAke3ByZWZpbGwubW9kZX1dYCk7XG4gICAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0Mobm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgICBsb2dfXyQyKGDilJwgVG9rZW5pemluZyBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgICAgY29uc3QgdG9rZW5pemVDYXJkUmVzdWx0cyA9IGF3YWl0IHRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMoY29udGV4dC5jZGVDb25uZWN0aW9ucywge1xuICAgICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkXG4gICAgICB9KTtcbiAgICAgIHZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyh0b2tlbml6ZUNhcmRSZXN1bHRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGNvbnN0IGNvbW1vbkNoZWNrb3V0UGFyYW1zID0ge1xuICAgICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBub25DZGVGb3JtRmllbGRzXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgbG9nX18kMihg4pScIFNldHRpbmcgdXAgcGF5bWVudCBtZXRob2QgaW4gQ0RFIFtUb2tlbjogJHtwcmVmaWxsLnRva2VufV1gKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXR1cENoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7cmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdCB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBJbml0aWFsIGNoZWNrb3V0IGZsb3cuIENoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDZGVFcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5vcmlnaW5hbEVycm9yTWVzc2FnZSA9PT0gXCIzRFNfUkVRVUlSRURcIikge1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENhcmQgcmVxdWlyZXMgM0RTLCBzdGFydGluZyBub24tbGVnYWN5IHBheW1lbnQgZmxvd2ApO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkVXNlTmV3RmxvdyA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnM/LltcIm9wLXNob3VsZC11c2UtbmV3LWZsb3dcIl0gPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQZlJlc3VsdCA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgb3Atc2hvdWxkLXVzZS1uZXctZmxvdzogJHtzaG91bGRVc2VOZXdGbG93fWApO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIFBheW1lbnQgZmxvdyByZXN1bHQ6YCwgc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXNlTmV3Rmxvdykge1xuICAgICAgICAgICAgICBhd2FpdCBjb21tb25DQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCwgY29udGV4dC5iYXNlVXJsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHN0cmlwZUNDM0RTRmxvdyhzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybWluZyBwYXltZW50IGZsb3cgW2NjX3BtX2lkOiAke3N0YXJ0UGZSZXN1bHQuY2NfcG1faWR9XWApO1xuICAgICAgICAgICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHQgcmVjZWl2ZWQgUmVzdWx0OmAsIGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtjcmVhdGVkUGF5bWVudE1ldGhvZC5wYXltZW50X21ldGhvZF9pZH1dYCk7XG4gICAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nX18kMihg4pScIENoZWNraW5nIG91dCBhZnRlciAzRFMgZmxvdyBbRmxvdzogJHtzaG91bGRVc2VOZXdGbG93ID8gXCJuZXdcIiA6IFwibGVnYWN5XCJ9XWApO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgLi4uY29tbW9uQ2hlY2tvdXRQYXJhbXMsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWQsXG4gICAgICAgICAgICAgICAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogIXNob3VsZFVzZU5ld0Zsb3dcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlcnJfXyQyKGDilbAgRXJyb3IgY2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREVgKTtcbiAgICAgICAgZXJyX18kMihlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgY29uc3QgcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBzdHJpcGVBY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJzdHJpcGVfM2RzXCIpO1xuICAgIGlmICghc3RyaXBlQWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdHJpcGUgM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShzdHJpcGVBY3Rpb24pO1xuICB9O1xuICBjb25zdCBwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IGNvbW1vbkFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIik7XG4gICAgaWYgKCFjb21tb25BY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbW1vbiAzRFMgYWN0aW9uIGZvdW5kXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKGNvbW1vbkFjdGlvbik7XG4gIH07XG4gIGNvbnN0IGNvbW1vbkNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0LCBiYXNlVXJsKSA9PiB7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gICAgbG9nX18kMihg4pScIFVzaW5nIGNvbW1vbiAzRFMgZmxvdyBbVVJMOiAke25leHRBY3Rpb25NZXRhZGF0YS5yZWRpcmVjdF91cmx9XWApO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiBuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsLCBiYXNlVXJsIH0pO1xuICAgIGxvZ19fJDIoYOKVsCAzRFMgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke3N0YXR1c31dYCk7XG4gICAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gY2FuY2VsbGVkXCIpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBUaHJlZURTU3RhdHVzLkZBSUxVUkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc3RyaXBlQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQpID0+IHtcbiAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YShzdGFydFBmUmVzdWx0KTtcbiAgICBzdHJpcGVMb2dfXyhg4pScIFVzaW5nIHN0cmlwZSAzRFMgZmxvdyBbQ2xpZW50IFNlY3JldDogJHtuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldC5zdWJzdHJpbmcoMCwgOCl9Li4uXWApO1xuICAgIGF3YWl0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cobmV4dEFjdGlvbk1ldGFkYXRhKTtcbiAgICBzdHJpcGVMb2dfXyhcIuKVsCBTdHJpcGUgM0RTIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgfTtcblxuICBjb25zdCB7IGxvZ19fOiBsb2dfXyQxLCBlcnJfXzogZXJyX18kMSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtcHJcIik7XG4gIGNvbnN0IFN0cmlwZVByQ3BtID0gem9kLnoub2JqZWN0KHtcbiAgICBwcm92aWRlcjogem9kLnoudW5pb24oW3pvZC56LmxpdGVyYWwoXCJhcHBsZV9wYXlcIiksIHpvZC56LmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpXSksXG4gICAgcHJvY2Vzc29yX25hbWU6IHpvZC56LmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gICAgbWV0YWRhdGE6IHpvZC56Lm9iamVjdCh7XG4gICAgICBzdHJpcGVfcGs6IHpvZC56LnN0cmluZygpXG4gICAgfSlcbiAgfSk7XG4gIGNvbnN0IGluaXRTdHJpcGVQckZsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICAgIGFzeW5jICh7IGNvbnRleHQgfSkgPT4ge1xuICAgICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICAgIGNvbnN0IGNoZWNrb3V0UGF5bWVudE1ldGhvZCA9IGZpbmRDcG1NYXRjaGluZ1R5cGUoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBTdHJpcGVQckNwbSk7XG4gICAgICBsb2dfXyQxKGBJbml0aWFsaXppbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgICBjb25zdCBpc1NldHVwTW9kZSA9IHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiO1xuICAgICAgbG9nX18kMShgR2V0dGluZyBpbml0aWFsIHByZXZpZXcgYW1vdW50YCk7XG4gICAgICBjb25zdCBpbml0aWFsUHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChhbnlDZGVDb25uZWN0aW9uLCBwcmVmaWxsLnRva2VuLCBpc1NldHVwTW9kZSwgdm9pZCAwKTtcbiAgICAgIGNvbnN0IHByID0gYXdhaXQgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QoXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZC5tZXRhZGF0YS5zdHJpcGVfcGssXG4gICAgICAgIGluaXRpYWxQcmV2aWV3LmFtb3VudEF0b20sXG4gICAgICAgIGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgICBpc1NldHVwTW9kZVxuICAgICAgKTtcbiAgICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIGNhbiBtYWtlIHBheW1lbnRgKTtcbiAgICAgIGNvbnN0IGNhbk1ha2VQYXltZW50ID0gYXdhaXQgcHIuY2FuTWFrZVBheW1lbnQoKTtcbiAgICAgIGlmIChjYW5NYWtlUGF5bWVudCA9PT0gbnVsbCkge1xuICAgICAgICBlcnJfXyQxKGBjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsYCk7XG4gICAgICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiBmYWxzZSwgcmVhc29uOiBcImNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxcIiB9O1xuICAgICAgfVxuICAgICAgbG9nX18kMShgU3RyaXBlIFBSIGZsb3cgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LiBDYW4gbWFrZSBwYXltZW50YCwgY2FuTWFrZVBheW1lbnQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICAgIHByLFxuICAgICAgICBhdmFpbGFibGVQcm92aWRlcnM6IHtcbiAgICAgICAgICBhcHBsZVBheTogY2FuTWFrZVBheW1lbnQuYXBwbGVQYXksXG4gICAgICAgICAgZ29vZ2xlUGF5OiBjYW5NYWtlUGF5bWVudC5nb29nbGVQYXlcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1blN0cmlwZVByRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICAgIGFzeW5jICh7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgbm9uQ2RlRm9ybUlucHV0cyxcbiAgICAgIGZsb3dDYWxsYmFja3MsXG4gICAgICBjdXN0b21QYXJhbXMsXG4gICAgICBpbml0UmVzdWx0XG4gICAgfSkgPT4ge1xuICAgICAgbG9nX18kMShgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgICAgaWYgKGN1c3RvbVBhcmFtcy5wcm92aWRlciAhPT0gY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZXIgbWlzbWF0Y2guIEV4cGVjdGVkICR7Y3VzdG9tUGFyYW1zLnByb3ZpZGVyfSwgZ290ICR7Y2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgICBjb25zdCBwciA9IGluaXRSZXN1bHQucHI7XG4gICAgICBpZiAoY3VzdG9tUGFyYW1zPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlID0gY3VzdG9tUGFyYW1zLm92ZXJyaWRlUGF5bWVudFJlcXVlc3Q7XG4gICAgICAgIGxvZ19fJDEoYE92ZXJyaWRpbmcgUFIgYW1vdW50IHdpdGhgLCBvdmVycmlkZSk7XG4gICAgICAgIHVwZGF0ZVByV2l0aEFtb3VudChwciwgb3ZlcnJpZGUuYW1vdW50LCBvdmVycmlkZS5wZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIGxvZ19fJDEoYFNob3dpbmcgUFIgZGlhbG9nLi4uYCk7XG4gICAgICBwci5zaG93KCk7XG4gICAgICBjb25zdCBzdHJpcGVQbUFkZGVkRXZlbnQgPSBhd2FpdCB3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZChwcik7XG4gICAgICBsb2dfXyQxKGBTdHJpcGUgUE0gYWRkZWQgZXZlbnQ6YCwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICAgIGxvZ19fJDEoYE1lcmdpbmcgUE0gZmllbGRzIHdpdGggZm9ybSBmaWVsZHMuLi5gKTtcbiAgICAgIGNvbnN0IG1lcmdlZElucHV0cyA9IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0obm9uQ2RlRm9ybUlucHV0cywgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgbG9nX18kMShgUFIgZGlhbG9nIGZpbmlzaGVkLiBTdGFydGluZyBwYXltZW50IGZsb3cuLi5gKTtcbiAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUihhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIGZpZWxkczogbm9uQ2RlRm9ybUZpZWxkcyxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgUFIgd2l0aCBTdHJpcGUuLi5gKTtcbiAgICAgIGF3YWl0IGNvbmZpcm1TdHJpcGVQclBNKG5leHRBY3Rpb25NZXRhZGF0YSwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgcGF5bWVudCBmbG93IGZvciBzZXR1cC4uLmApO1xuICAgICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW5cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dfXyQxKGBQZXJmb3JtaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICAgIGNvbnN0IGNoZWNrb3V0UmVxdWVzdCA9IHtcbiAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgICAgcHJvdmlkZXJfdHlwZTogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICAgIGN1c3RvbWVyX3ppcF9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0sXG4gICAgICAgICAgY3VzdG9tZXJfY291bnRyeTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuQ09VTlRSWV0sXG4gICAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgICBsaW5lX2l0ZW1zOiBwcmVmaWxsLmxpbmVfaXRlbXMsXG4gICAgICAgICAgdG90YWxfYW1vdW50X2F0b206IHByZWZpbGwuYW1vdW50X3RvdGFsX2F0b20sXG4gICAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIGNvbnN0IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0gPSAoZm9ybUlucHV0cywgc3RyaXBlUG1FdnQpID0+IHtcbiAgICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgICBjb25zdCBbcGF5ZXJGaXJzdE5hbWUsIC4uLnBheWVyTGFzdE5hbWVQYXJ0c10gPSBzdHJpcGVQbUV2dC5wYXllck5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgICBjb25zdCBwYXllckxhc3ROYW1lID0gcGF5ZXJMYXN0TmFtZVBhcnRzLmpvaW4oXCIgXCIpIHx8IHZvaWQgMDtcbiAgICBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSB8fCBwYXllckZpcnN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gICAgaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdIHx8IHBheWVyTGFzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdID0gaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gfHwgc3RyaXBlUG1FdnQucGF5ZXJFbWFpbCB8fCBcIm9wX3VuZmlsbGVkQGdldG9wZW5wYXkuY29tXCI7XG4gICAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LnBvc3RhbENvZGUgfHwgXCIwMDAwMFwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gPSBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldIHx8IHN0cmlwZVBtRXZ0LnNoaXBwaW5nQWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gICAgbG9nX18kMShgRmluYWwgZm9ybSBpbnB1dHM6YCwgaW5wdXRzKTtcbiAgICByZXR1cm4gaW5wdXRzO1xuICB9O1xuICBjb25zdCB1cGRhdGVQcldpdGhBbW91bnQgPSAocHIsIGFtb3VudCwgaXNQZW5kaW5nKSA9PiB7XG4gICAgcHIudXBkYXRlKHtcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIGFtb3VudDogYW1vdW50LmFtb3VudEF0b20sXG4gICAgICAgIGxhYmVsOiBcIlRvdGFsXCIsXG4gICAgICAgIHBlbmRpbmc6IGlzUGVuZGluZ1xuICAgICAgfSxcbiAgICAgIGN1cnJlbmN5OiBhbW91bnQuY3VycmVuY3lcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG9jY3VycmVkLlxuRGV0YWlsczogZ290ICR7cmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aH0gcmVxdWlyZWQgdXNlciBhY3Rpb25zYCk7XG4gICAgfVxuICAgIHJldHVybiBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xuICB9O1xuXG4gIGNvbnN0IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QgPSAoY3Btcywgd2l0aFByb3ZpZGVyLCB3aXRoUHJvY2Vzc29yKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGNwbXMuZmlsdGVyKChjcG0pID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXNQcm9jZXNzb3IgPSB0cnVlIDtcbiAgICAgIGNvbnN0IG1hdGNoZXNQcm92aWRlciA9IGNwbS5wcm92aWRlciA9PT0gd2l0aFByb3ZpZGVyO1xuICAgICAgcmV0dXJuIG1hdGNoZXNQcm9jZXNzb3IgJiYgbWF0Y2hlc1Byb3ZpZGVyO1xuICAgIH0pO1xuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgICB9XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNbMF07XG4gIH07XG4gIGNvbnN0IE9qc0Zsb3dzID0ge1xuICAgIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gICAgLy8gU3RyaXBlXG4gICAgY29tbW9uQ0M6IHtcbiAgICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gICAgfSxcbiAgICBzdHJpcGVQUjoge1xuICAgICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICAgIHJ1bjogcnVuU3RyaXBlUHJGbG93XG4gICAgfVxuICAgIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcbiAgXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xuICB9XG5cbiAgdmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDIsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gdm9pZCAwO1xuXG4gIC8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbiAgY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbiAgY29uc3QgZ2V0U3ltYm9sID0gbmFtZSA9PiBoYXNTeW1ib2wobmFtZSkgPyBTeW1ib2xbbmFtZV0gOiAnQEAnICsgbmFtZTtcblxuICBjb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbiAgY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuICBjb25zdCBTeW1ib2xTcGVjaWVzID0gZ2V0U3ltYm9sKCdzcGVjaWVzJyk7IC8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG4gIGZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICAgIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgICBjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdG9yICE9PSB1bmRlZmluZWQgPyBjdG9yIDogT2JzZXJ2YWJsZSQxO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIE9ic2VydmFibGUkMTsgLy8gU1BFQzogQnJhbmQgY2hlY2tcbiAgfVxuXG4gIGZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gICAgaWYgKGhvc3RSZXBvcnRFcnJvci5sb2cpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBsZXQgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fY2xlYW51cDtcbiAgICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFjbGVhbnVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUuY2FsbChjbGVhbnVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gICAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gICAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO2Vsc2UgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdydW5uaW5nJykgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG4gIH1cblxuICBmdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm47XG5cbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2J1ZmZlcmluZyc7XG4gICAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH1dO1xuICAgICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG4gIH1cblxuICBjbGFzcyBTdWJzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgICAvLyBBU1NFUlQ6IG9ic2VydmVyIGlzIGFuIG9iamVjdFxuICAgICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnbmV4dCcsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICAgIG9uTm90aWZ5KHNlbGYsICdlcnJvcicsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnY29tcGxldGUnKTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdWJzY3JpcHRpb25PYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICAgIH1cblxuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIGxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihzdWJzY3JpYmVyKSB7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICAgIGVycm9yOiBhcmd1bWVudHNbMV0sXG4gICAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gICAgfVxuXG4gICAgZm9yRWFjaChmbikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWFwKGZuKSB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZpbHRlcihmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJlZHVjZShmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGxldCBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICAgIGlmICghZmlyc3QgfHwgaGFzU2VlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYWxsKCkge1xuICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0TmV4dChuZXh0KSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE5leHQodGhpcyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmxhdE1hcChmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXIpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmRG9uZSgpIHtcbiAgICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBbU3ltYm9sT2JzZXJ2YWJsZV0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbSh4KSB7XG4gICAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGxldCBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sT2JzZXJ2YWJsZSk7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgICAgaWYgKE9iamVjdChvYnNlcnZhYmxlKSAhPT0gb2JzZXJ2YWJsZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihvYnNlcnZhYmxlICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2ldKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvZiguLi5pdGVtcykge1xuICAgICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICB9O1xuXG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQxLCBTeW1ib2woJ2V4dGVuc2lvbnMnKSwge1xuICAgIHZhbHVlOiB7XG4gICAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgICBob3N0UmVwb3J0RXJyb3JcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICB2YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG4gIGNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbiAgY29uc3QgeyBsb2dfXywgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1mbG93c1wiKTtcbiAgY29uc3QgaW5pdGlhbGl6ZU9qc0Zsb3dzID0gKGNvbnRleHQpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RyaXBlIFBSXG4gICAgICBzdHJpcGVQUjogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVQUlwiLCBPanNGbG93cy5zdHJpcGVQUi5pbml0KHsgY29udGV4dCB9KSlcbiAgICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgICB9O1xuICB9O1xuICBjb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRpbmdcIiB9KTtcbiAgICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgICBsb2dfXyhgJHtmbG93TmFtZX0gZmxvdyByZXN1bHRgLCByZXN1bHQpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgZXJyX18oYCR7Zmxvd05hbWV9IGZsb3cgaW5pdGlhbGl6YXRpb24gZXJyb3I6XG4ke0pTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH07XG5cbiAgY29uc3QgUFJfTE9BRElORyA9IHtcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgIH1cbiAgfTtcbiAgY29uc3QgUFJfRVJST1IgPSB7XG4gICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gICAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgfVxuICB9O1xuXG4gIGNsYXNzIE9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmb3JtSW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuZm9ybUluc3RhbmNlID0gZm9ybUluc3RhbmNlO1xuICAgICAgdGhpcy5jb25maWcgPSBmb3JtSW5zdGFuY2UuY29uZmlnO1xuICAgICAgdGhpcy5mb3JtSWQgPSBmb3JtSW5zdGFuY2UuZm9ybUlkO1xuICAgICAgdGhpcy5ldmVudFRhcmdldHMgPSB7fTtcbiAgICAgIHRoaXMubm9uY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICB9XG4gICAgaGFuZGxlTWVzc2FnZShldmVudCkge1xuICAgICAgaWYgKCFldmVudC5zb3VyY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5vcmlnaW4gIT09IHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5fZnJhbWVVcmw/Lm9yaWdpbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQuZGF0YVtcInBlbnBhbFwiXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudERhdGEgPSBwYXJzZUV2ZW50UGF5bG9hZChKU09OLnBhcnNlKGV2ZW50LmRhdGEpKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlRXZlbnQoZXZlbnREYXRhKTtcbiAgICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuICAgICAgY29uc3QgeyBlbGVtZW50SWQsIHBheWxvYWQgfSA9IGV2ZW50RGF0YTtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHBheWxvYWQudHlwZTtcbiAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJMQVlPVVRcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRk9DVVNcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBwYXlsb2FkLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkJMVVJcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ0hBTkdFXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUsIHBheWxvYWQuZXJyb3JzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxPQURFRFwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlTG9hZGVkRXZlbnQoZXZlbnQuc291cmNlLCBlbGVtZW50SWQsIHBheWxvYWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9BRF9FUlJPUlwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlTG9hZEVycm9yRXZlbnQocGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJWQUxJREFUSU9OX0VSUk9SXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JFdmVudChwYXlsb2FkLCBlbGVtZW50SWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWxpZGF0ZUV2ZW50KGV2ZW50RGF0YSkge1xuICAgICAgaWYgKGV2ZW50RGF0YS5mb3JtSWQgIT09IHRoaXMuZm9ybUluc3RhbmNlLmZvcm1JZCB8fCAhZXZlbnREYXRhLmVsZW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ub25jZXMuaGFzKGV2ZW50RGF0YS5ub25jZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5ub25jZXMuYWRkKGV2ZW50RGF0YS5ub25jZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFuZGxlTGF5b3V0RXZlbnQocGF5bG9hZCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gcGF5bG9hZC5oZWlnaHQgPyBgJHtwYXlsb2FkLmhlaWdodH1weGAgOiBcIjEwMCVcIjtcbiAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNldEZvcm1IZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25Gb2N1cykgdGhpcy5jb25maWcub25Gb2N1cyhlbGVtZW50SWQsIGZpZWxkKTtcbiAgICB9XG4gICAgaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgZmllbGQpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vbkJsdXIpIHRoaXMuY29uZmlnLm9uQmx1cihlbGVtZW50SWQsIGZpZWxkKTtcbiAgICB9XG4gICAgaGFuZGxlQ2hhbmdlRXZlbnQoZWxlbWVudElkLCBmaWVsZCwgZXJyb3JzKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25DaGFuZ2UpIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGVsZW1lbnRJZCwgZmllbGQsIGVycm9ycyk7XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZUxvYWRlZEV2ZW50KHNvdXJjZSwgZWxlbWVudElkLCBwYXlsb2FkKSB7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0c1tlbGVtZW50SWRdID0gc291cmNlO1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uub25DZGVMb2FkZWQocGF5bG9hZCk7XG4gICAgICBpZiAodGhpcy5jb25maWcub25Mb2FkKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uTG9hZChwYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMsIHBheWxvYWQuY3VycmVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uTG9hZEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IocGF5bG9hZC5tZXNzYWdlKTtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRhdGlvbkVycm9yRXZlbnQocGF5bG9hZCwgZWxlbWVudElkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcihwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXN5bmMgaGFuZGxlRXJyb3JFdmVudChwYXlsb2FkOiBFcnJvckV2ZW50UGF5bG9hZCkge1xuICAgIC8vICAgaWYgKHBheWxvYWQubWVzc2FnZSA9PT0gJzNEU19SRVFVSVJFRCcpIHtcbiAgICAvLyAgICAgY29uc3QgdGhyZWVEU1VybCA9IHBheWxvYWQuaGVhZGVycz8uWyd4LTNkcy1hdXRoLXVybCddID8/IFNJTVVMQVRFXzNEU19VUkw7XG4gICAgLy8gICAgIC8vIFRoaXMgd2lsbCBvcGVuIGEgcG9wdXAgYW5kIHByb2Nlc3MgdGhlIDNEUyBmbG93XG4gICAgLy8gICAgIC8vIHdpbGwgcmV0dXJuIGEgc3RhdHVzIGBzdWNjZXNzYCB8IGBmYWlsdXJlYCB8IGBjYW5jZWxsZWRgIHdoaWNoIHdlIGNhbiBjb250aW51ZSB3aXRoXG4gICAgLy8gICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiB0aHJlZURTVXJsLCBiYXNlVXJsOiB0aGlzLmNvbmZpZy5iYXNlVXJsISB9KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coJ/CflJAgM0RTIHN0YXR1czonLCBzdGF0dXMpO1xuICAgIC8vICAgICAvLyBUT0RPOiBjb250aW51ZSB3aXRoIHN0YXR1c1xuICAgIC8vICAgICBjb25zdCBjYXJkQ3BtID0gdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgICBpZiAoIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCB8fCAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pXG4gICAgLy8gICAgICAgcmV0dXJuO1xuICAgIC8vICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMpKSB7XG4gICAgLy8gICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAgIC8vICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAgIC8vICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgfSxcbiAgICAvLyAgICAgICAgIGZhbHNlXG4gICAgLy8gICAgICAgKTtcbiAgICAvLyAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gICAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gICAgLy8gICAgICAgdGhpcy50b2tlbml6ZWREYXRhID0gc3RhcnRQYXltZW50Rmxvd0V2ZW50O1xuICAgIC8vICAgICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgIC8vICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyBoYW5kbGVGb3JtU3VibWl0KCkge1xuICAgIC8vICAgaWYgKFxuICAgIC8vICAgICAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8XG4gICAgLy8gICAgICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5sZW5ndGggfHxcbiAgICAvLyAgICAgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yXG4gICAgLy8gICApIHtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgY2FyZENwbSA9IHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMuZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgaWYgKCFjYXJkQ3BtKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignQ2FyZCBub3QgYXZhaWxhYmxlIGFzIGEgcGF5bWVudCBtZXRob2QgaW4gY2hlY2tvdXQnKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IHRva2VuaXplRGF0YSA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgRXZlbnRUeXBlLmVudW0uVE9LRU5JWkUsXG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCEsXG4gICAgLy8gICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgIGNhcmRDcG0sXG4gICAgLy8gICAgIGZhbHNlXG4gICAgLy8gICApO1xuICAgIC8vICAgaWYgKCF0b2tlbml6ZURhdGEpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBjb25zdHJ1Y3RpbmcgdG9rZW5pemUgZGF0YScpO1xuICAgIC8vICAgfVxuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzKSkge1xuICAgIC8vICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gICAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgdG9rZW5pemVEYXRhKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHRoaXMudG9rZW5pemVkRGF0YSA9IHRva2VuaXplRGF0YTtcbiAgICAvLyB9XG4gICAgLy8gYXN5bmMgb25Vc2VyQ29tcGxldGVQYXltZW50UmVxdWVzdFVJKFxuICAgIC8vICAgc3RyaXBlUG06IFBheW1lbnRSZXF1ZXN0UGF5bWVudE1ldGhvZEV2ZW50LFxuICAgIC8vICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgICAvLyApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyAgIGlmICghdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcylcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cyA/PyB7fSkpIHtcbiAgICAvLyAgICAgY29uc3QgcGF5bWVudEZsb3dNZXRhZGF0YSA9IHsgc3RyaXBlUG1JZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCB9O1xuICAgIC8vICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gICAgLy8gICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAgIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gICAgLy8gICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIC8vICAgICAgIGZhbHNlLFxuICAgIC8vICAgICAgIHBheW1lbnRGbG93TWV0YWRhdGFcbiAgICAvLyAgICAgKTtcbiAgICAvLyAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAgIC8vICAgICB0aGlzLnN0cmlwZVBtID0gc3RyaXBlUG07XG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAgIC8vICAgICB0aGlzLnNldFRva2VuaXplZERhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKGVsZW1lbnQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgLy8gZW1pdEV2ZW50KGVsZW1lbnQubm9kZS5jb250ZW50V2luZG93ISwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50LCB0aGlzLmNvbmZpZy5iYXNlVXJsISk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBwb3N0RXZlbnRUb0ZyYW1lKHNvdXJjZSwgZWxlbWVudElkLCBkYXRhKSB7XG4gICAgICBlbWl0RXZlbnQoc291cmNlLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBkYXRhLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKGlmcmFtZSwgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gcGVucGFsLmNvbm5lY3RUb0NoaWxkKHtcbiAgICAgIGlmcmFtZSxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIGNoaWxkT3JpZ2luXG4gICAgfSk7XG4gICAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgICBjb25zdCBpc1ZhbGlkT2JqZWN0ID0gYXdhaXQgY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdChjb25uZWN0aW9uT2JqKTtcbiAgICBpZiAoIWlzUmVzdWx0VmFsaWQoY29ubmVjdGlvbk9iaiwgaXNWYWxpZE9iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uT2JqO1xuICB9XG4gIGNsYXNzIENvbm5lY3Rpb25NYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBhZGRDb25uZWN0aW9uKGlkLCBjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChpZCwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldENvbm5lY3Rpb24oKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBub3QgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgZ2V0QWxsQ29ubmVjdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICBjbGFzcyBPcGVuUGF5Rm9ybSB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICB0aGlzLnRyeUluaXRPanNGbG93cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uTWFuYWdlci5nZXRBbGxDb25uZWN0aW9ucygpLnNpemUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uID0gaW5pdGlhbGl6ZU9qc0Zsb3dzKHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKSk7XG4gICAgICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbi5zdHJpcGVQUi5zdWJzY3JpYmUoKHN0YXR1cykgPT4gdGhpcy5vblN0cmlwZVBSU3RhdHVzQ2hhbmdlKHN0YXR1cykpO1xuICAgICAgfTtcbiAgICAgIHRoaXMub25DZGVMb2FkZWQgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jZGVMb2FkZWRQYXlsb2FkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RlTG9hZGVkUGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5vblN0cmlwZVBSU3RhdHVzQ2hhbmdlID0gKGluaXRTdGF0dXMpID0+IHtcbiAgICAgICAgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oeyBhcHBsZV9wYXk6IFBSX0xPQURJTkcsIGdvb2dsZV9wYXk6IFBSX0xPQURJTkcgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oeyBhcHBsZV9wYXk6IFBSX0VSUk9SLCBnb29nbGVfcGF5OiBQUl9FUlJPUiB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJsb2FkZWRcIikge1xuICAgICAgICAgIGNvbnN0IGluaXRSZXN1bHQgPSBpbml0U3RhdHVzLnJlc3VsdDtcbiAgICAgICAgICBjb25zdCBjYW5BcHBsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuYXBwbGVQYXk7XG4gICAgICAgICAgY29uc3QgY2FuR29vZ2xlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5nb29nbGVQYXk7XG4gICAgICAgICAgdGhpcy5jb25maWcub25QYXltZW50UmVxdWVzdExvYWQ/Lih7XG4gICAgICAgICAgICBhcHBsZV9wYXk6IHtcbiAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkFwcGxlUGF5LFxuICAgICAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5BcHBsZVBheSA/IHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QoXCJhcHBsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnb29nbGVfcGF5OiB7XG4gICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5Hb29nbGVQYXksXG4gICAgICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkdvb2dsZVBheSA/IHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QoXCJnb29nbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0ID0gKHByb3ZpZGVyLCBpbml0UmVzdWx0LCBwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICAgICAgcmV0dXJuIE9qc0Zsb3dzLnN0cmlwZVBSLnJ1bih7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBwcm92aWRlciksXG4gICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogdGhpcy5nZXROb25DZGVGb3JtSW5wdXRzKCksXG4gICAgICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICAgICAgY3VzdG9tUGFyYW1zOiB7IHByb3ZpZGVyLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBwYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QgfSxcbiAgICAgICAgICBpbml0UmVzdWx0XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIE9wZW5QYXlGb3JtLmFzc2lnbkFzU2luZ2xldG9uKHRoaXMpO1xuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZywgYmFzZVVybDogY29uZmlnLmJhc2VVcmwgPz8gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiIH07XG4gICAgICB0aGlzLmVsZW1lbnRzID0gbnVsbDtcbiAgICAgIHRoaXMuZm9ybUlkID0gYG9wanMtZm9ybS0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICB0aGlzLnJlZmVyZXIgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgdGhpcy5mb3JtVGFyZ2V0ID0gY29uZmlnLmZvcm1UYXJnZXQgPz8gXCJib2R5XCI7XG4gICAgICB0aGlzLmZvcm1Qcm9wZXJ0aWVzID0geyBoZWlnaHQ6IFwiMXB4XCIgfTtcbiAgICAgIHRoaXMuY2RlTG9hZGVkUGF5bG9hZCA9IG51bGw7XG4gICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IENvbm5lY3Rpb25NYW5hZ2VyKCk7XG4gICAgICB0aGlzLmV2ZW50SGFuZGxlciA9IG5ldyBPcGVuUGF5Rm9ybUV2ZW50SGFuZGxlcih0aGlzKTtcbiAgICAgIHRoaXMub2pzVmVyc2lvbiA9IFwiMC4xLjdcIjtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIHtcbiAgICAgIHRoaXMub2pzRmxvd3MgPSBPanNGbG93cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzaWduIHRoZSBpbnN0YW5jZSB0byB0aGUgd2luZG93IGFzIGEgc2luZ2xldG9uXG4gICAgICogQHBhcmFtIGZvcm0gLSBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgYXNzaWduQXNTaW5nbGV0b24oZm9ybSkge1xuICAgICAgaWYgKE9wZW5QYXlGb3JtLmdldEluc3RhbmNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cy4gT25seSBvbmUgaW5zdGFuY2UgaXMgYWxsb3dlZC5cIik7XG4gICAgICB9XG4gICAgICB3aW5kb3dbXCJvanNcIl0gPSBmb3JtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBPcGVuUGF5Rm9ybVxuICAgICAqIEByZXR1cm5zIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgIHJldHVybiB3aW5kb3dbXCJvanNcIl0gPz8gbnVsbDtcbiAgICB9XG4gICAgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlcjtcbiAgICB9XG4gICAgc2V0Rm9ybUhlaWdodChoZWlnaHQpIHtcbiAgICAgIHRoaXMuZm9ybVByb3BlcnRpZXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgaWYgKHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5ub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUVsZW1lbnQoZWxlbWVudFZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgZm9ybSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICBjb25zdCB0eXBlID0gRWxlbWVudFR5cGUucGFyc2UoZWxlbWVudFZhbHVlKTtcbiAgICAgIGNvbnN0IGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKG9wdGlvbnMpO1xuICAgICAgZnJhbWUubmFtZSA9IGAke3R5cGV9LWVsZW1lbnRgO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgL2FwcC92MS8ke2ZyYW1lLm5hbWV9YCwgdGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICB1cmwuc2VhcmNoID0gcXVlcnlTdHJpbmcudG9TdHJpbmcoKTtcbiAgICAgIGZyYW1lLnNyYyA9IHVybC5ocmVmO1xuICAgICAgdGhpcy5jb25maWcuX2ZyYW1lVXJsID0gdXJsO1xuICAgICAgZnJhbWUuc3R5bGUuYm9yZGVyID0gXCJub25lXCI7XG4gICAgICBmcmFtZS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbm9kZTogZnJhbWUsXG4gICAgICAgIG1vdW50OiAoc2VsZWN0b3IpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpPy5hcHBlbmRDaGlsZChmcmFtZSlcbiAgICAgIH07XG4gICAgICB0aGlzLmNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAodGhpcy5lbGVtZW50cykge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW3R5cGVdID0gZWxlbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSB7IFt0eXBlXTogZWxlbWVudCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucykge1xuICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJyZWZlcmVyXCIsIHRoaXMucmVmZXJlcik7XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJmb3JtSWRcIiwgdGhpcy5mb3JtSWQpO1xuICAgICAgaWYgKG9wdGlvbnMuc3R5bGVzKSB7XG4gICAgICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInN0eWxlc1wiLCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyhvcHRpb25zLnN0eWxlcykpO1xuICAgICAgfVxuICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgICByZXR1cm4gcXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIGNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgY3JlYXRlQ29ubmVjdGlvbihlbGVtZW50Lm5vZGUpLnRoZW4oKGNvbm4pID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlci5hZGRDb25uZWN0aW9uKGVsZW1lbnQudHlwZSwgY29ubik7XG4gICAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB2b2lkIDApO1xuICAgIH1cbiAgICBnZXRGb3JtRGl2KCkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtVGFyZ2V0KSA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH1cbiAgICBjcmVhdGVPanNGbG93Q29udGV4dCgpIHtcbiAgICAgIGNvbnN0IGNkZUNvbm5lY3Rpb25zID0gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5nZXRBbGxDb25uZWN0aW9ucygpO1xuICAgICAgaWYgKCF0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdGVkIGNvbnRleHQgd2hpbGUgQ0RFIG5vdCB5ZXQgbG9hZGVkXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGNkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZVVybDogbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVXJsID8/IEZSQU1FX0JBU0VfVVJMKS5vcmlnaW4sXG4gICAgICAgIGZvcm1EaXY6IHRoaXMuZ2V0Rm9ybURpdigpLFxuICAgICAgICBlbGVtZW50c1Nlc3Npb25JZDogdGhpcy5jZGVMb2FkZWRQYXlsb2FkLnNlc3Npb25JZCxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogdGhpcy5jZGVMb2FkZWRQYXlsb2FkLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICAgIGNkZUNvbm5lY3Rpb25zXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXROb25DZGVGb3JtSW5wdXRzKCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSh0aGlzLmdldEZvcm1EaXYoKSk7XG4gICAgfVxuICAgIGNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSB7XG4gICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uQ2hlY2tvdXRFcnJvcjogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRFcnJvclwiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IgPz8gbm9PcCksXG4gICAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgdGhpcy5jb25maWcub25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICAgIG9uQ2hlY2tvdXRTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN1Y2Nlc3NcIiwgdGhpcy5jb25maWcub25DaGVja291dFN1Y2Nlc3MgPz8gbm9PcCksXG4gICAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcbiAgICAgICAgICBcIm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzc1wiLFxuICAgICAgICAgIHRoaXMuY29uZmlnLm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyA/PyBub09wXG4gICAgICAgICksXG4gICAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICAgIH07XG4gICAgfVxuICAgIHN1Ym1pdCgpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgICBPanNGbG93cy5jb21tb25DQy5ydW4oe1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBcImNyZWRpdF9jYXJkXCIpLFxuICAgICAgICBub25DZGVGb3JtSW5wdXRzOiB0aGlzLmdldE5vbkNkZUZvcm1JbnB1dHMoKSxcbiAgICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICAgIGN1c3RvbVBhcmFtczogdm9pZCAwLFxuICAgICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gY3VzdG9tIHBhcmFtc1xuICAgICAgICBpbml0UmVzdWx0OiB2b2lkIDBcbiAgICAgICAgLy8gVGhpcyBmbG93IHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgb25QYXltZW50UmVxdWVzdEVycm9yKGVyck1zZykge1xuICAgICAgdGhpcy5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMgPz8ge30pKSB7XG4gICAgICAgIGVsZW1lbnQubm9kZS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnRzLkZpZWxkTmFtZSA9IEZpZWxkTmFtZTtcbiAgZXhwb3J0cy5PcGVuUGF5Rm9ybSA9IE9wZW5QYXlGb3JtO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1i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IiwgInBlbnBhbCIsICJjaGFsayIsICJGUkFNRV9CQVNFX1VSTCIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UiLCAiWm9kRmllbGRFcnJvciIsICJab2RGaWVsZEVycm9ycyIsICJNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFIiwgImdldEh1bWFuRnJpZW5kbHlNZXNzYWdlIiwgIm9nRXJyb3JNZXNzYWdlIiwgImtleSIsICJpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCIsICJzdHIiLCAiY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJyZXNwb25zZSIsICJlcnIiLCAiY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyIsICJlcnJvcnMiLCAiZ2V0RXJyb3JNZXNzYWdlIiwgImUiLCAib2JqIiwgImUyIiwgIm1ha2VDYWxsYmFja1NhZmUiLCAiY2FsbGJhY2tOYW1lIiwgImZuIiwgImFyZ3MiLCAiUmVxdWlyZWRTdHJpbmciLCAiT3B0aW9uYWxTdHJpbmciLCAibnVsbE9yVW5kZWZPciQxIiwgInpUeXBlIiwgIkZpZWxkTmFtZSIsICJGaWVsZE5hbWUyIiwgIkZpZWxkTmFtZUVudW0iLCAiUHJpdmF0ZUZpZWxkTmFtZSIsICJQcml2YXRlRmllbGROYW1lMiIsICJQcml2YXRlRmllbGROYW1lRW51bSIsICJBbGxGaWVsZE5hbWVzIiwgIkVsZW1lbnRUeXBlRW51bSIsICJFbGVtZW50VHlwZUVudW0yIiwgIkVsZW1lbnRUeXBlIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCQxIiwgIlBheW1lbnRNZXRob2RNaW5pbWFsIiwgIkV2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRUeXBlIiwgIkdlbmVyaWNFdmVudFBheWxvYWQiLCAiSW5wdXRFdmVudFR5cGUiLCAiSW5wdXRFdmVudFBheWxvYWQiLCAiRXJyb3JFdmVudFR5cGUiLCAiRXJyb3JFdmVudFBheWxvYWQiLCAiVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCIsICJMYXlvdXRFdmVudFBheWxvYWQiLCAiTG9hZGVkRXZlbnRQYXlsb2FkIiwgIlBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCIsICJTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAiUFJGb3JtRmllbGRzIiwgIlN1Ym1pdEV2ZW50VHlwZSIsICJTdWJtaXRFdmVudFBheWxvYWQiLCAiVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkIiwgIkNoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJFdmVudFBheWxvYWQiLCAiRWxlbWVudEV2ZW50IiwgIkNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgIkZpZWxkVmFsaWRhdGlvbkVycm9yIiwgIlRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UiLCAiVG9rZW5pemVDYXJkUmVzcG9uc2UiLCAiVGhyZWVEU1N0YXR1cyIsICJUaHJlZURTU3RhdHVzMiIsICJQaW5nM0RTU3RhdHVzUmVzcG9uc2UiLCAiQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgImV4dHJhY3RJc3N1ZXNQZXJGaWVsZCIsICJlcnJvciIsICJpc3N1ZXNQZXJGaWVsZCIsICJ2YWx1ZSIsICJmaWVsZE5hbWUiLCAiU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgIlBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhIiwgIm91ckN1cnJlbmN5VG9UaGVpcnMiLCAiZ2V0TG9hZGVkU3RyaXBlIiwgInB1Ymxpc2hhYmxlS2V5IiwgImkiLCAiaXNTdHJpcGVKc1ByZXNlbnQiLCAic2xlZXAiLCAiY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QiLCAic3RyaXBlUHViS2V5IiwgInRvdGFsQW1vdW50QXRvbSIsICJjdXJyZW5jeSIsICJpc0Ftb3VudFBlbmRpbmciLCAiaXNMaW5rT25seSIsICJzdHJpcGUiLCAic3RyaXBlQ3VycmVuY3kiLCAidGltZW91dE1zIiwgInJlc29sdmUiLCAid2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QiLCAicGF5bWVudFJlcXVlc3QiLCAicmVqZWN0IiwgImV2dCIsICJjb25maXJtU3RyaXBlUHJQTSIsICJuZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlUG0iLCAiY29uZmlybVJlc3VsdCIsICJsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93IiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9kIiwgInJlc3VsdFN0YXR1cyIsICJjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyIsICJzdHlsZXMiLCAiY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtIiwgImZvcm1EaXYiLCAiaW5pdGlhbERpY3QiLCAiYWNjIiwgImlucHV0IiwgInBhcnNlRXZlbnRQYXlsb2FkIiwgImV2ZW50RGF0YSIsICJlbWl0RXZlbnQiLCAidGFyZ2V0IiwgImZvcm1JZCIsICJlbGVtZW50SWQiLCAicGF5bG9hZCIsICJiYXNlVXJsIiwgImV2ZW50IiwgImNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QiLCAicGluZyIsICJyZXN1bHQiLCAiaXNSZXN1bHRWYWxpZCIsICJpc1ZhbGlkIiwgIm51bGxPclVuZGVmT3IiLCAiQ0RFUmVzcG9uc2VFcnJvciIsICJDb3Vwb25NaW5pbWFsIiwgIkxpbmVJdGVtIiwgIkJyYW5kU2V0dGluZ3MiLCAiQnJhbmQiLCAiQ2hlY2tvdXRQYXltZW50TWV0aG9kIiwgIlN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsIiwgIlN1YnNjcmlwdGlvbk1pbmltYWwiLCAiSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsIiwgIkludm9pY2VMaW5lSXRlbU1pbmltYWwiLCAiRGlzY291bnRNaW5pbWFsIiwgIkludm9pY2VNaW5pbWFsIiwgIkNyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCIsICJQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSIsICJfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uIiwgIlBheW1lbnRGb3JtUHJlZmlsbCIsICJDb21wbGV0ZWRGb3JtUHJlZmlsbCIsICJFeHBpcmVkRm9ybVByZWZpbGwiLCAiQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UiLCAiU2V0dXBDaGVja291dFJlc3BvbnNlIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yIiwgIlN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSIsICJzdW0iLCAiYXJyIiwgImEiLCAiYiIsICJmaXhQcm90byIsICJwcm90b3R5cGUiLCAic2V0UHJvdG90eXBlT2YiLCAiZml4U3RhY2siLCAiY2FwdHVyZVN0YWNrVHJhY2UiLCAiX19leHRlbmRzIiwgIl9leHRlbmRTdGF0aWNzIiwgImQiLCAicCIsICJfXyIsICJDdXN0b21FcnJvciIsICJfc3VwZXIiLCAibWVzc2FnZSIsICJvcHRpb25zIiwgIl9uZXdUYXJnZXQiLCAiX3RoaXMiLCAiQ2RlRXJyb3IiLCAiZnJpZW5kbHlNZXNzYWdlIiwgInF1ZXJ5Q0RFIiwgImNkZUNvbm4iLCAiZGF0YSIsICJyZXNwb25zZVNjaGVtYSIsICJpc0NERVJlc3BvbnNlRXJyb3IiLCAiY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEiLCAic2NoZW1hIiwgImdldENoZWNrb3V0UHJldmlldyIsICJyZXF1ZXN0IiwgImdldFByZWZpbGwiLCAic3RhcnRQYXltZW50Rmxvd0ZvckNDIiwgInN0YXJ0UGF5bWVudEZsb3dGb3JQUiIsICJjb25maXJtUGF5bWVudEZsb3ciLCAiZ2V0Q2hlY2tvdXRWYWx1ZSIsICJzZWN1cmVUb2tlbiIsICJwcm9tb0NvZGUiLCAiY2hlY2tvdXRQcmV2aWV3IiwgImN1cnJlbmNpZXMiLCAiaW52IiwgImFtb3VudEF0b20iLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50IiwgImlzU2V0dXBNb2RlIiwgInRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMiLCAiYWxsQ2RlQ29ubmVjdGlvbnMiLCAiY2hlY2tvdXRDYXJkRWxlbWVudHMiLCAic2V0dXBDaGVja291dCIsICJwZXJmb3JtQ2hlY2tvdXQiLCAiQ0RFX1BPTExJTkdfSU5URVJWQUwiLCAicGluZ0NkZUZvcjNkc1N0YXR1cyIsICJpZnJhbWUiLCAiY2hpbGRPcmlnaW4iLCAiY29ubmVjdGlvbk9iaiIsICJjcmVhdGVBbmRPcGVuRnJhbWUiLCAidXJsIiwgInRlbXBsYXRlIiwgImhvc3QiLCAic2hhZG93Um9vdCIsICJjYW5jZWxCdXR0b24iLCAic3RhcnRQb2xsaW5nIiwgIm9uU3VjY2VzcyIsICJoYW5kbGVQb2xsaW5nIiwgInN0YXR1cyIsICJwb2xsaW5nSW50ZXJ2YWwiLCAiaGFuZGxlRXZlbnRzIiwgImVsZW1lbnRzIiwgImhhbmRsZUNhbmNlbCIsICJzdGFydDNkc1ZlcmlmaWNhdGlvbiIsICJjbGVhbnVwRXZlbnRMaXN0ZW5lcnMiLCAiYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMiLCAic2ltcGxlT2pzRmxvdyIsICJwYXJhbXMiLCAiZmxvd1Jlc3VsdCIsICJhZGRFcnJvckNhdGNoZXJGb3JJbml0IiwgImluaXQiLCAiZXJyX18iLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAicHJlZml4IiwgImxvZyIsICJsb2dfXyQzIiwgImVycl9fJDQiLCAidmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MiLCAibm9uQ2RlRm9ybUlucHV0cyIsICJvblZhbGlkYXRpb25FcnJvciIsICJmb3JtYXR0ZWQiLCAiaXNzdWVzIiwgInZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHQiLCAicGFyc2VkIiwgImVycl9fJDMiLCAicGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJmaW5kQ3BtTWF0Y2hpbmdUeXBlIiwgImFsbENQTXMiLCAiem9kTW9kZWwiLCAiY3BtIiwgImNwbTIiLCAibG9nX18kMiIsICJlcnJfXyQyIiwgInN0cmlwZUxvZ19fIiwgInJ1bkNvbW1vbkNjRmxvdyIsICJjb250ZXh0IiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJmbG93Q2FsbGJhY2tzIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJub25DZGVGb3JtRmllbGRzIiwgInRva2VuaXplQ2FyZFJlc3VsdHMiLCAiY29tbW9uQ2hlY2tvdXRQYXJhbXMiLCAic2hvdWxkVXNlTmV3RmxvdyIsICJzdGFydFBmUmVzdWx0IiwgImNvbW1vbkNDM0RTRmxvdyIsICJzdHJpcGVDQzNEU0Zsb3ciLCAiY3JlYXRlZFBheW1lbnRNZXRob2QiLCAicGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlQWN0aW9uIiwgImFjdGlvbiIsICJwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJjb21tb25BY3Rpb24iLCAibG9nX18kMSIsICJlcnJfXyQxIiwgIlN0cmlwZVByQ3BtIiwgImluaXRTdHJpcGVQckZsb3ciLCAiaW5pdGlhbFByZXZpZXciLCAicHIiLCAiY2FuTWFrZVBheW1lbnQiLCAicnVuU3RyaXBlUHJGbG93IiwgImN1c3RvbVBhcmFtcyIsICJpbml0UmVzdWx0IiwgIm92ZXJyaWRlIiwgInVwZGF0ZVByV2l0aEFtb3VudCIsICJzdHJpcGVQbUFkZGVkRXZlbnQiLCAibWVyZ2VkSW5wdXRzIiwgImZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0iLCAic3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgInBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY2hlY2tvdXRSZXF1ZXN0IiwgImZvcm1JbnB1dHMiLCAic3RyaXBlUG1FdnQiLCAiaW5wdXRzIiwgInBheWVyRmlyc3ROYW1lIiwgInBheWVyTGFzdE5hbWVQYXJ0cyIsICJwYXllckxhc3ROYW1lIiwgImFtb3VudCIsICJpc1BlbmRpbmciLCAiZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCIsICJjcG1zIiwgIndpdGhQcm92aWRlciIsICJ3aXRoUHJvY2Vzc29yIiwgIm1hdGNoZXMiLCAiT2pzRmxvd3MiLCAiZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMiLCAieCIsICJPYnNlcnZhYmxlJDIiLCAiaGFzU3ltYm9sIiwgIm5hbWUiLCAiZ2V0U3ltYm9sIiwgIlN5bWJvbEl0ZXJhdG9yIiwgIlN5bWJvbE9ic2VydmFibGUiLCAiU3ltYm9sU3BlY2llcyIsICJnZXRNZXRob2QiLCAiZ2V0U3BlY2llcyIsICJjdG9yIiwgIk9ic2VydmFibGUkMSIsICJpc09ic2VydmFibGUiLCAiaG9zdFJlcG9ydEVycm9yIiwgImVucXVldWUiLCAiY2xlYW51cFN1YnNjcmlwdGlvbiIsICJzdWJzY3JpcHRpb24iLCAiY2xlYW51cCIsICJ1bnN1YnNjcmliZSIsICJjbG9zZVN1YnNjcmlwdGlvbiIsICJmbHVzaFN1YnNjcmlwdGlvbiIsICJxdWV1ZSIsICJub3RpZnlTdWJzY3JpcHRpb24iLCAidHlwZSIsICJvYnNlcnZlciIsICJtIiwgIm9uTm90aWZ5IiwgIlN1YnNjcmlwdGlvbiIsICJzdWJzY3JpYmVyIiwgInNlbGYiLCAic3Vic2NyaXB0aW9uT2JzZXJ2ZXIiLCAiT2JzZXJ2YWJsZSIsICJkb25lIiwgIkMiLCAiaGFzU2VlZCIsICJoYXNWYWx1ZSIsICJmaXJzdCIsICJ2YWx1ZXMiLCAic291cmNlcyIsICJpbmRleCIsICJzdGFydE5leHQiLCAibmV4dCIsICJ2IiwgInN1YnNjcmlwdGlvbnMiLCAib3V0ZXIiLCAiaW5uZXIiLCAiY29tcGxldGVJZkRvbmUiLCAicyIsICJtZXRob2QiLCAib2JzZXJ2YWJsZSIsICJpdGVtIiwgIml0ZW1zIiwgInplbk9ic2VydmFibGUiLCAibG9nX18iLCAiaW5pdGlhbGl6ZU9qc0Zsb3dzIiwgInJ1bkluaXRGbG93QXNPYnNlcnZhYmxlIiwgImZsb3dOYW1lIiwgImluaXRGbG93IiwgIlBSX0xPQURJTkciLCAiUFJfRVJST1IiLCAiT3BlblBheUZvcm1FdmVudEhhbmRsZXIiLCAiZm9ybUluc3RhbmNlIiwgImhlaWdodCIsICJmaWVsZCIsICJzb3VyY2UiLCAiY3JlYXRlQ29ubmVjdGlvbiIsICJpc1ZhbGlkT2JqZWN0IiwgIkNvbm5lY3Rpb25NYW5hZ2VyIiwgImlkIiwgImNvbm5lY3Rpb24iLCAiX09wZW5QYXlGb3JtIiwgImNvbmZpZyIsICJpbml0U3RhdHVzIiwgIl9lIiwgIl9mIiwgImNhbkFwcGxlUGF5IiwgImNhbkdvb2dsZVBheSIsICJ1c2VyUGFyYW1zIiwgInByb3ZpZGVyIiwgImZvcm0iLCAiZWxlbWVudCIsICJlbGVtZW50VmFsdWUiLCAiZnJhbWUiLCAicXVlcnlTdHJpbmciLCAic2VsZWN0b3IiLCAiY29ubiIsICJjZGVDb25uZWN0aW9ucyIsICJub09wIiwgImVyck1zZyIsICJPcGVuUGF5Rm9ybSJdCn0K
|