@data-client/core 0.14.18 → 0.14.20
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.js +549 -276
- package/dist/index.umd.min.js +1 -1
- package/legacy/actions.js +1 -1
- package/legacy/controller/Controller.js +96 -8
- package/legacy/index.js +3 -4
- package/legacy/manager/DevtoolsManager.js +7 -4
- package/legacy/manager/NetworkManager.js +3 -2
- package/legacy/manager/SubscriptionManager.js +1 -1
- package/legacy/manager/applyManager.js +3 -7
- package/legacy/manager/initManager.js +15 -0
- package/legacy/state/GCPolicy.js +151 -0
- package/legacy/state/reducer/createReducer.js +7 -3
- package/legacy/state/reducer/expireReducer.js +5 -4
- package/legacy/state/reducer/fetchReducer.js +3 -2
- package/legacy/state/reducer/invalidateReducer.js +6 -5
- package/legacy/state/reducer/setResponseReducer.js +10 -7
- package/legacy/types.js +1 -1
- package/lib/actions.d.ts +2 -2
- package/lib/actions.d.ts.map +1 -1
- package/lib/actions.js +1 -1
- package/lib/controller/Controller.d.ts +108 -5
- package/lib/controller/Controller.d.ts.map +1 -1
- package/lib/controller/Controller.js +96 -8
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -4
- package/lib/manager/SubscriptionManager.d.ts.map +1 -1
- package/lib/manager/SubscriptionManager.js +1 -1
- package/lib/manager/applyManager.d.ts.map +1 -1
- package/lib/manager/applyManager.js +3 -7
- package/lib/manager/initManager.d.ts +4 -0
- package/lib/manager/initManager.d.ts.map +1 -0
- package/lib/manager/initManager.js +15 -0
- package/lib/state/GCPolicy.d.ts +55 -0
- package/lib/state/GCPolicy.d.ts.map +1 -0
- package/lib/state/GCPolicy.js +151 -0
- package/lib/state/reducer/createReducer.js +5 -2
- package/lib/state/reducer/expireReducer.d.ts +1 -0
- package/lib/state/reducer/expireReducer.d.ts.map +1 -1
- package/lib/state/reducer/invalidateReducer.d.ts +1 -0
- package/lib/state/reducer/invalidateReducer.d.ts.map +1 -1
- package/lib/state/reducer/setReducer.d.ts +3 -2
- package/lib/state/reducer/setReducer.d.ts.map +1 -1
- package/lib/state/reducer/setResponseReducer.d.ts +4 -2
- package/lib/state/reducer/setResponseReducer.d.ts.map +1 -1
- package/lib/state/reducer/setResponseReducer.js +4 -2
- package/lib/types.d.ts +1 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +1 -1
- package/package.json +10 -5
- package/src/actions.ts +2 -1
- package/src/controller/Controller.ts +205 -8
- package/src/controller/__tests__/Controller.ts +8 -4
- package/src/controller/__tests__/__snapshots__/get.ts.snap +7 -0
- package/src/controller/__tests__/__snapshots__/getResponse.ts.snap +15 -0
- package/src/controller/__tests__/get.ts +45 -17
- package/src/controller/__tests__/getResponse.ts +46 -0
- package/src/index.ts +2 -6
- package/src/manager/SubscriptionManager.ts +0 -1
- package/src/manager/applyManager.ts +3 -4
- package/src/manager/initManager.ts +21 -0
- package/src/state/GCPolicy.ts +197 -0
- package/src/state/__tests__/GCPolicy.test.ts +258 -0
- package/src/state/__tests__/__snapshots__/reducer.ts.snap +2 -0
- package/src/state/__tests__/reducer.ts +4 -4
- package/src/state/reducer/createReducer.ts +1 -1
- package/src/state/reducer/setResponseReducer.ts +3 -1
- package/src/types.ts +1 -0
- package/ts3.4/actions.d.ts +2 -5
- package/ts3.4/controller/Controller.d.ts +141 -5
- package/ts3.4/index.d.ts +2 -0
- package/ts3.4/manager/initManager.d.ts +4 -0
- package/ts3.4/state/GCPolicy.d.ts +55 -0
- package/ts3.4/state/reducer/expireReducer.d.ts +1 -0
- package/ts3.4/state/reducer/invalidateReducer.d.ts +1 -0
- package/ts3.4/state/reducer/setReducer.d.ts +3 -2
- package/ts3.4/state/reducer/setResponseReducer.d.ts +4 -2
- package/ts3.4/types.d.ts +1 -0
package/dist/index.umd.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@data-client/normalizr")):"function"==typeof define&&define.amd?define(["exports","@data-client/normalizr"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).RDC=e.RDC||{},e.RDC.Core={}),e.normalizr)}(this,(function(e,t){"use strict";function s(e,t){const s=Date.now();return{fetchedAt:null!=t?t:s,date:s,expiresAt:s+e}}const i="rdc/fetch",n="rdc/set",r="rdc/setresponse",o="rdc/optimistic",a="rdc/reset",c="rdc/subscribe",l="rdc/unsubscribe",h="rdc/invalidate",d="rdc/invalidateall",u="rdc/expireall",p="rdc/gc",f=i,y=n,g=r,m=o,v=a,E=c,L=l,b=h,S=d,I=u,O=p;var A=Object.freeze({__proto__:null,FETCH:i,SET:n,SET_RESPONSE:r,OPTIMISTIC:o,RESET:a,SUBSCRIBE:c,UNSUBSCRIBE:l,INVALIDATE:h,INVALIDATEALL:d,EXPIREALL:u,GC:p,FETCH_TYPE:f,SET_TYPE:y,SET_RESPONSE_TYPE:g,OPTIMISTIC_TYPE:m,RESET_TYPE:v,SUBSCRIBE_TYPE:E,UNSUBSCRIBE_TYPE:L,INVALIDATE_TYPE:b,INVALIDATEALL_TYPE:S,EXPIREALL_TYPE:I,GC_TYPE:O});function x(e,t,i){var n;return{type:o,key:e.key(...t),args:t,endpoint:e,meta:s(null!=(n=e.dataExpiryLength)?n:6e4,i)}}class w extends Error{}function k(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:R(e,t)}):Object.assign({},e,{meta:Object.assign({},e.meta,{[t.key]:{date:t.meta.date,error:s,expiresAt:t.meta.expiresAt,errorPolicy:null==t.endpoint.errorPolicy?void 0:t.endpoint.errorPolicy(s)}}),optimistic:R(e,t)})}function R(e,t){return e.optimistic.filter((e=>e.key!==t.key||(e.type===o?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}const T={entities:{},endpoints:{},indexes:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var j=Object.freeze({__proto__:null,MemoCache:t.MemoCache,INVALID:t.INVALID,initialState:T});function _(e,{args:t}){return{type:c,key:e.key(...t),args:t,endpoint:e}}function P(e,{args:t}){return{type:l,key:e.key(...t),args:t,endpoint:e}}var q="undefined"!=typeof FormData?e=>e instanceof FormData?Object.fromEntries(e.entries()):e:e=>e;function D(e,{args:t,fetchedAt:i,response:n,error:o=!1}){var a,c;const l=o?null!=(a=e.errorExpiryLength)?a:1e3:null!=(c=e.dataExpiryLength)?c:6e4;return{type:r,key:e.key(...t),response:n,args:t.map(q),endpoint:e,meta:s(l,i),error:o}}function M(e,{args:t,fetchedAt:i,value:r}){return{type:n,value:r,args:t.map(q),schema:e,meta:s(6e4,i)}}function C(){return{type:a,date:Date.now()}}function N(e){return{type:d,testKey:e}}function H(e,{args:t}){return{type:h,key:e.key(...t)}}function F(e,{args:t}){let s=0,n=0;const r=new Promise(((e,t)=>{[s,n]=[e,t]})),o={fetchedAt:Date.now(),resolve:s,reject:n,promise:r};return{type:i,key:e.key(...t),args:t,endpoint:e,meta:o}}function B(e){return{type:u,testKey:e}}var z=Object.freeze({__proto__:null,createSubscription:_,createUnsubscription:P,createSetResponse:D,createSet:M,createReset:C,createOptimistic:x,createMeta:s,createInvalidateAll:N,createInvalidate:H,createFetch:F,createExpireAll:B});function U(e,t){return e.meta[t]}const V=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},Y=()=>T;class K{constructor({dispatch:e=V,getState:s=Y,memo:i=new t.MemoCache}={}){this.fetch=(e,...s)=>{const i=F(e,{args:s});return this.dispatch(i),e.schema?i.meta.promise.then((i=>t.denormalize(e.schema,i,{},s))):i.meta.promise},this.fetchIfStale=(e,...s)=>{const{data:i,expiresAt:n,expiryStatus:r}=this.getResponse(e,...s,this.getState());return r!==t.ExpiryStatus.Invalid&&Date.now()<=n?i:this.fetch(e,...s)},this.invalidate=(e,...t)=>null!==t[0]?this.dispatch(H(e,{args:t})):Promise.resolve(),this.invalidateAll=e=>this.dispatch(N((t=>e.testKey(t)))),this.expireAll=e=>this.dispatch(B((t=>e.testKey(t)))),this.resetEntireStore=()=>this.dispatch(C()),this.setResponse=(e,...t)=>{const s=t[t.length-1],i=D(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(i)},this.setError=(e,...t)=>{const s=t[t.length-1],i=D(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(i)},this.resolve=(e,t)=>this.dispatch(D(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(_(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(P(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new $(this,e,t),this.dispatch=e,this.getState=s,this.memo=i}set(e,...t){const s=t[t.length-1],i=M(e,{args:t.slice(0,t.length-1),value:s});return this.dispatch(i)}getError(e,...t){if(null===t[0])return;const s=t[t.length-1],i=t.slice(0,t.length-1),n=e.key(...i),r=U(s,n);return void 0===s.endpoints[n]||"soft"!==(null==r?void 0:r.errorPolicy)?null==r?void 0:r.error:void 0}getResponse(e,...s){const i=s[s.length-1],n=s.slice(0,s.length-1).map(q),r=1!==n.length||null!==n[0],o=r?e.key(...n):"",a=r?i.endpoints[o]:void 0,c=e.schema,l=U(i,o);let h=null==l?void 0:l.expiresAt;const d=void 0===a&&void 0!==c,u=d?this.memo.buildQueryKey(c,n,i.entities,i.indexes,o):a;if(!r)return{data:u,expiryStatus:t.ExpiryStatus.Valid,expiresAt:1/0};let p=!1;if(d)p=!t.validateQueryKey(u);else if(!c||!X(c))return{data:a,expiryStatus:null!=l&&l.invalidated?t.ExpiryStatus.Invalid:a&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:h||0};const{data:f,paths:y}=this.memo.denormalize(c,u,i.entities,n);return!h&&p&&(h=1),this.getSchemaResponse(f,y,i.entityMeta,h,e.invalidIfStale||p,l)}get(e,...t){const s=t[t.length-1],i=t.slice(0,t.length-1).map(q);return this.memo.query(e,i,s.entities,s.indexes)}getSchemaResponse(e,s,i,n,r,o={}){const a="symbol"==typeof e;n||(n=function(e,t){let s=1/0;for(const{pk:n,key:r}of e){var i;const e=null==(i=t[r])||null==(i=i[n])?void 0:i.expiresAt;e<s&&(s=e)}return s}(s,i));return{data:e,expiryStatus:null!=o&&o.invalidated||a&&(null==o||!o.error)?t.ExpiryStatus.Invalid:a||r?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:n}}}function X(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&X(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?X(t):Object.values(t).some((e=>X(e)))}return!1}class ${constructor(e,t,s=0){this.state=void 0,this.controller=void 0,this.fetchedAt=void 0,this.abort=$.abort,this.state=t,this.controller=e,this.fetchedAt=s}getResponse(e,...t){return this.controller.getResponse(e,...t,this.state)}getError(e,...t){return this.controller.getError(e,...t,this.state)}get(e,...t){return this.controller.get(e,...t,this.state)}}$.abort=new w;class G extends Error{constructor(){super("Aborted due to RESET"),this.name="ResetError"}}class Q{isOnline(){return void 0===navigator.onLine||navigator.onLine}addOnlineListener(e){addEventListener("online",e)}removeOnlineListener(e){removeEventListener("online",e)}addOfflineListener(e){addEventListener("offline",e)}removeOfflineListener(e){removeEventListener("offline",e)}}class J{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let W;W="undefined"!=typeof navigator&&"function"==typeof addEventListener?Q:J;var Z=W;let ee={};class te{constructor(e,t){this.started=!1,this.actions=[],this.maxBufferLength=100,this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(Object.assign({},ee,e)),null!=e&&e.maxAge&&(this.maxBufferLength=2*e.maxAge),t&&(this.skipLogging=t)}handleAction(e,t){this.started?this.devTools.send(e,t):(this.actions.length>this.maxBufferLength&&(this.actions=this.actions.slice(this.maxBufferLength/2)),this.actions.push([e,t]))}init(e){}cleanup(){}}te.prototype.middleware=()=>e=>t=>e(t);Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},Object.defineProperty(e,"ExpiryStatus",{enumerable:!0,get:function(){return t.ExpiryStatus}}),e.Controller=K,e.DefaultConnectionListener=Z,e.DevToolsManager=te,e.LogoutManager=class{constructor({handleLogout:e,shouldLogout:t}={}){this.middleware=e=>t=>async s=>{await t(s),s.type===r&&s.error&&this.shouldLogout(s.response)&&this.handleLogout(e)},e&&(this.handleLogout=e),t&&(this.shouldLogout=t)}cleanup(){}shouldLogout(e){return 401===e.status}handleLogout(e){e.resetEntireStore()}},e.NetworkManager=class{constructor({dataExpiryLength:e=6e4,errorExpiryLength:t=1e3}={}){this.fetched=Object.create(null),this.resolvers={},this.rejectors={},this.fetchedAt={},this.controller=new K,this.middleware=e=>(this.controller=e,t=>s=>{switch(s.type){case i:return this.handleFetch(s),void 0!==s.endpoint.getOptimisticResponse&&s.endpoint.sideEffect?t(s):Promise.resolve();case r:return t(s).then((()=>{if(s.key in this.fetched){var t;const i=null==(t=e.getState().meta[s.key])?void 0:t.error;i?this.handleSet(D(s.endpoint,{args:s.args,response:i,fetchedAt:s.meta.fetchedAt,error:!0})):this.handleSet(s)}}));case a:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(s).then((()=>{for(const t in e)e[t](new G)}))}default:return t(s)}}),this.dataExpiryLength=e,this.errorExpiryLength=t}init(){delete this.cleanupDate}cleanup(){this.cleanupDate=Date.now()}skipLogging(e){return e.type===i&&e.key in this.fetched}allSettled(){const e=Object.values(this.fetched);if(e.length)return Promise.allSettled(e)}clearAll(){for(const e in this.rejectors)this.clear(e)}clear(e){this.fetched[e].catch((()=>{})),delete this.resolvers[e],delete this.rejectors[e],delete this.fetched[e],delete this.fetchedAt[e]}getLastReset(){return this.cleanupDate?this.cleanupDate:this.controller.getState().lastReset}handleFetch(e){const{resolve:t,reject:s,fetchedAt:i}=e.meta,n=!e.endpoint.sideEffect,r=()=>{let r=e.endpoint(...e.args);return n||(r=(e=>e.then((e=>(t(e),e))).catch((e=>{throw s(e),e})))(r)),r=r.then((t=>{let s=this.getLastReset();return i>=s&&this.controller.resolve(e.endpoint,{args:e.args,response:t,fetchedAt:i}),t})).catch((t=>{const s=this.getLastReset();throw i>=s&&this.controller.resolve(e.endpoint,{args:e.args,response:t,fetchedAt:i,error:!0}),t})),r};return n?this.throttle(e.key,r,i).then((e=>t(e))).catch((e=>s(e))):r().catch((()=>{}))}handleSet(e){if(e.key in this.fetched){let t;t=e.error?this.rejectors[e.key]:this.resolvers[e.key],t(e.response),this.clear(e.key)}}throttle(e,t,s){const i=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>i||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=s,this.idleCallback((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}idleCallback(e,t){e()}},e.PollingSubscription=class{constructor(e,t,s){if(this.frequencyHistogram=new Map,this.offlineListener=()=>{this.cleanup(),this.connectionListener.addOnlineListener(this.onlineListener)},this.onlineListener=()=>{this.connectionListener.removeOnlineListener(this.onlineListener);const e=Date.now();this.startId=setTimeout((()=>{this.startId&&(delete this.startId,this.update(),this.run())}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===e.endpoint.pollFrequency)throw new Error("frequency needed for polling subscription");this.endpoint=e.endpoint,this.frequency=e.endpoint.pollFrequency,this.args=e.args,this.key=e.key,this.frequencyHistogram.set(this.frequency,1),this.controller=t,this.connectionListener=s||new Z,this.connectionListener.isOnline()?this.onlineListener():this.offlineListener()}add(e){void 0!==e&&(this.frequencyHistogram.has(e)?this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)+1):(this.frequencyHistogram.set(e,1),e<this.frequency&&(this.frequency=e,this.run())))}remove(e){if(void 0===e)return!1;if(this.frequencyHistogram.has(e)&&(this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)-1),this.frequencyHistogram.get(e)<1)){if(this.frequencyHistogram.delete(e),0===this.frequencyHistogram.size)return this.cleanup(),!0;e<=this.frequency&&(this.frequency=Math.min(...this.frequencyHistogram.keys()),this.run())}return!1}cleanup(){this.intervalId&&(clearInterval(this.intervalId),delete this.intervalId),this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.startId&&(clearTimeout(this.startId),delete this.startId),this.connectionListener.removeOnlineListener(this.onlineListener),this.connectionListener.removeOfflineListener(this.offlineListener)}update(){const e=this.endpoint,t=function(...t){return e.call(this,...t)};Object.assign(t,this.endpoint),t.dataExpiryLength=this.frequency/2,t.errorExpiryLength=this.frequency/10,t.errorPolicy=()=>"soft",t.key=()=>this.key,this.controller.fetch(t,...this.args).catch((()=>null))}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.intervalId&&this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.controller.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=G,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.controller=new K,this.middleware=e=>(this.controller=e,e=>t=>{switch(t.type){case c:try{this.handleSubscribe(t)}catch(e){console.error(e)}return Promise.resolve();case l:return this.handleUnsubscribe(t),Promise.resolve();default:return e(t)}}),this.Subscription=e}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e){const t=e.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].add(s)}else this.subscriptions[t]=new this.Subscription(e,this.controller)}handleUnsubscribe(e){const t=e.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].remove(s)&&delete this.subscriptions[t]}}},e.__INTERNAL__=j,e.actionTypes=A,e.actions=z,e.applyManager=function(e,t){return e.map(((e,s)=>(e.middleware||(e.middleware=null==e.getMiddleware?void 0:e.getMiddleware()),({dispatch:i,getState:n})=>(0===s&&(t.dispatch=i,t.getState=n),e.middleware(t)))))},e.createReducer=function(e){return function(s,c){switch(s||(s=T),c.type){case p:return c.entities.forEach((([e,t])=>{var i,n;null==(i=s.entities[e])||delete i[t],null==(n=s.entityMeta[e])||delete n[t]})),c.endpoints.forEach((e=>{delete s.endpoints[e],delete s.meta[e]})),s;case i:return function(e,t){if(t.endpoint.getOptimisticResponse&&t.endpoint.sideEffect){const s=x(t.endpoint,t.args,t.meta.fetchedAt);return Object.assign({},e,{optimistic:[...e.optimistic,s]})}return e}(s,c);case o:case r:return function(e,s,i){if(s.error)return k(e,s,s.response);try{var n;let r;if(s.type===o){if(!s.endpoint.getOptimisticResponse)return e;try{r=s.endpoint.getOptimisticResponse.call(s.endpoint,i.snapshot(e,s.meta.fetchedAt),...s.args)}catch(t){if(t.constructor===w)return e;throw t}}else r=s.response;const{result:a,entities:c,indexes:l,entityMeta:h}=t.normalize(s.endpoint.schema,r,s.args,e,s.meta),d=Object.assign({},e.endpoints,{[s.key]:a});try{if(s.endpoint.update){const e=s.endpoint.update(a,...s.args);Object.keys(e).forEach((t=>{d[t]=e[t](d[t])}))}}catch(e){console.error(`The following error occured during Endpoint.update() for ${s.key}`),console.error(e)}return{entities:c,endpoints:d,indexes:l,meta:Object.assign({},e.meta,{[s.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(n=e.meta[s.key])?void 0:n.expiresAt}}),entityMeta:h,optimistic:R(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.key}\n\nFull Schema: ${JSON.stringify(s.endpoint.schema,void 0,2)}\n\nError:\n${t.message}`,"response"in s&&(t.response=s.response),t.status=400),k(e,s,t)}}(s,c,e);case n:return function(e,s,i){let n;if("function"==typeof s.value){const t=i.get(s.schema,...s.args,e);if(void 0===t)return e;n=s.value(t)}else n=s.value;try{const{entities:i,indexes:r,entityMeta:o}=t.normalize(s.schema,n,s.args,e,s.meta);return{entities:i,endpoints:e.endpoints,indexes:r,meta:e.meta,entityMeta:o,optimistic:e.optimistic,lastReset:e.lastReset}}catch(t){return e}}(s,c,e);case d:case h:return function(e,t){const s=Object.assign({},e.endpoints),i=Object.assign({},e.meta),n=e=>{delete s[e];const t=Object.assign({},i[e],{expiresAt:0,invalidated:!0});delete t.error,i[e]=t};return t.type===h?n(t.key):Object.keys(s).forEach((e=>{t.testKey(e)&&n(e)})),Object.assign({},e,{endpoints:s,meta:i})}(s,c);case u:return function(e,t){const s=Object.assign({},e.meta);return Object.keys(s).forEach((e=>{t.testKey(e)&&(s[e]=Object.assign({},s[e],{expiresAt:1}))})),Object.assign({},e,{meta:s})}(s,c);case a:return Object.assign({},T,{lastReset:c.date});default:return s}}},e.initialState=T,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).RDC=e.RDC||{},e.RDC.Core={}))}(this,(function(e){"use strict";const t=Symbol("INVALID");function n(e){return!("function"!=typeof e.hasOwnProperty||!(Object.hasOwnProperty.call(e,"__ownerID")||e._map&&Object.hasOwnProperty.call(e._map,"__ownerID")))}function i(e){return n(e)?({key:t,pk:n})=>e.getIn([t,n]):({key:t,pk:n})=>{var i;return null==(i=e[t])?void 0:i[n]}}class s{constructor(){this.localCache={}}getEntity(e,t,n,i){const s=t.key;s in this.localCache||(this.localCache[s]=Object.create(null));const r=this.localCache[s];return r[e]||i(r),r[e]}getResults(e,t,n){return{data:n(),paths:[]}}}const r={};function o(e){return null!==e&&void 0!==e.pk}const a=e=>e[0],c=e=>void 0!==e&&"symbol"!=typeof e,l=(e,t,n,i,s,r,o,c,l)=>{e=a(e);const h=(e=>Array.isArray(e)?e:Object.keys(e).map((t=>e[t])))(t);return h.map(((t,o)=>r(e,t,n,i,s)))},h=(e,t,n,i)=>(e=a(e),t.map?t.map((t=>i(e,t))).filter(c):t);function u(e,t,n,i,s){}function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)({}).hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e},d.apply(null,arguments)}const p=(e,t,n,i,s,r,o,a,c)=>{const l=d({},t);return Object.keys(e).forEach((n=>{const i=e[n],o=r(i,t[n],t,n,s);void 0===o?delete l[n]:l[n]=o})),l},f=(e,i,s,r)=>{if(n(i))return function(e,n,i,s){let r=!1;const o=Object.keys(e).reduce(((t,n)=>{const i=`${n}`,o=s(e[i],t.get(i));return"symbol"==typeof o&&(r=!0),t.has(i)?t.set(i,o):t}),n);return r?t:o}(e,i,0,r);const o=d({},i);let a=!1;return Object.keys(e).forEach((t=>{const n=r(e[t],o[t]);void 0!==o[t]&&(o[t]=n),"symbol"==typeof n&&(a=!0)})),a?t:o};function y(e,t,n,i,s){const r={};for(const o of Object.keys(e))r[o]=n(e[o],t,i,s);return r}function g(e,i,s,r,o,a){const c=o[r]=n(e)?i.createIfValid(e.toObject()):i.createIfValid(e);void 0===c?o[r]=t:"function"==typeof i.denormalize&&(o[r]=i.denormalize(c,a,s))}const m=(e,t,i)=>{function s(a,c){if(!a)return c;if(null==c)return c;if("function"==typeof a.denormalize)return o(a)?function(e,t,i,s,o,a){const c="object"==typeof t?t:o({key:e.key,pk:t});if("symbol"==typeof c&&"function"==typeof e.denormalize)return e.denormalize(c,i,s);if(void 0===c&&"object"!=typeof t&&""!==t&&"undefined"!==t)return a.getEntity(t,e,r,(e=>{e[t]=void 0}));if("object"!=typeof c||null===c)return c;let l="object"!=typeof t?t:e.pk(n(c)?c.toJS():c,void 0,void 0,i);return void 0===l||""===l||"undefined"===l?function(e){const t={};return e(t),t[""]}((t=>g(c,e,s,"",t,i))):("string"!=typeof l&&(l=`${l}`),a.getEntity(l,e,c,(t=>g(c,e,s,l,t,i))))}(a,c,i,s,e,t):a.denormalize(c,i,s);if("function"==typeof a)return a(c);if("object"==typeof a){return(Array.isArray(a)?h:f)(a,c,i,s)}return c}return(e,n)=>{const i=Object(n)===n&&Object(e)===e;return t.getResults(n,i,(()=>s(e,n)))}};class v{constructor(){this.next=new WeakMap,this.nextPath=void 0}get(e,t){let n=this.next.get(e);if(!n)return b;for(;n.nextPath;){var i;const e=null!=(i=t(n.nextPath))?i:r;if(n=n.next.get(e),!n)return b}return[n.value,n.journey]}set(e,t){if(e.length<1)throw new k;let n=this;for(const{entity:t,path:i}of e){let e=n.next.get(t);e||(e=new E,n.next.set(null!=t?t:r,e)),n.nextPath=i,n=e}n.nextPath=void 0,n.value=t,n.journey=e.map((e=>e.path))}}const b=[void 0,void 0];class E{constructor(){this.next=new WeakMap,this.value=void 0,this.journey=[],this.nextPath=void 0}}class k extends Error{constructor(...e){super(...e),this.message="Keys must include at least one member"}}const I=(e,n,i,s,r,o)=>(a,c,l)=>{const h=a.key;h in e||(e[h]={},i[h]=d({},i[h]),r[h]=d({},r[h]));const u=e[h][l];if(u)e[h][l]=a.merge(u,c);else{const t=i[h][l];let n;t&&(n=r[h][l])?(e[h][l]=a.mergeWithStore(n,o,t,c),r[h][l]=a.mergeMetaWithStore(n,o,t,c)):(e[h][l]=c,r[h][l]=o)}a.indexes&&(h in n||(n[h]={},s[h]=d({},s[h])),function(e,n,i,s,r,o){for(const a of n){a in i||(s[a]=i[a]={});const n=i[a];o[e]&&delete n[o[e][a]],o&&o[e]&&o[e][a]!==r[a]&&(n[o[e][a]]=t),a in r&&(n[r[a]]=e)}}(l,a.indexes,n[h],s[h],e[h][l],i[h])),i[h][l]=e[h][l]};class x{constructor(e,t,n){this.dependencies=[],this.cycleCache={},this.cycleIndex=-1,this.localCache={},this._getEntity=e,this.getCache=A(t),this.resultCache=n}getEntity(e,t,n,i){const s=t.key,{localCacheKey:r,cycleCacheKey:o}=this.getCacheKey(s);if(r[e])e in o?this.cycleIndex=o[e]:this.dependencies.push({entity:n,path:{key:s,pk:e}});else{const a=this.getCache(e,t),[c,l]=a.get(n,this._getEntity);if(l)return r[e]=c.value,this.dependencies.push(...c.dependencies),c.value;{const t=this.dependencies.length;o[e]=t,this.dependencies.push({entity:n,path:{key:s,pk:e}}),i(r),delete o[e];const c=this.dependencies.slice(-1===this.cycleIndex?t:this.cycleIndex),l={dependencies:c,value:r[e]};a.set(c,l),this.cycleIndex===t&&(this.cycleIndex=-1)}}return r[e]}getCacheKey(e){e in this.localCache||(this.localCache[e]=Object.create(null)),e in this.cycleCache||(this.cycleCache[e]=Object.create(null));return{localCacheKey:this.localCache[e],cycleCacheKey:this.cycleCache[e]}}getResults(e,t,n){if(!t)return{data:n(),paths:this.paths()};let[i,s]=this.resultCache.get(e,this._getEntity);return void 0===s?(i=n(),s=this.paths(),this.dependencies.unshift({entity:e,path:{key:"",pk:""}}),this.resultCache.set(this.dependencies,i)):s.shift(),{data:i,paths:s}}paths(){return this.dependencies.map((e=>e.path))}}const A=e=>(t,n)=>{var i;const s=n.key,r=null!=(i=n.cacheWith)?i:n;s in e||(e[s]=Object.create(null));const o=e[s];o[t]||(o[t]=new WeakMap);let a=o[t].get(r);return a||(a=new v,o[t].set(r,a)),a};function S(e,t,n,i){if(function(e){return!!e&&"function"==typeof e.queryKey}(e))return e.queryKey(t,S,n,i);if("object"==typeof e&&e){return(Array.isArray(e)?u:y)(e,t,S,n,i)}return e}function L(e){return void 0!==e&&(!(e&&"object"==typeof e&&!Array.isArray(e))||Object.values(e).every(L))}class w{constructor(){this.entities={},this.endpoints=new v,this.queryKeys={}}denormalize(e,t,n,s=[]){if(void 0===e)return{data:t,paths:[]};if(void 0===t)return{data:void 0,paths:[]};const r=i(n);return m(r,new x(r,this.entities,this.endpoints),s)(e,t)}query(e,t,n,i,s=JSON.stringify(t)){const r=this.buildQueryKey(e,t,n,i,s);if(!r)return;const{data:o}=this.denormalize(e,r,n,t);return"symbol"==typeof o?void 0:o}buildQueryKey(e,t,i,s,r=JSON.stringify(t)){if("object"!=typeof e&&"function"!=typeof e.queryKey||!e)return e;this.queryKeys[r]||(this.queryKeys[r]=new v);const o=this.queryKeys[r],a=C(i),c=function(e){const t=n(e);return t?(t,n,i)=>{var s;return null==(s=e.getIn([t,n]))||null==s.toJS?void 0:s.toJS()}:(t,n,i)=>e[t]?e[t][n]:{}}(s);let[l,h]=o.get(e,function(e,t){return n=>3===n.length?t(...n):e(...n)}(a,c));if(!h){const n=[{path:[""],entity:e}];l=S(e,t,O(a,n),O(c,n)),o.set(n,l)}return l}}function O(e,t){return(...n)=>{const i=e(...n);return t.push({path:n,entity:i}),i}}function C(e){return n(e)?(...t)=>{var n;return null==(n=e.getIn(t))||null==n.toJS?void 0:n.toJS()}:(t,n)=>{var i;return n?null==(i=e[t])?void 0:i[n]:e[t]}}const R=(e,t,n=[],{entities:i,indexes:s,entityMeta:r}=j,o={fetchedAt:0,date:Date.now(),expiresAt:1/0})=>{if(null==e)return{result:t,entities:i,indexes:s,entityMeta:r};const a=function(e){return["object","function"].includes(typeof e)?"object":typeof e}(e);if(null===t||typeof t!==a&&(void 0===e.key||void 0!==e.pk||"string"!=typeof t))throw new Error(`Unexpected input given to normalize. Expected type to be "${a}", found "${null===t?"null":typeof t}".`);const c={result:"",entities:d({},i),indexes:d({},s),entityMeta:d({},r)},h=((e,t)=>{const n=function(){const e={};return function(t,n,i){return t in e||(e[t]={}),n in e[t]||(e[t][n]=[]),!!e[t][n].some((e=>e===i))||(e[t][n].push(i),!1)}}(),i=(s,r,o,a,c)=>r&&s?s.normalize&&"function"==typeof s.normalize?"object"!=typeof r?s.pk?`${r}`:r:s.normalize(r,o,a,c,i,e,t,n):"object"!=typeof r||"object"!=typeof s?r:(Array.isArray(s)?l:p)(s,r,o,a,c,i):r;return i})(I({},{},c.entities,c.indexes,c.entityMeta,o),C(i));return c.result=h(e,t,t,void 0,n),c};const j={entities:{},indexes:{},entityMeta:{}};var _={Invalid:1,InvalidIfStale:2,Valid:3};function M(e,t){const n=Date.now();return{fetchedAt:null!=t?t:n,date:n,expiresAt:n+e}}const P="rdc/fetch",T="rdc/set",q="rdc/setresponse",D="rdc/optimistic",K="rdc/reset",N="rdc/subscribe",z="rdc/unsubscribe",H="rdc/invalidate",Q="rdc/invalidateall",F="rdc/expireall",V="rdc/gc",B=P,U=T,Y=q,J=D,$=K,W=N,X=z,G=H,Z=Q,ee=F,te=V;var ne=Object.freeze({__proto__:null,EXPIREALL:F,EXPIREALL_TYPE:ee,FETCH:P,FETCH_TYPE:B,GC:V,GC_TYPE:te,INVALIDATE:H,INVALIDATEALL:Q,INVALIDATEALL_TYPE:Z,INVALIDATE_TYPE:G,OPTIMISTIC:D,OPTIMISTIC_TYPE:J,RESET:K,RESET_TYPE:$,SET:T,SET_RESPONSE:q,SET_RESPONSE_TYPE:Y,SET_TYPE:U,SUBSCRIBE:N,SUBSCRIBE_TYPE:W,UNSUBSCRIBE:z,UNSUBSCRIBE_TYPE:X});function ie(e,t,n){var i;return{type:D,key:e.key(...t),args:t,endpoint:e,meta:M(null!=(i=e.dataExpiryLength)?i:6e4,n)}}class se extends Error{}function re(e,t,n){return"AbortError"===n.name?d({},e,{optimistic:oe(e,t)}):d({},e,{meta:d({},e.meta,{[t.key]:{date:t.meta.date,fetchedAt:t.meta.fetchedAt,expiresAt:t.meta.expiresAt,error:n,errorPolicy:null==t.endpoint.errorPolicy?void 0:t.endpoint.errorPolicy(n)}}),optimistic:oe(e,t)})}function oe(e,t){return e.optimistic.filter((e=>e.key!==t.key||(e.type===D?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}const ae={entities:{},endpoints:{},indexes:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var ce=Object.freeze({__proto__:null,INVALID:t,MemoCache:w,initialState:ae});function le(e,{args:t}){return{type:N,key:e.key(...t),args:t,endpoint:e}}function he(e,{args:t}){return{type:z,key:e.key(...t),args:t,endpoint:e}}const ue="undefined"!=typeof FormData?e=>e instanceof FormData?Object.fromEntries(e.entries()):e:e=>e;function de(e,{args:t,fetchedAt:n,response:i,error:s=!1}){var r,o;const a=s?null!=(r=e.errorExpiryLength)?r:1e3:null!=(o=e.dataExpiryLength)?o:6e4;return{type:q,key:e.key(...t),response:i,args:t.map(ue),endpoint:e,meta:M(a,n),error:s}}function pe(e,{args:t,fetchedAt:n,value:i}){return{type:T,value:i,args:t.map(ue),schema:e,meta:M(6e4,n)}}function fe(){return{type:K,date:Date.now()}}function ye(e){return{type:Q,testKey:e}}function ge(e,{args:t}){return{type:H,key:e.key(...t)}}function me(e,{args:t}){let n=0,i=0;const s=new Promise(((e,t)=>{[n,i]=[e,t]})),r={fetchedAt:Date.now(),resolve:n,reject:i,promise:s};return{type:P,key:e.key(...t),args:t,endpoint:e,meta:r}}function ve(e){return{type:F,testKey:e}}var be=Object.freeze({__proto__:null,createExpireAll:ve,createFetch:me,createInvalidate:ge,createInvalidateAll:ye,createMeta:M,createOptimistic:ie,createReset:fe,createSet:pe,createSetResponse:de,createSubscription:le,createUnsubscription:he});class Ee{init(){}cleanup(){}createCountRef(){return()=>()=>{}}}function ke(e,t){return e.meta[t]}const Ie=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},xe=()=>ae;class Ae{constructor({dispatch:e=Ie,getState:t=xe,memo:n=new w,gcPolicy:r=new Ee}={}){this.fetch=(e,...t)=>{const n=me(e,{args:t});return this.dispatch(n),e.schema?n.meta.promise.then((n=>function(e,t,n,r=[]){return void 0===e||void 0===t?t:m(i(n),new s,r)(e,t).data}(e.schema,n,{},t))):n.meta.promise},this.fetchIfStale=(e,...t)=>{const{data:n,expiresAt:i,expiryStatus:s}=this.getResponse(e,...t,this.getState());return s!==_.Invalid&&Date.now()<=i?n:this.fetch(e,...t)},this.invalidate=(e,...t)=>null!==t[0]?this.dispatch(ge(e,{args:t})):Promise.resolve(),this.invalidateAll=e=>this.dispatch(ye((t=>e.testKey(t)))),this.expireAll=e=>this.dispatch(ve((t=>e.testKey(t)))),this.resetEntireStore=()=>this.dispatch(fe()),this.setResponse=(e,...t)=>{const n=t[t.length-1],i=de(e,{args:t.slice(0,t.length-1),response:n});return this.dispatch(i)},this.setError=(e,...t)=>{const n=t[t.length-1],i=de(e,{args:t.slice(0,t.length-1),response:n,error:!0});return this.dispatch(i)},this.resolve=(e,t)=>this.dispatch(de(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(le(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(he(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new Le(this,e,t),this._dispatch=e,this.getState=t,this.memo=n,this.gcPolicy=r}set dispatch(e){this._dispatch=e}get dispatch(){return this._dispatch}bindMiddleware({dispatch:e,getState:t}){this._dispatch=e,this.getState=t}set(e,...t){const n=t[t.length-1],i=pe(e,{args:t.slice(0,t.length-1),value:n});return this.dispatch(i)}getError(e,...t){if(null===t[0])return;const n=t[t.length-1],i=t.slice(0,t.length-1),s=e.key(...i),r=ke(n,s);return void 0===n.endpoints[s]||"soft"!==(null==r?void 0:r.errorPolicy)?null==r?void 0:r.error:void 0}getResponse(e,...t){return this.getResponseMeta(e,...t)}getResponseMeta(e,...t){const n=t[t.length-1],i=t.slice(0,t.length-1).map(ue),s=1!==i.length||null!==i[0],r=s?e.key(...i):"",o=s?n.endpoints[r]:void 0,a=e.schema,c=ke(n,r);let l=null==c?void 0:c.expiresAt;const h=void 0===o&&void 0!==a,u=h?this.memo.buildQueryKey(a,i,n.entities,n.indexes,r):o;if(!s)return{data:u,expiryStatus:_.Valid,expiresAt:1/0,countRef:()=>()=>{}};let d=!1;if(h)d=!L(u);else if(!a||!Se(a))return{data:o,expiryStatus:null!=c&&c.invalidated?_.Invalid:o&&!e.invalidIfStale?_.Valid:_.InvalidIfStale,expiresAt:l||0,countRef:this.gcPolicy.createCountRef({key:r})};const{data:p,paths:f}=this.memo.denormalize(a,u,n.entities,i);return!l&&d&&(l=1),this.getSchemaResponse(p,r,f,n.entityMeta,l,e.invalidIfStale||d,c)}get(e,...t){const n=t[t.length-1],i=t.slice(0,t.length-1).map(ue);return this.memo.query(e,i,n.entities,n.indexes)}getQueryMeta(e,...t){const n=t[t.length-1],i=t.slice(0,t.length-1).map(ue),s=this.memo.buildQueryKey(e,i,n.entities,n.indexes,JSON.stringify(i));if(!s)return{data:void 0,countRef:()=>()=>{}};const{data:r,paths:o}=this.memo.denormalize(e,s,n.entities,i);return{data:"symbol"==typeof r?void 0:r,countRef:this.gcPolicy.createCountRef({paths:o})}}getSchemaResponse(e,t,n,i,s,r,o={}){const a="symbol"==typeof e;s||(s=function(e,t){let n=1/0;for(const{pk:s,key:r}of e){var i;const e=null==(i=t[r])||null==(i=i[s])?void 0:i.expiresAt;e<n&&(n=e)}return n}(n,i));return{data:e,expiryStatus:null!=o&&o.invalidated||a&&(null==o||!o.error)?_.Invalid:a||r?_.InvalidIfStale:_.Valid,expiresAt:s,countRef:this.gcPolicy.createCountRef({key:t,paths:n})}}}function Se(e){if(o(e))return!0;if(Array.isArray(e))return 0!==e.length&&Se(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?Se(t):Object.values(t).some((e=>Se(e)))}return!1}class Le{constructor(e,t,n=0){this.state=void 0,this.controller=void 0,this.fetchedAt=void 0,this.abort=Le.abort,this.state=t,this.controller=e,this.fetchedAt=n}getResponse(e,...t){return this.controller.getResponse(e,...t,this.state)}getResponseMeta(e,...t){return this.controller.getResponseMeta(e,...t,this.state)}getError(e,...t){return this.controller.getError(e,...t,this.state)}get(e,...t){return this.controller.get(e,...t,this.state)}getQueryMeta(e,...t){return this.controller.getQueryMeta(e,...t,this.state)}}Le.abort=new se;class we extends Error{constructor(){super("Aborted due to RESET"),this.name="ResetError"}}class Oe{isOnline(){return void 0===navigator.onLine||navigator.onLine}addOnlineListener(e){addEventListener("online",e)}removeOnlineListener(e){removeEventListener("online",e)}addOfflineListener(e){addEventListener("offline",e)}removeOfflineListener(e){removeEventListener("offline",e)}}class Ce{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let Re;Re="undefined"!=typeof navigator&&"function"==typeof addEventListener?Oe:Ce;var je=Re;let _e={};class Me{constructor(e,t){this.started=!1,this.actions=[],this.maxBufferLength=100,this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(d({},_e,e)),null!=e&&e.maxAge&&(this.maxBufferLength=2*e.maxAge),t&&(this.skipLogging=t)}handleAction(e,t){this.started?this.devTools.send(e,t):(this.actions.length>this.maxBufferLength&&(this.actions=this.actions.slice(this.maxBufferLength/2)),this.actions.push([e,t]))}init(e){}cleanup(){}}Me.prototype.middleware=()=>e=>t=>e(t);e.Controller=Ae,e.DefaultConnectionListener=je,e.DevToolsManager=Me,e.ExpiryStatus=_,e.GCPolicy=class{constructor({intervalMS:e=3e5,expiryMultiplier:t=2,expiresAt:n}={}){this.endpointCount=new Map,this.entityCount=new Map,this.endpointsQ=new Set,this.entitiesQ=[],n&&(this.expiresAt=n.bind(this)),this.options={intervalMS:e,expiryMultiplier:t}}init(e){this.controller=e,this.intervalId=setInterval((()=>{this.idleCallback((()=>this.runSweep()),{timeout:1e3})}),this.options.intervalMS)}cleanup(){clearInterval(this.intervalId)}createCountRef({key:e,paths:t=[]}){return()=>{var n;return e&&this.endpointCount.set(e,(null!=(n=this.endpointCount.get(e))?n:0)+1),t.forEach((e=>{var t;this.entityCount.has(e.key)||this.entityCount.set(e.key,new Map);const n=this.entityCount.get(e.key);n.set(e.pk,(null!=(t=n.get(e.pk))?t:0)+1)})),()=>{if(e){const t=this.endpointCount.get(e);void 0!==t&&(t<=1?(this.endpointCount.delete(e),this.endpointsQ.add(e)):this.endpointCount.set(e,t-1))}t.forEach((e=>{if(!this.entityCount.has(e.key))return;const t=this.entityCount.get(e.key),n=t.get(e.pk);void 0!==n&&(n<=1?(t.delete(e.pk),this.entitiesQ.push(e)):t.set(e.pk,n-1))}))}}}expiresAt({fetchedAt:e,expiresAt:t}){return Math.max((t-e)*this.options.expiryMultiplier,12e4)+e}runSweep(){const e=this.controller.getState(),t=[],n=[],i=Date.now(),s=new Set;for(const t of this.endpointsQ){var r;!this.endpointCount.has(t)&&this.expiresAt(null!=(r=e.meta[t])?r:{fetchedAt:0,date:0,expiresAt:0})<i?n.push(t):s.add(t)}this.endpointsQ=s;const o=[];for(const n of this.entitiesQ){var a,c,l;(null==(a=this.entityCount.get(n.key))||!a.has(n.pk))&&this.expiresAt(null!=(c=null==(l=e.entityMeta[n.key])?void 0:l[n.pk])?c:{fetchedAt:0,date:0,expiresAt:0})<i?t.push(n):o.push(n)}this.entitiesQ=o,(t.length||n.length)&&this.controller.dispatch({type:V,entities:t,endpoints:n})}idleCallback(e,t){"function"==typeof requestIdleCallback?requestIdleCallback(e,t):e()}},e.ImmortalGCPolicy=Ee,e.LogoutManager=class{constructor({handleLogout:e,shouldLogout:t}={}){this.middleware=e=>t=>async n=>{await t(n),n.type===q&&n.error&&this.shouldLogout(n.response)&&this.handleLogout(e)},e&&(this.handleLogout=e),t&&(this.shouldLogout=t)}cleanup(){}shouldLogout(e){return 401===e.status}handleLogout(e){e.resetEntireStore()}},e.NetworkManager=class{constructor({dataExpiryLength:e=6e4,errorExpiryLength:t=1e3}={}){this.fetched=Object.create(null),this.resolvers={},this.rejectors={},this.fetchedAt={},this.controller=new Ae,this.middleware=e=>(this.controller=e,t=>n=>{switch(n.type){case P:return this.handleFetch(n),void 0!==n.endpoint.getOptimisticResponse&&n.endpoint.sideEffect?t(n):Promise.resolve();case q:return t(n).then((()=>{if(n.key in this.fetched){var t;const i=null==(t=e.getState().meta[n.key])?void 0:t.error;i?this.handleSet(de(n.endpoint,{args:n.args,response:i,fetchedAt:n.meta.fetchedAt,error:!0})):this.handleSet(n)}}));case K:{const e=d({},this.rejectors);return this.clearAll(),t(n).then((()=>{for(const t in e)e[t](new we)}))}default:return t(n)}}),this.dataExpiryLength=e,this.errorExpiryLength=t}init(){delete this.cleanupDate}cleanup(){this.cleanupDate=Date.now()}skipLogging(e){return e.type===P&&e.key in this.fetched}allSettled(){const e=Object.values(this.fetched);if(e.length)return Promise.allSettled(e)}clearAll(){for(const e in this.rejectors)this.clear(e)}clear(e){this.fetched[e].catch((()=>{})),delete this.resolvers[e],delete this.rejectors[e],delete this.fetched[e],delete this.fetchedAt[e]}getLastReset(){return this.cleanupDate?this.cleanupDate:this.controller.getState().lastReset}handleFetch(e){const{resolve:t,reject:n,fetchedAt:i}=e.meta,s=!e.endpoint.sideEffect,r=()=>{let r=e.endpoint(...e.args);return s||(r=(e=>e.then((e=>(t(e),e))).catch((e=>{throw n(e),e})))(r)),r=r.then((t=>{let n=this.getLastReset();return i>=n&&this.controller.resolve(e.endpoint,{args:e.args,response:t,fetchedAt:i}),t})).catch((t=>{const n=this.getLastReset();throw i>=n&&this.controller.resolve(e.endpoint,{args:e.args,response:t,fetchedAt:i,error:!0}),t})),r};return s?this.throttle(e.key,r,i).then((e=>t(e))).catch((e=>n(e))):r().catch((()=>{}))}handleSet(e){if(e.key in this.fetched){let t;t=e.error?this.rejectors[e.key]:this.resolvers[e.key],t(e.response),this.clear(e.key)}}throttle(e,t,n){const i=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>i||(this.fetched[e]=new Promise(((t,n)=>{this.resolvers[e]=t,this.rejectors[e]=n})),this.fetchedAt[e]=n,this.idleCallback((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}idleCallback(e,t){e()}},e.PollingSubscription=class{constructor(e,t,n){if(this.frequencyHistogram=new Map,this.offlineListener=()=>{this.cleanup(),this.connectionListener.addOnlineListener(this.onlineListener)},this.onlineListener=()=>{this.connectionListener.removeOnlineListener(this.onlineListener);const e=Date.now();this.startId=setTimeout((()=>{this.startId&&(delete this.startId,this.update(),this.run())}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===e.endpoint.pollFrequency)throw new Error("frequency needed for polling subscription");this.endpoint=e.endpoint,this.frequency=e.endpoint.pollFrequency,this.args=e.args,this.key=e.key,this.frequencyHistogram.set(this.frequency,1),this.controller=t,this.connectionListener=n||new je,this.connectionListener.isOnline()?this.onlineListener():this.offlineListener()}add(e){void 0!==e&&(this.frequencyHistogram.has(e)?this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)+1):(this.frequencyHistogram.set(e,1),e<this.frequency&&(this.frequency=e,this.run())))}remove(e){if(void 0===e)return!1;if(this.frequencyHistogram.has(e)&&(this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)-1),this.frequencyHistogram.get(e)<1)){if(this.frequencyHistogram.delete(e),0===this.frequencyHistogram.size)return this.cleanup(),!0;e<=this.frequency&&(this.frequency=Math.min(...this.frequencyHistogram.keys()),this.run())}return!1}cleanup(){this.intervalId&&(clearInterval(this.intervalId),delete this.intervalId),this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.startId&&(clearTimeout(this.startId),delete this.startId),this.connectionListener.removeOnlineListener(this.onlineListener),this.connectionListener.removeOfflineListener(this.offlineListener)}update(){const e=this.endpoint,t=function(...t){return e.call(this,...t)};Object.assign(t,this.endpoint),t.dataExpiryLength=this.frequency/2,t.errorExpiryLength=this.frequency/10,t.errorPolicy=()=>"soft",t.key=()=>this.key,this.controller.fetch(t,...this.args).catch((()=>null))}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.intervalId&&this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.controller.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=we,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.controller=new Ae,this.middleware=e=>(this.controller=e,e=>t=>{switch(t.type){case N:try{this.handleSubscribe(t)}catch(e){console.error(e)}return Promise.resolve();case z:return this.handleUnsubscribe(t),Promise.resolve();default:return e(t)}}),this.Subscription=e}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e){const t=e.key;if(t in this.subscriptions){const n=e.endpoint.pollFrequency;this.subscriptions[t].add(n)}else this.subscriptions[t]=new this.Subscription(e,this.controller)}handleUnsubscribe(e){const t=e.key;if(t in this.subscriptions){const n=e.endpoint.pollFrequency;this.subscriptions[t].remove(n)&&delete this.subscriptions[t]}}},e.__INTERNAL__=ce,e.actionTypes=ne,e.actions=be,e.applyManager=function(e,t){return e.map(((e,n)=>(e.middleware||(e.middleware=null==e.getMiddleware?void 0:e.getMiddleware()),i=>(0===n&&t.bindMiddleware(i),e.middleware(t)))))},e.createReducer=function(e){return function(t,n){switch(t||(t=ae),n.type){case V:return n.entities.forEach((({key:e,pk:n})=>{var i,s;null==(i=t.entities[e])||delete i[n],null==(s=t.entityMeta[e])||delete s[n]})),n.endpoints.forEach((e=>{delete t.endpoints[e],delete t.meta[e]})),t;case P:return function(e,t){if(t.endpoint.getOptimisticResponse&&t.endpoint.sideEffect){const n=ie(t.endpoint,t.args,t.meta.fetchedAt);return d({},e,{optimistic:[...e.optimistic,n]})}return e}(t,n);case D:case q:return function(e,t,n){if(t.error)return re(e,t,t.response);try{var i;let s;if(t.type===D){if(!t.endpoint.getOptimisticResponse)return e;try{s=t.endpoint.getOptimisticResponse.call(t.endpoint,n.snapshot(e,t.meta.fetchedAt),...t.args)}catch(t){if(t.constructor===se)return e;throw t}}else s=t.response;const{result:r,entities:o,indexes:a,entityMeta:c}=R(t.endpoint.schema,s,t.args,e,t.meta),l=d({},e.endpoints,{[t.key]:r});try{if(t.endpoint.update){const e=t.endpoint.update(r,...t.args);Object.keys(e).forEach((t=>{l[t]=e[t](l[t])}))}}catch(e){console.error(`The following error occured during Endpoint.update() for ${t.key}`),console.error(e)}return{entities:o,endpoints:l,indexes:a,meta:d({},e.meta,{[t.key]:{date:t.meta.date,fetchedAt:t.meta.fetchedAt,expiresAt:t.meta.expiresAt,prevExpiresAt:null==(i=e.meta[t.key])?void 0:i.expiresAt}}),entityMeta:c,optimistic:oe(e,t),lastReset:e.lastReset}}catch(n){return"object"==typeof n&&(n.message=`Error processing ${t.key}\n\nFull Schema: ${JSON.stringify(t.endpoint.schema,void 0,2)}\n\nError:\n${n.message}`,"response"in t&&(n.response=t.response),n.status=400),re(e,t,n)}}(t,n,e);case T:return function(e,t,n){let i;if("function"==typeof t.value){const s=n.get(t.schema,...t.args,e);if(void 0===s)return e;i=t.value(s)}else i=t.value;try{const{entities:n,indexes:s,entityMeta:r}=R(t.schema,i,t.args,e,t.meta);return{entities:n,endpoints:e.endpoints,indexes:s,meta:e.meta,entityMeta:r,optimistic:e.optimistic,lastReset:e.lastReset}}catch(t){return e}}(t,n,e);case Q:case H:return function(e,t){const n=d({},e.endpoints),i=d({},e.meta),s=e=>{delete n[e];const t=d({},i[e],{expiresAt:0,invalidated:!0});delete t.error,i[e]=t};return t.type===H?s(t.key):Object.keys(n).forEach((e=>{t.testKey(e)&&s(e)})),d({},e,{endpoints:n,meta:i})}(t,n);case F:return function(e,t){const n=d({},e.meta);return Object.keys(n).forEach((e=>{t.testKey(e)&&(n[e]=d({},n[e],{expiresAt:1}))})),d({},e,{meta:n})}(t,n);case K:return d({},ae,{lastReset:n.date});default:return t}}},e.initManager=function(e,t,n){return()=>(e.forEach((e=>{null==e.init||e.init(n)})),t.gcPolicy.init(t),()=>{e.forEach((e=>{e.cleanup()})),t.gcPolicy.cleanup()})},e.initialState=ae}));
|
package/legacy/actions.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBEZW5vcm1hbGl6ZSxcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEVudGl0eVBhdGgsXG4gIFF1ZXJ5YWJsZSxcbiAgUmVzb2x2ZVR5cGUsXG4gIFVua25vd25FcnJvcixcbn0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5cbmltcG9ydCB0eXBlIHtcbiAgU0VULFxuICBSRVNFVCxcbiAgRkVUQ0gsXG4gIFNVQlNDUklCRSxcbiAgVU5TVUJTQ1JJQkUsXG4gIElOVkFMSURBVEUsXG4gIEdDLFxuICBPUFRJTUlTVElDLFxuICBJTlZBTElEQVRFQUxMLFxuICBFWFBJUkVBTEwsXG4gIFNFVF9SRVNQT05TRSxcbn0gZnJvbSAnLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50VXBkYXRlRnVuY3Rpb24gfSBmcm9tICcuL2NvbnRyb2xsZXIvdHlwZXMuanMnO1xuXG50eXBlIEVuZHBvaW50QW5kVXBkYXRlPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4gPSBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbn07XG50eXBlIEVuZHBvaW50RGVmYXVsdCA9IEVuZHBvaW50SW50ZXJmYWNlICYge1xuICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEVuZHBvaW50SW50ZXJmYWNlPjtcbn07XG5cbi8qKiBHZW5lcmFsIG1ldGEtZGF0YSBmb3Igb3BlcmF0b3JzICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbk1ldGEge1xuICByZWFkb25seSBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZGF0ZTogbnVtYmVyO1xuICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuLyoqIEFjdGlvbiBmb3IgQ29udHJvbGxlci5zZXQoKSAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXRBY3Rpb248UyBleHRlbmRzIFF1ZXJ5YWJsZSA9IGFueT4ge1xuICB0eXBlOiB0eXBlb2YgU0VUO1xuICBzY2hlbWE6IFM7XG4gIGFyZ3M6IHJlYWRvbmx5IGFueVtdO1xuICBtZXRhOiBBY3Rpb25NZXRhO1xuICB2YWx1ZToge30gfCAoKHByZXZpb3VzVmFsdWU6IERlbm9ybWFsaXplPFM+KSA9PiB7fSk7XG59XG5cbi8qIHNldFJlc3BvbnNlICovXG5leHBvcnQgaW50ZXJmYWNlIFNldFJlc3BvbnNlQWN0aW9uQmFzZTxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiB7XG4gIHR5cGU6IHR5cGVvZiBTRVRfUkVTUE9OU0U7XG4gIGVuZHBvaW50OiBFO1xuICBhcmdzOiByZWFkb25seSBhbnlbXTtcbiAga2V5OiBzdHJpbmc7XG4gIG1ldGE6IEFjdGlvbk1ldGE7XG59XG5leHBvcnQgaW50ZXJmYWNlIFNldFJlc3BvbnNlQWN0aW9uU3VjY2VzczxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiBleHRlbmRzIFNldFJlc3BvbnNlQWN0aW9uQmFzZTxFPiB7XG4gIHJlc3BvbnNlOiBSZXNvbHZlVHlwZTxFPjtcbiAgZXJyb3I/OiBmYWxzZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2V0UmVzcG9uc2VBY3Rpb25FcnJvcjxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiBleHRlbmRzIFNldFJlc3BvbnNlQWN0aW9uQmFzZTxFPiB7XG4gIHJlc3BvbnNlOiBVbmtub3duRXJyb3I7XG4gIGVycm9yOiB0cnVlO1xufVxuLyoqIEFjdGlvbiBmb3IgQ29udHJvbGxlci5zZXRSZXNwb25zZSgpICovXG5leHBvcnQgdHlwZSBTZXRSZXNwb25zZUFjdGlvbjxcbiAgRSBleHRlbmRzIEVuZHBvaW50QW5kVXBkYXRlPEU+ID0gRW5kcG9pbnREZWZhdWx0LFxuPiA9IFNldFJlc3BvbnNlQWN0aW9uU3VjY2VzczxFPiB8IFNldFJlc3BvbnNlQWN0aW9uRXJyb3I8RT47XG5cbi8qIEZFVENIICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoTWV0YSB7XG4gIGZldGNoZWRBdDogbnVtYmVyO1xuICByZXNvbHZlOiAodmFsdWU/OiBhbnkgfCBQcm9taXNlTGlrZTxhbnk+KSA9PiB2b2lkO1xuICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIHByb21pc2U6IFByb21pc2VMaWtlPGFueT47XG59XG5cbi8qKiBBY3Rpb24gZm9yIENvbnRyb2xsZXIuZmV0Y2goKSAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaEFjdGlvbjxFIGV4dGVuZHMgRW5kcG9pbnRBbmRVcGRhdGU8RT4gPSBFbmRwb2ludERlZmF1bHQ+IHtcbiAgdHlwZTogdHlwZW9mIEZFVENIO1xuICBlbmRwb2ludDogRTtcbiAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICBrZXk6IHN0cmluZztcbiAgbWV0YTogRmV0Y2hNZXRhO1xufVxuXG4vKiBPUFRJTUlTVElDICovXG4vKiogQWN0aW9uIGZvciBFbmRwb2ludC5nZXRPcHRpbWlzdGljUmVzcG9uc2UoKSAqL1xuZXhwb3J0IGludGVyZmFjZSBPcHRpbWlzdGljQWN0aW9uPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRBbmRVcGRhdGU8RT4gPSBFbmRwb2ludERlZmF1bHQsXG4+IHtcbiAgdHlwZTogdHlwZW9mIE9QVElNSVNUSUM7XG4gIGVuZHBvaW50OiBFO1xuICBhcmdzOiByZWFkb25seSBhbnlbXTtcbiAga2V5OiBzdHJpbmc7XG4gIG1ldGE6IEFjdGlvbk1ldGE7XG4gIGVycm9yPzogZmFsc2U7XG59XG5cbi8qIFNVQlNDUklCRSAqL1xuLyoqIEFjdGlvbiBmb3IgQ29udHJvbGxlci5zdWJzY3JpYmUoKSAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmVBY3Rpb248XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEFuZFVwZGF0ZTxFPiA9IEVuZHBvaW50RGVmYXVsdCxcbj4ge1xuICB0eXBlOiB0eXBlb2YgU1VCU0NSSUJFO1xuICBlbmRwb2ludDogRTtcbiAgYXJnczogcmVhZG9ubHkgYW55W107XG4gIGtleTogc3RyaW5nO1xufVxuXG4vKiogQWN0aW9uIGZvciBDb250cm9sbGVyLnVuc3Vic2NyaWJlKCkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zdWJzY3JpYmVBY3Rpb248XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEFuZFVwZGF0ZTxFPiA9IEVuZHBvaW50RGVmYXVsdCxcbj4ge1xuICB0eXBlOiB0eXBlb2YgVU5TVUJTQ1JJQkU7XG4gIGVuZHBvaW50OiBFO1xuICBhcmdzOiByZWFkb25seSBhbnlbXTtcbiAga2V5OiBzdHJpbmc7XG59XG5cbi8qIEVYUElSWSAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBpcmVBbGxBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgRVhQSVJFQUxMO1xuICB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbi8qIElOVkFMSURBVEUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZGF0ZUFsbEFjdGlvbiB7XG4gIHR5cGU6IHR5cGVvZiBJTlZBTElEQVRFQUxMO1xuICB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZGF0ZUFjdGlvbiB7XG4gIHR5cGU6IHR5cGVvZiBJTlZBTElEQVRFO1xuICBrZXk6IHN0cmluZztcbn1cblxuLyogUkVTRVQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXRBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgUkVTRVQ7XG4gIGRhdGU6IG51bWJlcjtcbn1cblxuLyogR0MgKi9cbmV4cG9ydCBpbnRlcmZhY2UgR0NBY3Rpb24ge1xuICB0eXBlOiB0eXBlb2YgR0M7XG4gIGVudGl0aWVzOiBFbnRpdHlQYXRoW107XG4gIGVuZHBvaW50czogc3RyaW5nW107XG59XG5cbi8qKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9BY3Rpb25zICovXG5leHBvcnQgdHlwZSBBY3Rpb25UeXBlcyA9XG4gIHwgRmV0Y2hBY3Rpb25cbiAgfCBPcHRpbWlzdGljQWN0aW9uXG4gIHwgU2V0QWN0aW9uXG4gIHwgU2V0UmVzcG9uc2VBY3Rpb25cbiAgfCBTdWJzY3JpYmVBY3Rpb25cbiAgfCBVbnN1YnNjcmliZUFjdGlvblxuICB8IEludmFsaWRhdGVBY3Rpb25cbiAgfCBJbnZhbGlkYXRlQWxsQWN0aW9uXG4gIHwgRXhwaXJlQWxsQWN0aW9uXG4gIHwgUmVzZXRBY3Rpb25cbiAgfCBHQ0FjdGlvbjtcbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -3,6 +3,7 @@ import AbortOptimistic from './AbortOptimistic.js';
|
|
|
3
3
|
import { createUnsubscription, createSubscription } from './actions/createSubscription.js';
|
|
4
4
|
import { createExpireAll, createFetch, createInvalidate, createInvalidateAll, createReset, createSet, createSetResponse } from './actions/index.js';
|
|
5
5
|
import ensurePojo from './ensurePojo.js';
|
|
6
|
+
import { ImmortalGCPolicy } from '../state/GCPolicy.js';
|
|
6
7
|
import { initialState } from '../state/reducer/createReducer.js';
|
|
7
8
|
import selectMeta from '../state/selectMeta.js';
|
|
8
9
|
const unsetDispatch = action => {
|
|
@@ -37,10 +38,15 @@ export default class Controller {
|
|
|
37
38
|
* Singleton to maintain referential equality between calls
|
|
38
39
|
*/
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Handles garbage collection
|
|
43
|
+
*/
|
|
44
|
+
|
|
40
45
|
constructor({
|
|
41
46
|
dispatch = unsetDispatch,
|
|
42
47
|
getState = unsetState,
|
|
43
|
-
memo = new MemoCache()
|
|
48
|
+
memo = new MemoCache(),
|
|
49
|
+
gcPolicy = new ImmortalGCPolicy()
|
|
44
50
|
} = {}) {
|
|
45
51
|
/*************** Action Dispatchers ***************/
|
|
46
52
|
/**
|
|
@@ -154,9 +160,28 @@ export default class Controller {
|
|
|
154
160
|
this.snapshot = (state, fetchedAt) => {
|
|
155
161
|
return new Snapshot(this, state, fetchedAt);
|
|
156
162
|
};
|
|
157
|
-
this.
|
|
163
|
+
this._dispatch = dispatch;
|
|
158
164
|
this.getState = getState;
|
|
159
165
|
this.memo = memo;
|
|
166
|
+
this.gcPolicy = gcPolicy;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// TODO: drop when drop support for destructuring (0.14 and below)
|
|
170
|
+
set dispatch(dispatch) {
|
|
171
|
+
/* istanbul ignore next */
|
|
172
|
+
this._dispatch = dispatch;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// TODO: drop when drop support for destructuring (0.14 and below)
|
|
176
|
+
get dispatch() {
|
|
177
|
+
return this._dispatch;
|
|
178
|
+
}
|
|
179
|
+
bindMiddleware({
|
|
180
|
+
dispatch,
|
|
181
|
+
getState
|
|
182
|
+
}) {
|
|
183
|
+
this._dispatch = dispatch;
|
|
184
|
+
this.getState = getState;
|
|
160
185
|
}
|
|
161
186
|
/**
|
|
162
187
|
* Sets value for the Queryable and args.
|
|
@@ -193,6 +218,16 @@ export default class Controller {
|
|
|
193
218
|
*/
|
|
194
219
|
|
|
195
220
|
getResponse(endpoint, ...rest) {
|
|
221
|
+
// TODO: breaking: only return data
|
|
222
|
+
return this.getResponseMeta(endpoint, ...rest);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Gets the (globally referentially stable) response for a given endpoint/args pair from state given.
|
|
227
|
+
* @see https://dataclient.io/docs/api/Controller#getResponseMeta
|
|
228
|
+
*/
|
|
229
|
+
|
|
230
|
+
getResponseMeta(endpoint, ...rest) {
|
|
196
231
|
const state = rest[rest.length - 1];
|
|
197
232
|
// this is typescript generics breaking
|
|
198
233
|
const args = rest.slice(0, rest.length - 1)
|
|
@@ -214,17 +249,22 @@ export default class Controller {
|
|
|
214
249
|
return {
|
|
215
250
|
data: input,
|
|
216
251
|
expiryStatus: ExpiryStatus.Valid,
|
|
217
|
-
expiresAt: Infinity
|
|
252
|
+
expiresAt: Infinity,
|
|
253
|
+
countRef: () => () => undefined
|
|
218
254
|
};
|
|
219
255
|
}
|
|
220
256
|
let isInvalid = false;
|
|
221
257
|
if (shouldQuery) {
|
|
222
258
|
isInvalid = !validateQueryKey(input);
|
|
259
|
+
// endpoint without entities
|
|
223
260
|
} else if (!schema || !schemaHasEntity(schema)) {
|
|
224
261
|
return {
|
|
225
262
|
data: cacheEndpoints,
|
|
226
263
|
expiryStatus: meta != null && meta.invalidated ? ExpiryStatus.Invalid : cacheEndpoints && !endpoint.invalidIfStale ? ExpiryStatus.Valid : ExpiryStatus.InvalidIfStale,
|
|
227
|
-
expiresAt: expiresAt || 0
|
|
264
|
+
expiresAt: expiresAt || 0,
|
|
265
|
+
countRef: this.gcPolicy.createCountRef({
|
|
266
|
+
key
|
|
267
|
+
})
|
|
228
268
|
};
|
|
229
269
|
}
|
|
230
270
|
|
|
@@ -237,7 +277,7 @@ export default class Controller {
|
|
|
237
277
|
|
|
238
278
|
// note: isInvalid can only be true if shouldQuery is true
|
|
239
279
|
if (!expiresAt && isInvalid) expiresAt = 1;
|
|
240
|
-
return this.getSchemaResponse(data, paths, state.entityMeta, expiresAt, endpoint.invalidIfStale || isInvalid, meta);
|
|
280
|
+
return this.getSchemaResponse(data, key, paths, state.entityMeta, expiresAt, endpoint.invalidIfStale || isInvalid, meta);
|
|
241
281
|
}
|
|
242
282
|
|
|
243
283
|
/**
|
|
@@ -250,7 +290,37 @@ export default class Controller {
|
|
|
250
290
|
const args = rest.slice(0, rest.length - 1).map(ensurePojo);
|
|
251
291
|
return this.memo.query(schema, args, state.entities, state.indexes);
|
|
252
292
|
}
|
|
253
|
-
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Queries the store for a Querable schema; providing related metadata
|
|
296
|
+
* @see https://dataclient.io/docs/api/Controller#getQueryMeta
|
|
297
|
+
*/
|
|
298
|
+
getQueryMeta(schema, ...rest) {
|
|
299
|
+
const state = rest[rest.length - 1];
|
|
300
|
+
// this is typescript generics breaking
|
|
301
|
+
const args = rest.slice(0, rest.length - 1).map(ensurePojo);
|
|
302
|
+
|
|
303
|
+
// TODO: breaking: Switch back to this.memo.query(schema, args, state.entities as any, state.indexes) to do
|
|
304
|
+
// this logic
|
|
305
|
+
const input = this.memo.buildQueryKey(schema, args, state.entities, state.indexes, JSON.stringify(args));
|
|
306
|
+
if (!input) {
|
|
307
|
+
return {
|
|
308
|
+
data: undefined,
|
|
309
|
+
countRef: () => () => undefined
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
const {
|
|
313
|
+
data,
|
|
314
|
+
paths
|
|
315
|
+
} = this.memo.denormalize(schema, input, state.entities, args);
|
|
316
|
+
return {
|
|
317
|
+
data: typeof data === 'symbol' ? undefined : data,
|
|
318
|
+
countRef: this.gcPolicy.createCountRef({
|
|
319
|
+
paths
|
|
320
|
+
})
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
getSchemaResponse(data, key, paths, entityMeta, expiresAt, invalidIfStale, meta = {}) {
|
|
254
324
|
const invalidDenormalize = typeof data === 'symbol';
|
|
255
325
|
|
|
256
326
|
// fallback to entity expiry time
|
|
@@ -265,7 +335,11 @@ export default class Controller {
|
|
|
265
335
|
return {
|
|
266
336
|
data,
|
|
267
337
|
expiryStatus,
|
|
268
|
-
expiresAt
|
|
338
|
+
expiresAt,
|
|
339
|
+
countRef: this.gcPolicy.createCountRef({
|
|
340
|
+
key,
|
|
341
|
+
paths
|
|
342
|
+
})
|
|
269
343
|
};
|
|
270
344
|
}
|
|
271
345
|
}
|
|
@@ -320,6 +394,12 @@ class Snapshot {
|
|
|
320
394
|
return this.controller.getResponse(endpoint, ...args, this.state);
|
|
321
395
|
}
|
|
322
396
|
|
|
397
|
+
/** @see https://dataclient.io/docs/api/Snapshot#getResponseMeta */
|
|
398
|
+
|
|
399
|
+
getResponseMeta(endpoint, ...args) {
|
|
400
|
+
return this.controller.getResponseMeta(endpoint, ...args, this.state);
|
|
401
|
+
}
|
|
402
|
+
|
|
323
403
|
/** @see https://dataclient.io/docs/api/Snapshot#getError */
|
|
324
404
|
|
|
325
405
|
getError(endpoint, ...args) {
|
|
@@ -333,6 +413,14 @@ class Snapshot {
|
|
|
333
413
|
get(schema, ...args) {
|
|
334
414
|
return this.controller.get(schema, ...args, this.state);
|
|
335
415
|
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Queries the store for a Querable schema; providing related metadata
|
|
419
|
+
* @see https://dataclient.io/docs/api/Snapshot#getQueryMeta
|
|
420
|
+
*/
|
|
421
|
+
getQueryMeta(schema, ...args) {
|
|
422
|
+
return this.controller.getQueryMeta(schema, ...args, this.state);
|
|
423
|
+
}
|
|
336
424
|
}
|
|
337
425
|
Snapshot.abort = new AbortOptimistic();
|
|
338
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJNZW1vQ2FjaGUiLCJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwidmFsaWRhdGVRdWVyeUtleSIsIkFib3J0T3B0aW1pc3RpYyIsImNyZWF0ZVVuc3Vic2NyaXB0aW9uIiwiY3JlYXRlU3Vic2NyaXB0aW9uIiwiY3JlYXRlRXhwaXJlQWxsIiwiY3JlYXRlRmV0Y2giLCJjcmVhdGVJbnZhbGlkYXRlIiwiY3JlYXRlSW52YWxpZGF0ZUFsbCIsImNyZWF0ZVJlc2V0IiwiY3JlYXRlU2V0IiwiY3JlYXRlU2V0UmVzcG9uc2UiLCJlbnN1cmVQb2pvIiwiaW5pdGlhbFN0YXRlIiwic2VsZWN0TWV0YSIsInVuc2V0RGlzcGF0Y2giLCJhY3Rpb24iLCJFcnJvciIsInVuc2V0U3RhdGUiLCJDb250cm9sbGVyIiwiY29uc3RydWN0b3IiLCJkaXNwYXRjaCIsImdldFN0YXRlIiwibWVtbyIsImZldGNoIiwiZW5kcG9pbnQiLCJhcmdzIiwic2NoZW1hIiwibWV0YSIsInByb21pc2UiLCJ0aGVuIiwiaW5wdXQiLCJmZXRjaElmU3RhbGUiLCJkYXRhIiwiZXhwaXJlc0F0IiwiZXhwaXJ5U3RhdHVzIiwiZ2V0UmVzcG9uc2UiLCJJbnZhbGlkIiwiRGF0ZSIsIm5vdyIsImludmFsaWRhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImludmFsaWRhdGVBbGwiLCJvcHRpb25zIiwia2V5IiwidGVzdEtleSIsImV4cGlyZUFsbCIsInJlc2V0RW50aXJlU3RvcmUiLCJzZXRSZXNwb25zZSIsInJlc3QiLCJyZXNwb25zZSIsImxlbmd0aCIsInNsaWNlIiwic2V0RXJyb3IiLCJlcnJvciIsInN1YnNjcmliZSIsInVuc3Vic2NyaWJlIiwic25hcHNob3QiLCJzdGF0ZSIsImZldGNoZWRBdCIsIlNuYXBzaG90Iiwic2V0IiwidmFsdWUiLCJnZXRFcnJvciIsImVuZHBvaW50cyIsInVuZGVmaW5lZCIsImVycm9yUG9saWN5IiwibWFwIiwiaXNBY3RpdmUiLCJjYWNoZUVuZHBvaW50cyIsInNob3VsZFF1ZXJ5IiwiYnVpbGRRdWVyeUtleSIsImVudGl0aWVzIiwiaW5kZXhlcyIsIlZhbGlkIiwiSW5maW5pdHkiLCJpc0ludmFsaWQiLCJzY2hlbWFIYXNFbnRpdHkiLCJpbnZhbGlkYXRlZCIsImludmFsaWRJZlN0YWxlIiwiSW52YWxpZElmU3RhbGUiLCJwYXRocyIsImdldFNjaGVtYVJlc3BvbnNlIiwiZW50aXR5TWV0YSIsImdldCIsInF1ZXJ5IiwiaW52YWxpZERlbm9ybWFsaXplIiwiZW50aXR5RXhwaXJlc0F0IiwicGsiLCJfZW50aXR5TWV0YSRrZXkiLCJlbnRpdHlFeHBpcnkiLCJBcnJheSIsImlzQXJyYXkiLCJuZXN0ZWRTY2hlbWEiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwieCIsImNvbnRyb2xsZXIiLCJhYm9ydCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cm9sbGVyL0NvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBFcnJvclR5cGVzLFxuICBTbmFwc2hvdEludGVyZmFjZSxcbiAgU2NoZW1hLFxuICBEZW5vcm1hbGl6ZSxcbiAgUXVlcnlhYmxlLFxuICBTY2hlbWFBcmdzLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7XG4gIEV4cGlyeVN0YXR1cyxcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBFbnRpdHlQYXRoLFxuICBNZW1vQ2FjaGUsXG4gIGlzRW50aXR5LFxuICBkZW5vcm1hbGl6ZSxcbiAgdmFsaWRhdGVRdWVyeUtleSxcbn0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5cbmltcG9ydCBBYm9ydE9wdGltaXN0aWMgZnJvbSAnLi9BYm9ydE9wdGltaXN0aWMuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9hY3Rpb25zL2NyZWF0ZVN1YnNjcmlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBpcmVBbGwsXG4gIGNyZWF0ZUZldGNoLFxuICBjcmVhdGVJbnZhbGlkYXRlLFxuICBjcmVhdGVJbnZhbGlkYXRlQWxsLFxuICBjcmVhdGVSZXNldCxcbiAgY3JlYXRlU2V0LFxuICBjcmVhdGVTZXRSZXNwb25zZSxcbn0gZnJvbSAnLi9hY3Rpb25zL2luZGV4LmpzJztcbmltcG9ydCBlbnN1cmVQb2pvIGZyb20gJy4vZW5zdXJlUG9qby5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50VXBkYXRlRnVuY3Rpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL3JlZHVjZXIvY3JlYXRlUmVkdWNlci5qcyc7XG5pbXBvcnQgc2VsZWN0TWV0YSBmcm9tICcuLi9zdGF0ZS9zZWxlY3RNZXRhLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uVHlwZXMsIFN0YXRlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBHZW5lcmljRGlzcGF0Y2ggPSAodmFsdWU6IGFueSkgPT4gUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCB0eXBlIERhdGFDbGllbnREaXNwYXRjaCA9ICh2YWx1ZTogQWN0aW9uVHlwZXMpID0+IFByb21pc2U8dm9pZD47XG5cbmludGVyZmFjZSBDb25zdHJ1Y3RvclByb3BzPEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2g+IHtcbiAgZGlzcGF0Y2g/OiBEO1xuICBnZXRTdGF0ZT86ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBtZW1vPzogUGljazxNZW1vQ2FjaGUsICdkZW5vcm1hbGl6ZScgfCAncXVlcnknIHwgJ2J1aWxkUXVlcnlLZXknPjtcbn1cblxuY29uc3QgdW5zZXREaXNwYXRjaCA9IChhY3Rpb246IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiBgICtcbiAgICAgIGBPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guYCxcbiAgKTtcbn07XG5jb25zdCB1bnNldFN0YXRlID0gKCk6IFN0YXRlPHVua25vd24+ID0+IHtcbiAgLy8gVGhpcyBpcyBvbmx5IHRoZSB2YWx1ZSB1bnRpbCBpdCBpcyBzZXQgYnkgdGhlIERhdGFQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVhY3RpdmUgRGF0YSBDbGllbnQgc3RvcmVcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbGxlcjxcbiAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbj4ge1xuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gUmVhY3RpdmUgRGF0YSBDbGllbnQgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNkaXNwYXRjaFxuICAgKi9cbiAgZGVjbGFyZSByZWFkb25seSBkaXNwYXRjaDogRDtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhdGVzdCBzdGF0ZSBzbmFwc2hvdCB0aGF0IGlzIGZ1bGx5IGNvbW1pdHRlZC5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBpbXBlcmF0aXZlIHVzZS1jYXNlcyBsaWtlIGV2ZW50IGhhbmRsZXJzLlxuICAgKiBUaGlzIHNob3VsZCAqbm90KiBiZSB1c2VkIHRvIHJlbmRlcjsgaW5zdGVhZCB1c2VTdXNwZW5zZSgpIG9yIHVzZUNhY2hlKClcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRTdGF0ZVxuICAgKi9cbiAgZGVjbGFyZSByZWFkb25seSBnZXRTdGF0ZTogKCkgPT4gU3RhdGU8dW5rbm93bj47XG4gIC8qKlxuICAgKiBTaW5nbGV0b24gdG8gbWFpbnRhaW4gcmVmZXJlbnRpYWwgZXF1YWxpdHkgYmV0d2VlbiBjYWxsc1xuICAgKi9cbiAgZGVjbGFyZSByZWFkb25seSBtZW1vOiBQaWNrPFxuICAgIE1lbW9DYWNoZSxcbiAgICAnZGVub3JtYWxpemUnIHwgJ3F1ZXJ5JyB8ICdidWlsZFF1ZXJ5S2V5J1xuICA+O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBtZW1vID0gbmV3IE1lbW9DYWNoZSgpLFxuICB9OiBDb25zdHJ1Y3RvclByb3BzPEQ+ID0ge30pIHtcbiAgICB0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuICAgIHRoaXMubWVtbyA9IG1lbW87XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIEFjdGlvbiBEaXNwYXRjaGVycyAqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGVuZHBvaW50IHdpdGggZ2l2ZW4gYXJncywgdXBkYXRpbmcgdGhlIFJlYWN0aXZlIERhdGEgQ2xpZW50IGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNmZXRjaFxuICAgKi9cbiAgZmV0Y2ggPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+IH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6IEVbJ3NjaGVtYSddIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbCA/IFJldHVyblR5cGU8RT5cbiAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gPT4ge1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZldGNoKGVuZHBvaW50LCB7XG4gICAgICBhcmdzLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgIGlmIChlbmRwb2ludC5zY2hlbWEpIHtcbiAgICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlLnRoZW4oaW5wdXQgPT5cbiAgICAgICAgZGVub3JtYWxpemUoZW5kcG9pbnQuc2NoZW1hLCBpbnB1dCwge30sIGFyZ3MpLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlIGFzIGFueTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmx5IGlmIGVuZHBvaW50IGlzIGNvbnNpZGVyZWQgJ3N0YWxlJzsgb3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hJZlN0YWxlXG4gICAqL1xuICBmZXRjaElmU3RhbGUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+IH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6IEVbJ3NjaGVtYSddIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbCA/IFJldHVyblR5cGU8RT4gfCBSZXNvbHZlVHlwZTxFPlxuICA6IFByb21pc2U8RGVub3JtYWxpemU8RVsnc2NoZW1hJ10+PiB8IERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPiA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBleHBpcmVzQXQsIGV4cGlyeVN0YXR1cyB9ID0gdGhpcy5nZXRSZXNwb25zZShcbiAgICAgIGVuZHBvaW50LFxuICAgICAgLi4uYXJncyxcbiAgICAgIHRoaXMuZ2V0U3RhdGUoKSxcbiAgICApO1xuICAgIGlmIChleHBpcnlTdGF0dXMgIT09IEV4cGlyeVN0YXR1cy5JbnZhbGlkICYmIERhdGUubm93KCkgPD0gZXhwaXJlc0F0KVxuICAgICAgcmV0dXJuIGRhdGEgYXMgYW55O1xuICAgIHJldHVybiB0aGlzLmZldGNoKGVuZHBvaW50LCAuLi5hcmdzKTtcbiAgfTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIHdpdGggdGhlIHNhbWUgRW5kcG9pbnQgYW5kIHBhcmFtZXRlcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjaW52YWxpZGF0ZVxuICAgKi9cbiAgaW52YWxpZGF0ZSA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbCA/XG4gICAgICB0aGlzLmRpc3BhdGNoKFxuICAgICAgICBjcmVhdGVJbnZhbGlkYXRlKGVuZHBvaW50LCB7XG4gICAgICAgICAgYXJnczogYXJncyBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgcmVmZXRjaGluZyBhbmQgc3VzcGVuc2Ugb24gdXNlU3VzcGVuc2Ugb24gYWxsIG1hdGNoaW5nIGVuZHBvaW50IHJlc3VsdCBrZXlzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ludmFsaWRhdGVBbGxcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW52YWxpZGF0aW9uIGlzIGNvbW1pdGVkLlxuICAgKi9cbiAgaW52YWxpZGF0ZUFsbCA9IChvcHRpb25zOiB7IHRlc3RLZXk6IChrZXk6IHN0cmluZykgPT4gYm9vbGVhbiB9KSA9PlxuICAgIHRoaXMuZGlzcGF0Y2goY3JlYXRlSW52YWxpZGF0ZUFsbCgoa2V5OiBzdHJpbmcpID0+IG9wdGlvbnMudGVzdEtleShrZXkpKSk7XG5cbiAgLyoqXG4gICAqIFNldHMgYWxsIG1hdGNoaW5nIGVuZHBvaW50IHJlc3VsdCBrZXlzIHRvIGJlIFNUQUxFLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2V4cGlyZUFsbFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBleHBpcnkgaXMgY29tbWl0ZWQuICpOT1QqIGZldGNoIHByb21pc2VcbiAgICovXG4gIGV4cGlyZUFsbCA9IChvcHRpb25zOiB7IHRlc3RLZXk6IChrZXk6IHN0cmluZykgPT4gYm9vbGVhbiB9KSA9PlxuICAgIHRoaXMuZGlzcGF0Y2goY3JlYXRlRXhwaXJlQWxsKChrZXk6IHN0cmluZykgPT4gb3B0aW9ucy50ZXN0S2V5KGtleSkpKTtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBlbnRpcmUgUmVhY3RpdmUgRGF0YSBDbGllbnQgY2FjaGUuIEFsbCBpbmZsaWdodCByZXF1ZXN0cyB3aWxsIG5vdCByZXNvbHZlLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc2V0RW50aXJlU3RvcmVcbiAgICovXG4gIHJlc2V0RW50aXJlU3RvcmUgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlc2V0KCkpO1xuXG4gIC8qKlxuICAgKiBTZXRzIHZhbHVlIGZvciB0aGUgUXVlcnlhYmxlIGFuZCBhcmdzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFxuICAgKi9cbiAgc2V0PFMgZXh0ZW5kcyBRdWVyeWFibGU+KFxuICAgIHNjaGVtYTogUyxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uU2NoZW1hQXJnczxTPiwgKHByZXZpb3VzVmFsdWU6IERlbm9ybWFsaXplPFM+KSA9PiB7fV1cbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBzZXQ8UyBleHRlbmRzIFF1ZXJ5YWJsZT4oXG4gICAgc2NoZW1hOiBTLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5TY2hlbWFBcmdzPFM+LCB7fV1cbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBzZXQ8UyBleHRlbmRzIFF1ZXJ5YWJsZT4oXG4gICAgc2NoZW1hOiBTLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5TY2hlbWFBcmdzPFM+LCBhbnldXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbHVlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVNldChzY2hlbWEsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBTY2hlbWFBcmdzPFM+LFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gICAgLy8gVE9ETzogcmVqZWN0IHdpdGggZXJyb3IgaWYgdGhpcyBmYWlscyBpbiByZWR1Y2VyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHJlc3BvbnNlIGZvciB0aGUgRW5kcG9pbnQgYW5kIGFyZ3MuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0UmVzcG9uc2VcbiAgICovXG4gIHNldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogUmVzb2x2ZVR5cGU8RT4gPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlU2V0UmVzcG9uc2UoZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgcmVzcG9uc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyBhbiBlcnJvciByZXNwb25zZSBmb3IgdGhlIEVuZHBvaW50IGFuZCBhcmdzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yXG4gICAqL1xuICBzZXRFcnJvciA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIEVycm9yXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogRXJyb3IgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlU2V0UmVzcG9uc2UoZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBlcnJvcjogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBpbmZsaWdodCBmZXRjaC5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNyZXNvbHZlXG4gICAqL1xuICByZXNvbHZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICBtZXRhOlxuICAgICAgfCB7XG4gICAgICAgICAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICAgICAgICAgIHJlc3BvbnNlOiBFcnJvcjtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgICBlcnJvcjogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICAgICAgICAgIHJlc3BvbnNlOiBhbnk7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I/OiBmYWxzZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goY3JlYXRlU2V0UmVzcG9uc2UoZW5kcG9pbnQsIG1ldGEgYXMgYW55KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcmtzIGEgbmV3IHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3N1YnNjcmliZVxuICAgKi9cbiAgc3Vic2NyaWJlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICAgIEZldGNoRnVuY3Rpb24sXG4gICAgICBTY2hlbWEgfCB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQgfCBmYWxzZVxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsID9cbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKipcbiAgICogTWFya3MgY29tcGxldGlvbiBvZiBzdWJzY3JpcHRpb24gdG8gYSBnaXZlbiBFbmRwb2ludC5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciN1bnN1YnNjcmliZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgICAgRmV0Y2hGdW5jdGlvbixcbiAgICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGwgP1xuICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgY3JlYXRlVW5zdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICBhcmdzOiBhcmdzIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqKioqKioqKioqKioqKiBNb3JlICoqKioqKioqKioqKioqKi9cblxuICAvKiBUT0RPOlxuICBhYm9ydCA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBQcm9taXNlPHZvaWQ+XG4gICovXG5cbiAgLyoqXG4gICAqIEdldHMgYSBzbmFwc2hvdCAoaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL1NuYXBzaG90KVxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NuYXBzaG90XG4gICAqL1xuICBzbmFwc2hvdCA9IChzdGF0ZTogU3RhdGU8dW5rbm93bj4sIGZldGNoZWRBdD86IG51bWJlcik6IFNuYXBzaG90SW50ZXJmYWNlID0+IHtcbiAgICByZXR1cm4gbmV3IFNuYXBzaG90KHRoaXMsIHN0YXRlLCBmZXRjaGVkQXQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlcnJvciwgaWYgYW55LCBmb3IgYSBnaXZlbiBlbmRwb2ludC4gUmV0dXJucyB1bmRlZmluZWQgZm9yIG5vIGVycm9ycy5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRFcnJvclxuICAgKi9cbiAgZ2V0RXJyb3I8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OlxuICAgICAgfCByZWFkb25seSBbbnVsbCwgU3RhdGU8dW5rbm93bj5dXG4gICAgICB8IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBTdGF0ZTx1bmtub3duPl1cbiAgKTogRXJyb3JUeXBlcyB8IHVuZGVmaW5lZDtcblxuICBnZXRFcnJvcjxFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleSc+PihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OlxuICAgICAgfCByZWFkb25seSBbbnVsbCwgU3RhdGU8dW5rbm93bj5dXG4gICAgICB8IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPiwgU3RhdGU8dW5rbm93bj5dXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0RXJyb3IoXG4gICAgZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi51bmtub3duW10sIFN0YXRlPHVua25vd24+XVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocmVzdFswXSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBrZXkgPSBlbmRwb2ludC5rZXkoLi4uYXJncyk7XG5cbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBjb25zdCBlcnJvciA9IHN0YXRlLmVuZHBvaW50c1trZXldO1xuXG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQgJiYgbWV0YT8uZXJyb3JQb2xpY3kgPT09ICdzb2Z0JykgcmV0dXJuO1xuXG4gICAgcmV0dXJuIG1ldGE/LmVycm9yIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAoZ2xvYmFsbHkgcmVmZXJlbnRpYWxseSBzdGFibGUpIHJlc3BvbnNlIGZvciBhIGdpdmVuIGVuZHBvaW50L2FyZ3MgcGFpciBmcm9tIHN0YXRlIGdpdmVuLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2dldFJlc3BvbnNlXG4gICAqL1xuICBnZXRSZXNwb25zZTxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6XG4gICAgICB8IHJlYWRvbmx5IFtudWxsLCBTdGF0ZTx1bmtub3duPl1cbiAgICAgIHwgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIFN0YXRlPHVua25vd24+XVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH07XG5cbiAgZ2V0UmVzcG9uc2U8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbXG4gICAgICAuLi4ocmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSksXG4gICAgICBTdGF0ZTx1bmtub3duPixcbiAgICBdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfTtcblxuICBnZXRSZXNwb25zZShcbiAgICBlbmRwb2ludDogRW5kcG9pbnRJbnRlcmZhY2UsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLnVua25vd25bXSwgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiB1bmtub3duO1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXSBhcyBTdGF0ZTx1bmtub3duPjtcbiAgICAvLyB0aGlzIGlzIHR5cGVzY3JpcHQgZ2VuZXJpY3MgYnJlYWtpbmdcbiAgICBjb25zdCBhcmdzOiBhbnkgPSByZXN0XG4gICAgICAuc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKVxuICAgICAgLy8gaGFuZGxlIEZvcm1EYXRhXG4gICAgICAubWFwKGVuc3VyZVBvam8pO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYXJncy5sZW5ndGggIT09IDEgfHwgYXJnc1swXSAhPT0gbnVsbDtcbiAgICBjb25zdCBrZXkgPSBpc0FjdGl2ZSA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuICAgIGNvbnN0IGNhY2hlRW5kcG9pbnRzID0gaXNBY3RpdmUgPyBzdGF0ZS5lbmRwb2ludHNba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzY2hlbWEgPSBlbmRwb2ludC5zY2hlbWE7XG4gICAgY29uc3QgbWV0YSA9IHNlbGVjdE1ldGEoc3RhdGUsIGtleSk7XG4gICAgbGV0IGV4cGlyZXNBdCA9IG1ldGE/LmV4cGlyZXNBdDtcbiAgICAvLyBpZiB3ZSBoYXZlIG5vIGVuZHBvaW50IGVudHJ5LCBhbmQgb3VyIGVuZHBvaW50IGhhcyBhIHNjaGVtYSAtIHRyeSBxdWVyeWluZyB0aGUgc3RvcmVcbiAgICBjb25zdCBzaG91bGRRdWVyeSA9IGNhY2hlRW5kcG9pbnRzID09PSB1bmRlZmluZWQgJiYgc2NoZW1hICE9PSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpbnB1dCA9XG4gICAgICBzaG91bGRRdWVyeSA/XG4gICAgICAgIC8vIG5vdGhpbmcgaW4gZW5kcG9pbnRzIGNhY2hlLCBzbyB0cnkgcXVlcnlpbmcgaWYgd2UgaGF2ZSBhIHNjaGVtYSB0byBkbyBzb1xuICAgICAgICB0aGlzLm1lbW8uYnVpbGRRdWVyeUtleShcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBzdGF0ZS5lbnRpdGllcyBhcyBhbnksXG4gICAgICAgICAgc3RhdGUuaW5kZXhlcyxcbiAgICAgICAgICBrZXksXG4gICAgICAgIClcbiAgICAgIDogY2FjaGVFbmRwb2ludHM7XG5cbiAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAvLyB3aGVuIG5vdCBhY3RpdmUgc2ltcGx5IHJldHVybiB0aGUgcXVlcnkgaW5wdXQgd2l0aG91dCBkZW5vcm1hbGl6aW5nXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBpbnB1dCBhcyBhbnksXG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzLlZhbGlkLFxuICAgICAgICBleHBpcmVzQXQ6IEluZmluaXR5LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgaWYgKHNob3VsZFF1ZXJ5KSB7XG4gICAgICBpc0ludmFsaWQgPSAhdmFsaWRhdGVRdWVyeUtleShpbnB1dCk7XG4gICAgfSBlbHNlIGlmICghc2NoZW1hIHx8ICFzY2hlbWFIYXNFbnRpdHkoc2NoZW1hKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogY2FjaGVFbmRwb2ludHMsXG4gICAgICAgIGV4cGlyeVN0YXR1czpcbiAgICAgICAgICBtZXRhPy5pbnZhbGlkYXRlZCA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgICAgOiBjYWNoZUVuZHBvaW50cyAmJiAhZW5kcG9pbnQuaW52YWxpZElmU3RhbGUgPyBFeHBpcnlTdGF0dXMuVmFsaWRcbiAgICAgICAgICA6IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZSxcbiAgICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQgfHwgMCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gc2Vjb25kIGFyZ3VtZW50IGlzIGZhbHNlIGlmIGFueSBlbnRpdGllcyBhcmUgbWlzc2luZ1xuXG4gICAgY29uc3QgeyBkYXRhLCBwYXRocyB9ID0gdGhpcy5tZW1vLmRlbm9ybWFsaXplKFxuICAgICAgc2NoZW1hLFxuICAgICAgaW5wdXQsXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgIGFyZ3MsXG4gICAgKSBhcyB7IGRhdGE6IGFueTsgcGF0aHM6IEVudGl0eVBhdGhbXSB9O1xuXG4gICAgLy8gbm90ZTogaXNJbnZhbGlkIGNhbiBvbmx5IGJlIHRydWUgaWYgc2hvdWxkUXVlcnkgaXMgdHJ1ZVxuICAgIGlmICghZXhwaXJlc0F0ICYmIGlzSW52YWxpZCkgZXhwaXJlc0F0ID0gMTtcblxuICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVJlc3BvbnNlKFxuICAgICAgZGF0YSxcbiAgICAgIHBhdGhzLFxuICAgICAgc3RhdGUuZW50aXR5TWV0YSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICAgIGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8IGlzSW52YWxpZCxcbiAgICAgIG1ldGEsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyaWVzIHRoZSBzdG9yZSBmb3IgYSBRdWVyYWJsZSBzY2hlbWFcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRcbiAgICovXG4gIGdldDxTIGV4dGVuZHMgUXVlcnlhYmxlPihcbiAgICBzY2hlbWE6IFMsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgW1xuICAgICAgLi4uU2NoZW1hQXJnczxTPixcbiAgICAgIFBpY2s8U3RhdGU8dW5rbm93bj4sICdlbnRpdGllcycgfCAnZW50aXR5TWV0YSc+LFxuICAgIF1cbiAgKTogRGVub3JtYWxpemVOdWxsYWJsZTxTPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8YW55PjtcbiAgICAvLyB0aGlzIGlzIHR5cGVzY3JpcHQgZ2VuZXJpY3MgYnJlYWtpbmdcbiAgICBjb25zdCBhcmdzOiBhbnkgPSByZXN0XG4gICAgICAuc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKVxuICAgICAgLm1hcChlbnN1cmVQb2pvKSBhcyBTY2hlbWFBcmdzPFM+O1xuXG4gICAgcmV0dXJuIHRoaXMubWVtby5xdWVyeShzY2hlbWEsIGFyZ3MsIHN0YXRlLmVudGl0aWVzIGFzIGFueSwgc3RhdGUuaW5kZXhlcyk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjaGVtYVJlc3BvbnNlPFQ+KFxuICAgIGRhdGE6IFQsXG4gICAgcGF0aHM6IEVudGl0eVBhdGhbXSxcbiAgICBlbnRpdHlNZXRhOiBTdGF0ZTx1bmtub3duPlsnZW50aXR5TWV0YSddLFxuICAgIGV4cGlyZXNBdDogbnVtYmVyLFxuICAgIGludmFsaWRJZlN0YWxlOiBib29sZWFuLFxuICAgIG1ldGE6IHsgZXJyb3I/OiB1bmtub3duOyBpbnZhbGlkYXRlZD86IHVua25vd24gfSA9IHt9LFxuICApOiB7XG4gICAgZGF0YTogVDtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3QgaW52YWxpZERlbm9ybWFsaXplID0gdHlwZW9mIGRhdGEgPT09ICdzeW1ib2wnO1xuXG4gICAgLy8gZmFsbGJhY2sgdG8gZW50aXR5IGV4cGlyeSB0aW1lXG4gICAgaWYgKCFleHBpcmVzQXQpIHtcbiAgICAgIGV4cGlyZXNBdCA9IGVudGl0eUV4cGlyZXNBdChwYXRocywgZW50aXR5TWV0YSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoaW52YWxpZERlbm9ybWFsaXplICYmICFtZXRhPy5lcnJvcikgP1xuICAgICAgICBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgOiBpbnZhbGlkRGVub3JtYWxpemUgfHwgaW52YWxpZElmU3RhbGUgPyBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGVcbiAgICAgIDogRXhwaXJ5U3RhdHVzLlZhbGlkO1xuXG4gICAgcmV0dXJuIHsgZGF0YSwgZXhwaXJ5U3RhdHVzLCBleHBpcmVzQXQgfTtcbiAgfVxufVxuXG4vLyBiZW5jaG1hcms6IGh0dHBzOi8vd3d3Lm1lYXN1cmV0aGF0Lm5ldC9CZW5jaG1hcmtzL1Nob3cvMjQ2OTEvMC9taW4tcmVkdWNlci12cy1pbXBlcmF0aXZlLXdpdGgtcGF0aHNcbi8vIGVhcmxpZXN0IGV4cGlyeSBkaWN0YXRlcyBhZ2VcbmZ1bmN0aW9uIGVudGl0eUV4cGlyZXNBdChcbiAgcGF0aHM6IEVudGl0eVBhdGhbXSxcbiAgZW50aXR5TWV0YToge1xuICAgIHJlYWRvbmx5IFtlbnRpdHlLZXk6IHN0cmluZ106IHtcbiAgICAgIHJlYWRvbmx5IFtwazogc3RyaW5nXToge1xuICAgICAgICByZWFkb25seSBkYXRlOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBmZXRjaGVkQXQ6IG51bWJlcjsgLy8gVGhpcyBpcyBvbmx5IHRoZSB2YWx1ZSB1bnRpbCBpdCBpcyBzZXQgYnkgdGhlIERhdGFQcm92aWRlclxuICAgICAgfTtcbiAgICB9O1xuICB9LFxuKSB7XG4gIGxldCBleHBpcmVzQXQgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCB7IHBrLCBrZXkgfSBvZiBwYXRocykge1xuICAgIGNvbnN0IGVudGl0eUV4cGlyeSA9IGVudGl0eU1ldGFba2V5XT8uW3BrXT8uZXhwaXJlc0F0O1xuICAgIC8vIGV4cGlyZXNBdCB3aWxsIGFsd2F5cyByZXNvbHZlIHRvIGZhbHNlIHdpdGggYW55IGNvbXBhcmlzb25cbiAgICBpZiAoZW50aXR5RXhwaXJ5IDwgZXhwaXJlc0F0KSBleHBpcmVzQXQgPSBlbnRpdHlFeHBpcnk7XG4gIH1cbiAgcmV0dXJuIGV4cGlyZXNBdDtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBxdWVyaWVkLlxuICovXG5mdW5jdGlvbiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hOiBTY2hlbWEpOiBib29sZWFuIHtcbiAgaWYgKGlzRW50aXR5KHNjaGVtYSkpIHJldHVybiB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKVxuICAgIHJldHVybiBzY2hlbWEubGVuZ3RoICE9PSAwICYmIHNjaGVtYUhhc0VudGl0eShzY2hlbWFbMF0pO1xuICBpZiAoc2NoZW1hICYmICh0eXBlb2Ygc2NoZW1hID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygc2NoZW1hID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNvbnN0IG5lc3RlZFNjaGVtYSA9XG4gICAgICAnc2NoZW1hJyBpbiBzY2hlbWEgPyAoc2NoZW1hLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+KSA6IHNjaGVtYTtcbiAgICBpZiAodHlwZW9mIG5lc3RlZFNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNjaGVtYUhhc0VudGl0eShuZXN0ZWRTY2hlbWEpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhuZXN0ZWRTY2hlbWEpLnNvbWUoeCA9PiBzY2hlbWFIYXNFbnRpdHkoeCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgeyBFcnJvclR5cGVzIH07XG5cbmNsYXNzIFNuYXBzaG90PFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIFNuYXBzaG90SW50ZXJmYWNlIHtcbiAgc3RhdGljIHJlYWRvbmx5IGFib3J0ID0gbmV3IEFib3J0T3B0aW1pc3RpYygpO1xuXG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBhYm9ydCA9IFNuYXBzaG90LmFib3J0O1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIC8qKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9TbmFwc2hvdCNnZXRSZXNwb25zZSAqL1xuICBnZXRSZXNwb25zZTxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFtudWxsXVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH07XG5cbiAgZ2V0UmVzcG9uc2U8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKToge1xuICAgIGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9O1xuXG4gIGdldFJlc3BvbnNlPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH07XG5cbiAgZ2V0UmVzcG9uc2U8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFWydrZXknXT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRSZXNwb25zZShlbmRwb2ludCwgLi4uYXJncywgdGhpcy5zdGF0ZSk7XG4gIH1cblxuICAvKiogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0RXJyb3IgKi9cbiAgZ2V0RXJyb3I8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogRXJyb3JUeXBlcyB8IHVuZGVmaW5lZDtcblxuICBnZXRFcnJvcjxFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleSc+PihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFWydrZXknXT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0RXJyb3I8RSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPj4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZWQgbWVtb2l6ZWQgdmFsdWUgZm9yIGFueSBRdWVyYWJsZSBzY2hlbWFcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0XG4gICAqL1xuICBnZXQ8UyBleHRlbmRzIFF1ZXJ5YWJsZT4oXG4gICAgc2NoZW1hOiBTLFxuICAgIC4uLmFyZ3M6IFNjaGVtYUFyZ3M8Uz5cbiAgKTogRGVub3JtYWxpemVOdWxsYWJsZTxTPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXQoc2NoZW1hLCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFRQSxTQUNFQSxZQUFZLEVBTVpDLFNBQVMsRUFDVEMsUUFBUSxFQUNSQyxXQUFXLEVBQ1hDLGdCQUFnQixRQUNYLHdCQUF3QjtBQUUvQixPQUFPQyxlQUFlLE1BQU0sc0JB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
|
|
426
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJNZW1vQ2FjaGUiLCJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwidmFsaWRhdGVRdWVyeUtleSIsIkFib3J0T3B0aW1pc3RpYyIsImNyZWF0ZVVuc3Vic2NyaXB0aW9uIiwiY3JlYXRlU3Vic2NyaXB0aW9uIiwiY3JlYXRlRXhwaXJlQWxsIiwiY3JlYXRlRmV0Y2giLCJjcmVhdGVJbnZhbGlkYXRlIiwiY3JlYXRlSW52YWxpZGF0ZUFsbCIsImNyZWF0ZVJlc2V0IiwiY3JlYXRlU2V0IiwiY3JlYXRlU2V0UmVzcG9uc2UiLCJlbnN1cmVQb2pvIiwiSW1tb3J0YWxHQ1BvbGljeSIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsIm1lbW8iLCJnY1BvbGljeSIsImZldGNoIiwiZW5kcG9pbnQiLCJhcmdzIiwic2NoZW1hIiwibWV0YSIsInByb21pc2UiLCJ0aGVuIiwiaW5wdXQiLCJmZXRjaElmU3RhbGUiLCJkYXRhIiwiZXhwaXJlc0F0IiwiZXhwaXJ5U3RhdHVzIiwiZ2V0UmVzcG9uc2UiLCJJbnZhbGlkIiwiRGF0ZSIsIm5vdyIsImludmFsaWRhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImludmFsaWRhdGVBbGwiLCJvcHRpb25zIiwia2V5IiwidGVzdEtleSIsImV4cGlyZUFsbCIsInJlc2V0RW50aXJlU3RvcmUiLCJzZXRSZXNwb25zZSIsInJlc3QiLCJyZXNwb25zZSIsImxlbmd0aCIsInNsaWNlIiwic2V0RXJyb3IiLCJlcnJvciIsInN1YnNjcmliZSIsInVuc3Vic2NyaWJlIiwic25hcHNob3QiLCJzdGF0ZSIsImZldGNoZWRBdCIsIlNuYXBzaG90IiwiX2Rpc3BhdGNoIiwiYmluZE1pZGRsZXdhcmUiLCJzZXQiLCJ2YWx1ZSIsImdldEVycm9yIiwiZW5kcG9pbnRzIiwidW5kZWZpbmVkIiwiZXJyb3JQb2xpY3kiLCJnZXRSZXNwb25zZU1ldGEiLCJtYXAiLCJpc0FjdGl2ZSIsImNhY2hlRW5kcG9pbnRzIiwic2hvdWxkUXVlcnkiLCJidWlsZFF1ZXJ5S2V5IiwiZW50aXRpZXMiLCJpbmRleGVzIiwiVmFsaWQiLCJJbmZpbml0eSIsImNvdW50UmVmIiwiaXNJbnZhbGlkIiwic2NoZW1hSGFzRW50aXR5IiwiaW52YWxpZGF0ZWQiLCJpbnZhbGlkSWZTdGFsZSIsIkludmFsaWRJZlN0YWxlIiwiY3JlYXRlQ291bnRSZWYiLCJwYXRocyIsImdldFNjaGVtYVJlc3BvbnNlIiwiZW50aXR5TWV0YSIsImdldCIsInF1ZXJ5IiwiZ2V0UXVlcnlNZXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImludmFsaWREZW5vcm1hbGl6ZSIsImVudGl0eUV4cGlyZXNBdCIsInBrIiwiX2VudGl0eU1ldGEka2V5IiwiZW50aXR5RXhwaXJ5IiwiQXJyYXkiLCJpc0FycmF5IiwibmVzdGVkU2NoZW1hIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsIngiLCJjb250cm9sbGVyIiwiYWJvcnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9Db250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRXJyb3JUeXBlcyxcbiAgU25hcHNob3RJbnRlcmZhY2UsXG4gIFNjaGVtYSxcbiAgRGVub3JtYWxpemUsXG4gIFF1ZXJ5YWJsZSxcbiAgU2NoZW1hQXJncyxcbn0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5pbXBvcnQge1xuICBFeHBpcnlTdGF0dXMsXG4gIEVuZHBvaW50SW50ZXJmYWNlLFxuICBGZXRjaEZ1bmN0aW9uLFxuICBSZXNvbHZlVHlwZSxcbiAgRGVub3JtYWxpemVOdWxsYWJsZSxcbiAgRW50aXR5UGF0aCxcbiAgTWVtb0NhY2hlLFxuICBpc0VudGl0eSxcbiAgZGVub3JtYWxpemUsXG4gIHZhbGlkYXRlUXVlcnlLZXksXG59IGZyb20gJ0BkYXRhLWNsaWVudC9ub3JtYWxpenInO1xuXG5pbXBvcnQgQWJvcnRPcHRpbWlzdGljIGZyb20gJy4vQWJvcnRPcHRpbWlzdGljLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVVuc3Vic2NyaXB0aW9uLFxuICBjcmVhdGVTdWJzY3JpcHRpb24sXG59IGZyb20gJy4vYWN0aW9ucy9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRXhwaXJlQWxsLFxuICBjcmVhdGVGZXRjaCxcbiAgY3JlYXRlSW52YWxpZGF0ZSxcbiAgY3JlYXRlSW52YWxpZGF0ZUFsbCxcbiAgY3JlYXRlUmVzZXQsXG4gIGNyZWF0ZVNldCxcbiAgY3JlYXRlU2V0UmVzcG9uc2UsXG59IGZyb20gJy4vYWN0aW9ucy9pbmRleC5qcyc7XG5pbXBvcnQgZW5zdXJlUG9qbyBmcm9tICcuL2Vuc3VyZVBvam8uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBSZWR1eE1pZGRsZXdhcmVBUEkgfSBmcm9tICcuLi9tYW5hZ2VyL2FwcGx5TWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEdDSW50ZXJmYWNlIH0gZnJvbSAnLi4vc3RhdGUvR0NQb2xpY3kuanMnO1xuaW1wb3J0IHsgSW1tb3J0YWxHQ1BvbGljeSB9IGZyb20gJy4uL3N0YXRlL0dDUG9saWN5LmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL3JlZHVjZXIvY3JlYXRlUmVkdWNlci5qcyc7XG5pbXBvcnQgc2VsZWN0TWV0YSBmcm9tICcuLi9zdGF0ZS9zZWxlY3RNZXRhLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uVHlwZXMsIERpc3BhdGNoLCBTdGF0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBEYXRhQ2xpZW50RGlzcGF0Y2ggPSAodmFsdWU6IEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xsZXJDb25zdHJ1Y3RvclByb3BzPFxuICBEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gRGF0YUNsaWVudERpc3BhdGNoLFxuPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgbWVtbz86IFBpY2s8TWVtb0NhY2hlLCAnZGVub3JtYWxpemUnIHwgJ3F1ZXJ5JyB8ICdidWlsZFF1ZXJ5S2V5Jz47XG4gIGdjUG9saWN5PzogR0NJbnRlcmZhY2U7XG59XG5cbmNvbnN0IHVuc2V0RGlzcGF0Y2ggPSAoYWN0aW9uOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gYCArXG4gICAgICBgT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLmAsXG4gICk7XG59O1xuY29uc3QgdW5zZXRTdGF0ZSA9ICgpOiBTdGF0ZTx1bmtub3duPiA9PiB7XG4gIC8vIFRoaXMgaXMgb25seSB0aGUgdmFsdWUgdW50aWwgaXQgaXMgc2V0IGJ5IHRoZSBEYXRhUHJvdmlkZXJcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5cbi8qKlxuICogSW1wZXJhdGl2ZSBjb250cm9sIG9mIFJlYWN0aXZlIERhdGEgQ2xpZW50IHN0b3JlXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIC8vIE5PVEU6IFdlIHRlbXBsYXRlIG9uIGVudGlyZSBkaXNwYXRjaCwgc28gd2UgY2FuIGJlIGNvbnRyYXZhcmlhbnQgb24gQWN0aW9uVHlwZXNcbiAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbj4ge1xuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gUmVhY3RpdmUgRGF0YSBDbGllbnQgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNkaXNwYXRjaFxuICAgKi9cbiAgZGVjbGFyZSBwcm90ZWN0ZWQgX2Rpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2dldFN0YXRlXG4gICAqL1xuICBkZWNsYXJlIGdldFN0YXRlOiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgLyoqXG4gICAqIFNpbmdsZXRvbiB0byBtYWludGFpbiByZWZlcmVudGlhbCBlcXVhbGl0eSBiZXR3ZWVuIGNhbGxzXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IG1lbW86IFBpY2s8XG4gICAgTWVtb0NhY2hlLFxuICAgICdkZW5vcm1hbGl6ZScgfCAncXVlcnknIHwgJ2J1aWxkUXVlcnlLZXknXG4gID47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGdjUG9saWN5OiBHQ0ludGVyZmFjZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgZGlzcGF0Y2ggPSB1bnNldERpc3BhdGNoIGFzIGFueSxcbiAgICBnZXRTdGF0ZSA9IHVuc2V0U3RhdGUsXG4gICAgbWVtbyA9IG5ldyBNZW1vQ2FjaGUoKSxcbiAgICBnY1BvbGljeSA9IG5ldyBJbW1vcnRhbEdDUG9saWN5KCksXG4gIH06IENvbnRyb2xsZXJDb25zdHJ1Y3RvclByb3BzPEQ+ID0ge30pIHtcbiAgICB0aGlzLl9kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbiAgICB0aGlzLm1lbW8gPSBtZW1vO1xuICAgIHRoaXMuZ2NQb2xpY3kgPSBnY1BvbGljeTtcbiAgfVxuXG4gIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICBzZXQgZGlzcGF0Y2goZGlzcGF0Y2g6IEQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRoaXMuX2Rpc3BhdGNoID0gZGlzcGF0Y2g7XG4gIH1cblxuICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgZ2V0IGRpc3BhdGNoKCk6IEQge1xuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaDtcbiAgfVxuXG4gIGJpbmRNaWRkbGV3YXJlKHtcbiAgICBkaXNwYXRjaCxcbiAgICBnZXRTdGF0ZSxcbiAgfToge1xuICAgIGRpc3BhdGNoOiBEO1xuICAgIGdldFN0YXRlOiBSZWR1eE1pZGRsZXdhcmVBUElbJ2dldFN0YXRlJ107XG4gIH0pIHtcbiAgICB0aGlzLl9kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKiogQWN0aW9uIERpc3BhdGNoZXJzICoqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZW5kcG9pbnQgd2l0aCBnaXZlbiBhcmdzLCB1cGRhdGluZyB0aGUgUmVhY3RpdmUgRGF0YSBDbGllbnQgY2FjaGUgd2l0aCB0aGUgcmVzcG9uc2Ugb3IgZXJyb3IgdXBvbiBjb21wbGV0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsID8gUmV0dXJuVHlwZTxFPlxuICA6IFByb21pc2U8RGVub3JtYWxpemU8RVsnc2NoZW1hJ10+PiA9PiB7XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlRmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3MsXG4gICAgfSk7XG4gICAgdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuXG4gICAgaWYgKGVuZHBvaW50LnNjaGVtYSkge1xuICAgICAgcmV0dXJuIGFjdGlvbi5tZXRhLnByb21pc2UudGhlbihpbnB1dCA9PlxuICAgICAgICBkZW5vcm1hbGl6ZShlbmRwb2ludC5zY2hlbWEsIGlucHV0LCB7fSwgYXJncyksXG4gICAgICApIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIGFjdGlvbi5tZXRhLnByb21pc2UgYXMgYW55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIG9ubHkgaWYgZW5kcG9pbnQgaXMgY29uc2lkZXJlZCAnc3RhbGUnOyBvdGhlcndpc2UgcmV0dXJucyB1bmRlZmluZWRcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNmZXRjaElmU3RhbGVcbiAgICovXG4gIGZldGNoSWZTdGFsZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsID8gUmV0dXJuVHlwZTxFPiB8IFJlc29sdmVUeXBlPEU+XG4gIDogUHJvbWlzZTxEZW5vcm1hbGl6ZTxFWydzY2hlbWEnXT4+IHwgRGVub3JtYWxpemU8RVsnc2NoZW1hJ10+ID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIGV4cGlyZXNBdCwgZXhwaXJ5U3RhdHVzIH0gPSB0aGlzLmdldFJlc3BvbnNlKFxuICAgICAgZW5kcG9pbnQsXG4gICAgICAuLi5hcmdzLFxuICAgICAgdGhpcy5nZXRTdGF0ZSgpLFxuICAgICk7XG4gICAgaWYgKGV4cGlyeVN0YXR1cyAhPT0gRXhwaXJ5U3RhdHVzLkludmFsaWQgJiYgRGF0ZS5ub3coKSA8PSBleHBpcmVzQXQpXG4gICAgICByZXR1cm4gZGF0YSBhcyBhbnk7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2goZW5kcG9pbnQsIC4uLmFyZ3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgcmVmZXRjaGluZyBhbmQgc3VzcGVuc2Ugb24gdXNlU3VzcGVuc2Ugd2l0aCB0aGUgc2FtZSBFbmRwb2ludCBhbmQgcGFyYW1ldGVycy5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlXG4gICAqL1xuICBpbnZhbGlkYXRlID0gPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsID9cbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgIGNyZWF0ZUludmFsaWRhdGUoZW5kcG9pbnQsIHtcbiAgICAgICAgICBhcmdzOiBhcmdzIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSBvbiBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjaW52YWxpZGF0ZUFsbFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbnZhbGlkYXRpb24gaXMgY29tbWl0ZWQuXG4gICAqL1xuICBpbnZhbGlkYXRlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVJbnZhbGlkYXRlQWxsKChrZXk6IHN0cmluZykgPT4gb3B0aW9ucy50ZXN0S2V5KGtleSkpKTtcblxuICAvKipcbiAgICogU2V0cyBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMgdG8gYmUgU1RBTEUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZXhwaXJlQWxsXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV4cGlyeSBpcyBjb21taXRlZC4gKk5PVCogZmV0Y2ggcHJvbWlzZVxuICAgKi9cbiAgZXhwaXJlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVFeHBpcmVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVudGlyZSBSZWFjdGl2ZSBEYXRhIENsaWVudCBjYWNoZS4gQWxsIGluZmxpZ2h0IHJlcXVlc3RzIHdpbGwgbm90IHJlc29sdmUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzZXRFbnRpcmVTdG9yZVxuICAgKi9cbiAgcmVzZXRFbnRpcmVTdG9yZSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuZGlzcGF0Y2goY3JlYXRlUmVzZXQoKSk7XG5cbiAgLyoqXG4gICAqIFNldHMgdmFsdWUgZm9yIHRoZSBRdWVyeWFibGUgYW5kIGFyZ3MuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0XG4gICAqL1xuICBzZXQ8UyBleHRlbmRzIFF1ZXJ5YWJsZT4oXG4gICAgc2NoZW1hOiBTLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5TY2hlbWFBcmdzPFM+LCAocHJldmlvdXNWYWx1ZTogRGVub3JtYWxpemU8Uz4pID0+IHt9XVxuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIHNldDxTIGV4dGVuZHMgUXVlcnlhYmxlPihcbiAgICBzY2hlbWE6IFMsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlNjaGVtYUFyZ3M8Uz4sIHt9XVxuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIHNldDxTIGV4dGVuZHMgUXVlcnlhYmxlPihcbiAgICBzY2hlbWE6IFMsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlNjaGVtYUFyZ3M8Uz4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmFsdWUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlU2V0KHNjaGVtYSwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFNjaGVtYUFyZ3M8Uz4sXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgICAvLyBUT0RPOiByZWplY3Qgd2l0aCBlcnJvciBpZiB0aGlzIGZhaWxzIGluIHJlZHVjZXJcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcmVzcG9uc2UgZm9yIHRoZSBFbmRwb2ludCBhbmQgYXJncy5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRSZXNwb25zZVxuICAgKi9cbiAgc2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBhbnldXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNvbHZlVHlwZTxFPiA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVTZXRSZXNwb25zZShlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGVycm9yIHJlc3BvbnNlIGZvciB0aGUgRW5kcG9pbnQgYW5kIGFyZ3MuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3JcbiAgICovXG4gIHNldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBFcnJvciA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVTZXRSZXNwb25zZShlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICAgIGVycm9yOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGluZmxpZ2h0IGZldGNoLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc29sdmVcbiAgICovXG4gIHJlc29sdmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIG1ldGE6XG4gICAgICB8IHtcbiAgICAgICAgICBhcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl07XG4gICAgICAgICAgcmVzcG9uc2U6IEVycm9yO1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yOiB0cnVlO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICBhcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl07XG4gICAgICAgICAgcmVzcG9uc2U6IGFueTtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgICBlcnJvcj86IGZhbHNlIHwgdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChjcmVhdGVTZXRSZXNwb25zZShlbmRwb2ludCwgbWV0YSBhcyBhbnkpKTtcbiAgfTtcblxuICAvKipcbiAgICogTWFya3MgYSBuZXcgc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc3Vic2NyaWJlXG4gICAqL1xuICBzdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgICAgRmV0Y2hGdW5jdGlvbixcbiAgICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGwgP1xuICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgY3JlYXRlU3Vic2NyaXB0aW9uKGVuZHBvaW50LCB7XG4gICAgICAgICAgYXJnczogYXJncyBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBjb21wbGV0aW9uIG9mIHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Vuc3Vic2NyaWJlXG4gICAqL1xuICB1bnN1YnNjcmliZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8XG4gICAgICBGZXRjaEZ1bmN0aW9uLFxuICAgICAgU2NoZW1hIHwgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkIHwgZmFsc2VcbiAgICA+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbCA/XG4gICAgICB0aGlzLmRpc3BhdGNoKFxuICAgICAgICBjcmVhdGVVbnN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKioqKioqKioqKioqKioqIE1vcmUgKioqKioqKioqKioqKioqL1xuXG4gIC8qIFRPRE86XG4gIGFib3J0ID0gPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6IFByb21pc2U8dm9pZD5cbiAgKi9cblxuICAvKipcbiAgICogR2V0cyBhIHNuYXBzaG90IChodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvU25hcHNob3QpXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc25hcHNob3RcbiAgICovXG4gIHNuYXBzaG90ID0gKHN0YXRlOiBTdGF0ZTx1bmtub3duPiwgZmV0Y2hlZEF0PzogbnVtYmVyKTogU25hcHNob3Q8dW5rbm93bj4gPT4ge1xuICAgIHJldHVybiBuZXcgU25hcHNob3QodGhpcywgc3RhdGUsIGZldGNoZWRBdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yLCBpZiBhbnksIGZvciBhIGdpdmVuIGVuZHBvaW50LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3Igbm8gZXJyb3JzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2dldEVycm9yXG4gICAqL1xuICBnZXRFcnJvcjxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6XG4gICAgICB8IHJlYWRvbmx5IFtudWxsLCBTdGF0ZTx1bmtub3duPl1cbiAgICAgIHwgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIFN0YXRlPHVua25vd24+XVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkO1xuXG4gIGdldEVycm9yPEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6XG4gICAgICB8IHJlYWRvbmx5IFtudWxsLCBTdGF0ZTx1bmtub3duPl1cbiAgICAgIHwgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+LCBTdGF0ZTx1bmtub3duPl1cbiAgKTogRXJyb3JUeXBlcyB8IHVuZGVmaW5lZDtcblxuICBnZXRFcnJvcihcbiAgICBlbmRwb2ludDogRW5kcG9pbnRJbnRlcmZhY2UsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLnVua25vd25bXSwgU3RhdGU8dW5rbm93bj5dXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQge1xuICAgIGlmIChyZXN0WzBdID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGtleSA9IGVuZHBvaW50LmtleSguLi5hcmdzKTtcblxuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGNvbnN0IGVycm9yID0gc3RhdGUuZW5kcG9pbnRzW2tleV07XG5cbiAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBtZXRhPy5lcnJvclBvbGljeSA9PT0gJ3NvZnQnKSByZXR1cm47XG5cbiAgICByZXR1cm4gbWV0YT8uZXJyb3IgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIChnbG9iYWxseSByZWZlcmVudGlhbGx5IHN0YWJsZSkgcmVzcG9uc2UgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQvYXJncyBwYWlyIGZyb20gc3RhdGUgZ2l2ZW4uXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0UmVzcG9uc2VcbiAgICovXG4gIGdldFJlc3BvbnNlPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDpcbiAgICAgIHwgcmVhZG9ubHkgW251bGwsIFN0YXRlPHVua25vd24+XVxuICAgICAgfCByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICBjb3VudFJlZjogKCkgPT4gKCkgPT4gdm9pZDtcbiAgfTtcblxuICBnZXRSZXNwb25zZTxcbiAgICBFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleScgfCAnc2NoZW1hJyB8ICdpbnZhbGlkSWZTdGFsZSc+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFtcbiAgICAgIC4uLihyZWFkb25seSBbLi4uUGFyYW1ldGVyczxFWydrZXknXT5dIHwgcmVhZG9ubHkgW251bGxdKSxcbiAgICAgIFN0YXRlPHVua25vd24+LFxuICAgIF1cbiAgKToge1xuICAgIGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgIGNvdW50UmVmOiAoKSA9PiAoKSA9PiB2b2lkO1xuICB9O1xuXG4gIGdldFJlc3BvbnNlKFxuICAgIGVuZHBvaW50OiBFbmRwb2ludEludGVyZmFjZSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4udW5rbm93bltdLCBTdGF0ZTx1bmtub3duPl1cbiAgKToge1xuICAgIGRhdGE6IHVua25vd247XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gICAgY291bnRSZWY6ICgpID0+ICgpID0+IHZvaWQ7XG4gIH0ge1xuICAgIC8vIFRPRE86IGJyZWFraW5nOiBvbmx5IHJldHVybiBkYXRhXG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzcG9uc2VNZXRhKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAoZ2xvYmFsbHkgcmVmZXJlbnRpYWxseSBzdGFibGUpIHJlc3BvbnNlIGZvciBhIGdpdmVuIGVuZHBvaW50L2FyZ3MgcGFpciBmcm9tIHN0YXRlIGdpdmVuLlxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2dldFJlc3BvbnNlTWV0YVxuICAgKi9cbiAgZ2V0UmVzcG9uc2VNZXRhPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDpcbiAgICAgIHwgcmVhZG9ubHkgW251bGwsIFN0YXRlPHVua25vd24+XVxuICAgICAgfCByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICBjb3VudFJlZjogKCkgPT4gKCkgPT4gdm9pZDtcbiAgfTtcblxuICBnZXRSZXNwb25zZU1ldGE8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbXG4gICAgICAuLi4ocmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSksXG4gICAgICBTdGF0ZTx1bmtub3duPixcbiAgICBdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICBjb3VudFJlZjogKCkgPT4gKCkgPT4gdm9pZDtcbiAgfTtcblxuICBnZXRSZXNwb25zZU1ldGEoXG4gICAgZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi51bmtub3duW10sIFN0YXRlPHVua25vd24+XVxuICApOiB7XG4gICAgZGF0YTogdW5rbm93bjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICBjb3VudFJlZjogKCkgPT4gKCkgPT4gdm9pZDtcbiAgfSB7XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdFxuICAgICAgLnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSlcbiAgICAgIC8vIGhhbmRsZSBGb3JtRGF0YVxuICAgICAgLm1hcChlbnN1cmVQb2pvKTtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGFyZ3MubGVuZ3RoICE9PSAxIHx8IGFyZ3NbMF0gIT09IG51bGw7XG4gICAgY29uc3Qga2V5ID0gaXNBY3RpdmUgPyBlbmRwb2ludC5rZXkoLi4uYXJncykgOiAnJztcbiAgICBjb25zdCBjYWNoZUVuZHBvaW50cyA9IGlzQWN0aXZlID8gc3RhdGUuZW5kcG9pbnRzW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc2NoZW1hID0gZW5kcG9pbnQuc2NoZW1hO1xuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGxldCBleHBpcmVzQXQgPSBtZXRhPy5leHBpcmVzQXQ7XG4gICAgLy8gaWYgd2UgaGF2ZSBubyBlbmRwb2ludCBlbnRyeSwgYW5kIG91ciBlbmRwb2ludCBoYXMgYSBzY2hlbWEgLSB0cnkgcXVlcnlpbmcgdGhlIHN0b3JlXG4gICAgY29uc3Qgc2hvdWxkUXVlcnkgPSBjYWNoZUVuZHBvaW50cyA9PT0gdW5kZWZpbmVkICYmIHNjaGVtYSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaW5wdXQgPVxuICAgICAgc2hvdWxkUXVlcnkgP1xuICAgICAgICAvLyBub3RoaW5nIGluIGVuZHBvaW50cyBjYWNoZSwgc28gdHJ5IHF1ZXJ5aW5nIGlmIHdlIGhhdmUgYSBzY2hlbWEgdG8gZG8gc29cbiAgICAgICAgdGhpcy5tZW1vLmJ1aWxkUXVlcnlLZXkoXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgc3RhdGUuZW50aXRpZXMgYXMgYW55LFxuICAgICAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICAgICAga2V5LFxuICAgICAgICApXG4gICAgICA6IGNhY2hlRW5kcG9pbnRzO1xuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgLy8gd2hlbiBub3QgYWN0aXZlIHNpbXBseSByZXR1cm4gdGhlIHF1ZXJ5IGlucHV0IHdpdGhvdXQgZGVub3JtYWxpemluZ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogaW5wdXQgYXMgYW55LFxuICAgICAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cy5WYWxpZCxcbiAgICAgICAgZXhwaXJlc0F0OiBJbmZpbml0eSxcbiAgICAgICAgY291bnRSZWY6ICgpID0+ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGlzSW52YWxpZCA9IGZhbHNlO1xuICAgIGlmIChzaG91bGRRdWVyeSkge1xuICAgICAgaXNJbnZhbGlkID0gIXZhbGlkYXRlUXVlcnlLZXkoaW5wdXQpO1xuICAgICAgLy8gZW5kcG9pbnQgd2l0aG91dCBlbnRpdGllc1xuICAgIH0gZWxzZSBpZiAoIXNjaGVtYSB8fCAhc2NoZW1hSGFzRW50aXR5KHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNhY2hlRW5kcG9pbnRzLFxuICAgICAgICBleHBpcnlTdGF0dXM6XG4gICAgICAgICAgbWV0YT8uaW52YWxpZGF0ZWQgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICAgIDogY2FjaGVFbmRwb2ludHMgJiYgIWVuZHBvaW50LmludmFsaWRJZlN0YWxlID8gRXhwaXJ5U3RhdHVzLlZhbGlkXG4gICAgICAgICAgOiBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGUsXG4gICAgICAgIGV4cGlyZXNBdDogZXhwaXJlc0F0IHx8IDAsXG4gICAgICAgIGNvdW50UmVmOiB0aGlzLmdjUG9saWN5LmNyZWF0ZUNvdW50UmVmKHsga2V5IH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzZWNvbmQgYXJndW1lbnQgaXMgZmFsc2UgaWYgYW55IGVudGl0aWVzIGFyZSBtaXNzaW5nXG5cbiAgICBjb25zdCB7IGRhdGEsIHBhdGhzIH0gPSB0aGlzLm1lbW8uZGVub3JtYWxpemUoXG4gICAgICBzY2hlbWEsXG4gICAgICBpbnB1dCxcbiAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICAgYXJncyxcbiAgICApIGFzIHsgZGF0YTogYW55OyBwYXRoczogRW50aXR5UGF0aFtdIH07XG5cbiAgICAvLyBub3RlOiBpc0ludmFsaWQgY2FuIG9ubHkgYmUgdHJ1ZSBpZiBzaG91bGRRdWVyeSBpcyB0cnVlXG4gICAgaWYgKCFleHBpcmVzQXQgJiYgaXNJbnZhbGlkKSBleHBpcmVzQXQgPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NoZW1hUmVzcG9uc2UoXG4gICAgICBkYXRhLFxuICAgICAga2V5LFxuICAgICAgcGF0aHMsXG4gICAgICBzdGF0ZS5lbnRpdHlNZXRhLFxuICAgICAgZXhwaXJlc0F0LFxuICAgICAgZW5kcG9pbnQuaW52YWxpZElmU3RhbGUgfHwgaXNJbnZhbGlkLFxuICAgICAgbWV0YSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIHN0b3JlIGZvciBhIFF1ZXJhYmxlIHNjaGVtYVxuICAgKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9Db250cm9sbGVyI2dldFxuICAgKi9cbiAgZ2V0PFMgZXh0ZW5kcyBRdWVyeWFibGU+KFxuICAgIHNjaGVtYTogUyxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbXG4gICAgICAuLi5TY2hlbWFBcmdzPFM+LFxuICAgICAgUGljazxTdGF0ZTx1bmtub3duPiwgJ2VudGl0aWVzJyB8ICdlbnRpdHlNZXRhJz4sXG4gICAgXVxuICApOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXSBhcyBTdGF0ZTxhbnk+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3RcbiAgICAgIC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpXG4gICAgICAubWFwKGVuc3VyZVBvam8pIGFzIFNjaGVtYUFyZ3M8Uz47XG5cbiAgICByZXR1cm4gdGhpcy5tZW1vLnF1ZXJ5KHNjaGVtYSwgYXJncywgc3RhdGUuZW50aXRpZXMgYXMgYW55LCBzdGF0ZS5pbmRleGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyaWVzIHRoZSBzdG9yZSBmb3IgYSBRdWVyYWJsZSBzY2hlbWE7IHByb3ZpZGluZyByZWxhdGVkIG1ldGFkYXRhXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0UXVlcnlNZXRhXG4gICAqL1xuICBnZXRRdWVyeU1ldGE8UyBleHRlbmRzIFF1ZXJ5YWJsZT4oXG4gICAgc2NoZW1hOiBTLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFtcbiAgICAgIC4uLlNjaGVtYUFyZ3M8Uz4sXG4gICAgICBQaWNrPFN0YXRlPHVua25vd24+LCAnZW50aXRpZXMnIHwgJ2VudGl0eU1ldGEnPixcbiAgICBdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+IHwgdW5kZWZpbmVkO1xuICAgIGNvdW50UmVmOiAoKSA9PiAoKSA9PiB2b2lkO1xuICB9IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXSBhcyBTdGF0ZTxhbnk+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3RcbiAgICAgIC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpXG4gICAgICAubWFwKGVuc3VyZVBvam8pIGFzIFNjaGVtYUFyZ3M8Uz47XG5cbiAgICAvLyBUT0RPOiBicmVha2luZzogU3dpdGNoIGJhY2sgdG8gdGhpcy5tZW1vLnF1ZXJ5KHNjaGVtYSwgYXJncywgc3RhdGUuZW50aXRpZXMgYXMgYW55LCBzdGF0ZS5pbmRleGVzKSB0byBkb1xuICAgIC8vIHRoaXMgbG9naWNcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMubWVtby5idWlsZFF1ZXJ5S2V5KFxuICAgICAgc2NoZW1hLFxuICAgICAgYXJncyxcbiAgICAgIHN0YXRlLmVudGl0aWVzIGFzIGFueSxcbiAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICBKU09OLnN0cmluZ2lmeShhcmdzKSxcbiAgICApO1xuXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuIHsgZGF0YTogdW5kZWZpbmVkLCBjb3VudFJlZjogKCkgPT4gKCkgPT4gdW5kZWZpbmVkIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBkYXRhLCBwYXRocyB9ID0gdGhpcy5tZW1vLmRlbm9ybWFsaXplKFxuICAgICAgc2NoZW1hLFxuICAgICAgaW5wdXQsXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgIGFyZ3MsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogdHlwZW9mIGRhdGEgPT09ICdzeW1ib2wnID8gdW5kZWZpbmVkIDogKGRhdGEgYXMgYW55KSxcbiAgICAgIGNvdW50UmVmOiB0aGlzLmdjUG9saWN5LmNyZWF0ZUNvdW50UmVmKHsgcGF0aHMgfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NoZW1hUmVzcG9uc2U8VD4oXG4gICAgZGF0YTogVCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBwYXRoczogRW50aXR5UGF0aFtdLFxuICAgIGVudGl0eU1ldGE6IFN0YXRlPHVua25vd24+WydlbnRpdHlNZXRhJ10sXG4gICAgZXhwaXJlc0F0OiBudW1iZXIsXG4gICAgaW52YWxpZElmU3RhbGU6IGJvb2xlYW4sXG4gICAgbWV0YTogeyBlcnJvcj86IHVua25vd247IGludmFsaWRhdGVkPzogdW5rbm93biB9ID0ge30sXG4gICk6IHtcbiAgICBkYXRhOiBUO1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgIGNvdW50UmVmOiAoKSA9PiAoKSA9PiB2b2lkO1xuICB9IHtcbiAgICBjb25zdCBpbnZhbGlkRGVub3JtYWxpemUgPSB0eXBlb2YgZGF0YSA9PT0gJ3N5bWJvbCc7XG5cbiAgICAvLyBmYWxsYmFjayB0byBlbnRpdHkgZXhwaXJ5IHRpbWVcbiAgICBpZiAoIWV4cGlyZXNBdCkge1xuICAgICAgZXhwaXJlc0F0ID0gZW50aXR5RXhwaXJlc0F0KHBhdGhzLCBlbnRpdHlNZXRhKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9jb25jZXB0cy9leHBpcnktcG9saWN5I2V4cGlyeS1zdGF0dXNcbiAgICAvLyB3ZSBkb24ndCB0cmFjayB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YWxlIG9yIGZyZXNoIGJlY2F1c2UgdGhhdCBpcyB0aWVkIHRvIHRyaWdnZXJpbmdcbiAgICAvLyBjb25kaXRpb25zXG4gICAgY29uc3QgZXhwaXJ5U3RhdHVzID1cbiAgICAgIG1ldGE/LmludmFsaWRhdGVkIHx8IChpbnZhbGlkRGVub3JtYWxpemUgJiYgIW1ldGE/LmVycm9yKSA/XG4gICAgICAgIEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICA6IGludmFsaWREZW5vcm1hbGl6ZSB8fCBpbnZhbGlkSWZTdGFsZSA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZVxuICAgICAgOiBFeHBpcnlTdGF0dXMuVmFsaWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YSxcbiAgICAgIGV4cGlyeVN0YXR1cyxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICAgIGNvdW50UmVmOiB0aGlzLmdjUG9saWN5LmNyZWF0ZUNvdW50UmVmKHsga2V5LCBwYXRocyB9KSxcbiAgICB9O1xuICB9XG59XG5cbi8vIGJlbmNobWFyazogaHR0cHM6Ly93d3cubWVhc3VyZXRoYXQubmV0L0JlbmNobWFya3MvU2hvdy8yNDY5MS8wL21pbi1yZWR1Y2VyLXZzLWltcGVyYXRpdmUtd2l0aC1wYXRoc1xuLy8gZWFybGllc3QgZXhwaXJ5IGRpY3RhdGVzIGFnZVxuZnVuY3Rpb24gZW50aXR5RXhwaXJlc0F0KFxuICBwYXRoczogRW50aXR5UGF0aFtdLFxuICBlbnRpdHlNZXRhOiB7XG4gICAgcmVhZG9ubHkgW2VudGl0eUtleTogc3RyaW5nXToge1xuICAgICAgcmVhZG9ubHkgW3BrOiBzdHJpbmddOiB7XG4gICAgICAgIHJlYWRvbmx5IGRhdGU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZXhwaXJlc0F0OiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyOyAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgRGF0YVByb3ZpZGVyXG4gICAgICB9O1xuICAgIH07XG4gIH0sXG4pIHtcbiAgbGV0IGV4cGlyZXNBdCA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IHsgcGssIGtleSB9IG9mIHBhdGhzKSB7XG4gICAgY29uc3QgZW50aXR5RXhwaXJ5ID0gZW50aXR5TWV0YVtrZXldPy5bcGtdPy5leHBpcmVzQXQ7XG4gICAgLy8gZXhwaXJlc0F0IHdpbGwgYWx3YXlzIHJlc29sdmUgdG8gZmFsc2Ugd2l0aCBhbnkgY29tcGFyaXNvblxuICAgIGlmIChlbnRpdHlFeHBpcnkgPCBleHBpcmVzQXQpIGV4cGlyZXNBdCA9IGVudGl0eUV4cGlyeTtcbiAgfVxuICByZXR1cm4gZXhwaXJlc0F0O1xufVxuXG4vKiogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNjaGVtYSBoYXMgYW55IGVudGl0aWVzLlxuICpcbiAqIFdpdGhvdXQgZW50aXRpZXMsIGRlbm9ybWFsaXphdGlvbiBpcyBub3QgbmVlZGVkLCBhbmQgcmVzdWx0cyBzaG91bGQgbm90IGJlIHF1ZXJpZWQuXG4gKi9cbmZ1bmN0aW9uIHNjaGVtYUhhc0VudGl0eShzY2hlbWE6IFNjaGVtYSk6IGJvb2xlYW4ge1xuICBpZiAoaXNFbnRpdHkoc2NoZW1hKSkgcmV0dXJuIHRydWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpXG4gICAgcmV0dXJuIHNjaGVtYS5sZW5ndGggIT09IDAgJiYgc2NoZW1hSGFzRW50aXR5KHNjaGVtYVswXSk7XG4gIGlmIChzY2hlbWEgJiYgKHR5cGVvZiBzY2hlbWEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBzY2hlbWEgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgY29uc3QgbmVzdGVkU2NoZW1hID1cbiAgICAgICdzY2hlbWEnIGluIHNjaGVtYSA/IChzY2hlbWEuc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIFNjaGVtYT4pIDogc2NoZW1hO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkU2NoZW1hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2NoZW1hSGFzRW50aXR5KG5lc3RlZFNjaGVtYSk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKG5lc3RlZFNjaGVtYSkuc29tZSh4ID0+IHNjaGVtYUhhc0VudGl0eSh4KSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgdHlwZSB7IEVycm9yVHlwZXMgfTtcblxuY2xhc3MgU25hcHNob3Q8VCA9IHVua25vd24+IGltcGxlbWVudHMgU25hcHNob3RJbnRlcmZhY2Uge1xuICBzdGF0aWMgcmVhZG9ubHkgYWJvcnQgPSBuZXcgQWJvcnRPcHRpbWlzdGljKCk7XG5cbiAgcHJpdmF0ZSBzdGF0ZTogU3RhdGU8VD47XG4gIHByaXZhdGUgY29udHJvbGxlcjogQ29udHJvbGxlcjtcbiAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGFib3J0ID0gU25hcHNob3QuYWJvcnQ7XG5cbiAgY29uc3RydWN0b3IoY29udHJvbGxlcjogQ29udHJvbGxlciwgc3RhdGU6IFN0YXRlPFQ+LCBmZXRjaGVkQXQgPSAwKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgdGhpcy5mZXRjaGVkQXQgPSBmZXRjaGVkQXQ7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIERhdGEgQWNjZXNzICoqKioqKioqKioqKioqKi9cbiAgLyoqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL1NuYXBzaG90I2dldFJlc3BvbnNlICovXG4gIGdldFJlc3BvbnNlPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgW251bGxdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfTtcblxuICBnZXRSZXNwb25zZTxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH07XG5cbiAgZ2V0UmVzcG9uc2U8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFWydrZXknXT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfTtcblxuICBnZXRSZXNwb25zZTxcbiAgICBFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleScgfCAnc2NoZW1hJyB8ICdpbnZhbGlkSWZTdGFsZSc+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKToge1xuICAgIGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFJlc3BvbnNlKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9TbmFwc2hvdCNnZXRSZXNwb25zZU1ldGEgKi9cbiAgZ2V0UmVzcG9uc2VNZXRhPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgW251bGxdXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfTtcblxuICBnZXRSZXNwb25zZU1ldGE8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKToge1xuICAgIGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9O1xuXG4gIGdldFJlc3BvbnNlTWV0YTxcbiAgICBFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleScgfCAnc2NoZW1hJyB8ICdpbnZhbGlkSWZTdGFsZSc+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKToge1xuICAgIGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9O1xuXG4gIGdldFJlc3BvbnNlTWV0YTxcbiAgICBFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleScgfCAnc2NoZW1hJyB8ICdpbnZhbGlkSWZTdGFsZSc+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKToge1xuICAgIGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICB9IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFJlc3BvbnNlTWV0YShlbmRwb2ludCwgLi4uYXJncywgdGhpcy5zdGF0ZSk7XG4gIH1cblxuICAvKiogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0RXJyb3IgKi9cbiAgZ2V0RXJyb3I8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogRXJyb3JUeXBlcyB8IHVuZGVmaW5lZDtcblxuICBnZXRFcnJvcjxFIGV4dGVuZHMgUGljazxFbmRwb2ludEludGVyZmFjZSwgJ2tleSc+PihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFWydrZXknXT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0RXJyb3I8RSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPj4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZWQgbWVtb2l6ZWQgdmFsdWUgZm9yIGFueSBRdWVyYWJsZSBzY2hlbWFcbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0XG4gICAqL1xuICBnZXQ8UyBleHRlbmRzIFF1ZXJ5YWJsZT4oXG4gICAgc2NoZW1hOiBTLFxuICAgIC4uLmFyZ3M6IFNjaGVtYUFyZ3M8Uz5cbiAgKTogRGVub3JtYWxpemVOdWxsYWJsZTxTPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXQoc2NoZW1hLCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyaWVzIHRoZSBzdG9yZSBmb3IgYSBRdWVyYWJsZSBzY2hlbWE7IHByb3ZpZGluZyByZWxhdGVkIG1ldGFkYXRhXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL1NuYXBzaG90I2dldFF1ZXJ5TWV0YVxuICAgKi9cbiAgZ2V0UXVlcnlNZXRhPFMgZXh0ZW5kcyBRdWVyeWFibGU+KFxuICAgIHNjaGVtYTogUyxcbiAgICAuLi5hcmdzOiBTY2hlbWFBcmdzPFM+XG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+IHwgdW5kZWZpbmVkO1xuICAgIGNvdW50UmVmOiAoKSA9PiAoKSA9PiB2b2lkO1xuICB9IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFF1ZXJ5TWV0YShzY2hlbWEsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQVFBLFNBQ0VBLFlBQVksRUFNWkMsU0FBUyxFQUNUQyxRQUFRLEVBQ1JDLFdBQVcsRUFDWEMsZ0JBQWdCLFFBQ1gsd0JBQXdCO0FBRS9CLE9BQU9DLGVBQWUsTUFBTSxzQkFBc0I7QUFDbEQsU0FDRUMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsUUFDYixpQ0FBaUM7QUFDeEMsU0FDRUMsZUFBZSxFQUNmQyxXQUFXLEVBQ1hDLGdCQUFnQixFQUNoQkMsbUJBQW1CLEVBQ25CQyxXQUFXLEVBQ1hDLFNBQVMsRUFDVEMsaUJBQWlCLFFBQ1osb0JBQW9CO0FBQzNCLE9BQU9DLFVBQVUsTUFBTSxpQkFBaUI7QUFJeEMsU0FBU0MsZ0JBQWdCLFFBQVEsc0JBQXNCO0FBQ3ZELFNBQVNDLFlBQVksUUFBUSxtQ0FBbUM7QUFDaEUsT0FBT0MsVUFBVSxNQUFNLHdCQUF3QjtBQWUvQyxNQUFNQyxhQUFhLEdBQUlDLE1BQWUsSUFBb0I7RUFDeEQsTUFBTSxJQUFJQyxLQUFLLENBQ2IsaUVBQWlFLEdBQy9ELHlEQUNKLENBQUM7QUFDSCxDQUFDO0FBQ0QsTUFBTUMsVUFBVSxHQUFHQSxDQUFBLEtBQXNCO0VBQ3ZDO0VBQ0E7RUFDQSxPQUFPTCxZQUFZO0FBQ3JCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU1NLFVBQVUsQ0FHN0I7RUFDQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztFQUVFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFNRTtBQUNGO0FBQ0E7O0VBR0VDLFdBQVdBLENBQUM7SUFDVkMsUUFBUSxHQUFHTixhQUFvQjtJQUMvQk8sUUFB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
|
package/legacy/index.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, key) {
|
|
2
|
-
return Object.prototype.hasOwnProperty.call(it, key);
|
|
3
|
-
};
|
|
4
1
|
import * as _INTERNAL__ from './internal.js';
|
|
5
2
|
export { _INTERNAL__ as __INTERNAL__ };
|
|
6
3
|
export { ExpiryStatus } from '@data-client/normalizr';
|
|
7
4
|
export { default as NetworkManager, ResetError } from './manager/NetworkManager.js';
|
|
5
|
+
export * from './state/GCPolicy.js';
|
|
8
6
|
export { default as createReducer, initialState } from './state/reducer/createReducer.js';
|
|
9
7
|
export { default as applyManager } from './manager/applyManager.js';
|
|
8
|
+
export { default as initManager } from './manager/initManager.js';
|
|
10
9
|
export { default as Controller } from './controller/Controller.js';
|
|
11
10
|
import * as _actions from './controller/actions/index.js';
|
|
12
11
|
export { _actions as actions };
|
|
@@ -17,4 +16,4 @@ export { _actionTypes as actionTypes };
|
|
|
17
16
|
/* istanbul ignore next */
|
|
18
17
|
export * from './types.js';
|
|
19
18
|
export * from './manager/index.js';
|
|
20
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSU5URVJOQUxfXyIsIl9fSU5URVJOQUxfXyIsIkV4cGlyeVN0YXR1cyIsImRlZmF1bHQiLCJOZXR3b3JrTWFuYWdlciIsIlJlc2V0RXJyb3IiLCJjcmVhdGVSZWR1Y2VyIiwiaW5pdGlhbFN0YXRlIiwiYXBwbHlNYW5hZ2VyIiwiaW5pdE1hbmFnZXIiLCJDb250cm9sbGVyIiwiX2FjdGlvbnMiLCJhY3Rpb25zIiwiX2FjdGlvblR5cGVzIiwiYWN0aW9uVHlwZXMiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgX19JTlRFUk5BTF9fIGZyb20gJy4vaW50ZXJuYWwuanMnO1xuZXhwb3J0IHR5cGUge1xuICBOZXR3b3JrRXJyb3IsXG4gIFVua25vd25FcnJvcixcbiAgRXJyb3JUeXBlcyxcbiAgU2NoZW1hLFxuICBFbmRwb2ludEludGVyZmFjZSxcbiAgRW50aXR5SW50ZXJmYWNlLFxuICBTY2hlbWFDbGFzcyxcbiAgUmVzb2x2ZVR5cGUsXG4gIERlbm9ybWFsaXplTnVsbGFibGUsXG4gIERlbm9ybWFsaXplLFxuICBOb3JtYWxpemUsXG4gIE5vcm1hbGl6ZU51bGxhYmxlLFxuICBGZXRjaEZ1bmN0aW9uLFxuICBFbmRwb2ludEV4dHJhT3B0aW9ucyxcbiAgUXVlcnlhYmxlLFxuICBTY2hlbWFBcmdzLFxuICBOSSxcbn0gZnJvbSAnQGRhdGEtY2xpZW50L25vcm1hbGl6cic7XG5leHBvcnQgeyBFeHBpcnlTdGF0dXMgfSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgTmV0d29ya01hbmFnZXIsXG4gIFJlc2V0RXJyb3IsXG59IGZyb20gJy4vbWFuYWdlci9OZXR3b3JrTWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3N0YXRlL0dDUG9saWN5LmpzJztcbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgY3JlYXRlUmVkdWNlcixcbiAgaW5pdGlhbFN0YXRlLFxufSBmcm9tICcuL3N0YXRlL3JlZHVjZXIvY3JlYXRlUmVkdWNlci5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5TWFuYWdlciB9IGZyb20gJy4vbWFuYWdlci9hcHBseU1hbmFnZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbml0TWFuYWdlciB9IGZyb20gJy4vbWFuYWdlci9pbml0TWFuYWdlci5qcyc7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ29udHJvbGxlciB9IGZyb20gJy4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGF0YUNsaWVudERpc3BhdGNoLFxuICBHZW5lcmljRGlzcGF0Y2gsXG59IGZyb20gJy4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmV4cG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnLi9jb250cm9sbGVyL2FjdGlvbnMvaW5kZXguanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyb2xsZXIvdHlwZXMuanMnO1xuLyoqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0FjdGlvbnMgKi9cbmV4cG9ydCAqIGFzIGFjdGlvblR5cGVzIGZyb20gJy4vYWN0aW9uVHlwZXMuanMnO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyL2luZGV4LmpzJztcbiJdLCJtYXBwaW5ncyI6IjZCQUE4QixlQUFlO0FBQUEsU0FBQUEsV0FBQSxJQUFqQ0MsWUFBWTtBQW9CeEIsU0FBU0MsWUFBWSxRQUFRLHdCQUF3QjtBQUNyRCxTQUNFQyxPQUFPLElBQUlDLGNBQWMsRUFDekJDLFVBQVUsUUFDTCw2QkFBNkI7QUFDcEMsY0FBYyxxQkFBcUI7QUFDbkMsU0FDRUYsT0FBTyxJQUFJRyxhQUFhLEVBQ3hCQyxZQUFZLFFBQ1Asa0NBQWtDO0FBQ3pDLFNBQVNKLE9BQU8sSUFBSUssWUFBWSxRQUFRLDJCQUEyQjtBQUNuRSxTQUFTTCxPQUFPLElBQUlNLFdBQVcsUUFBUSwwQkFBMEI7QUFFakUsU0FBU04sT0FBTyxJQUFJTyxVQUFVLFFBQVEsNEJBQTRCO0FBQUMsWUFBQUMsUUFBQSxNQUsxQywrQkFBK0I7QUFBQSxTQUFBQSxRQUFBLElBQTVDQyxPQUFPO0FBRW5CLGNBQWMsdUJBQXVCO0FBQ3JDO0FBQUEsWUFBQUMsWUFBQSxNQUM2QixrQkFBa0I7QUFBQSxTQUFBQSxZQUFBLElBQW5DQyxXQUFXO0FBQ3ZCO0FBQ0EsY0FBYyxZQUFZO0FBQzFCLGNBQWMsb0JBQW9CIiwiaWdub3JlTGlzdCI6W119
|