first commit
|
After Width: | Height: | Size: 830 B |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 839 B |
|
After Width: | Height: | Size: 829 B |
|
After Width: | Height: | Size: 907 B |
|
After Width: | Height: | Size: 833 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 736 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 797 B |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 835 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 773 B |
|
After Width: | Height: | Size: 979 B |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
|
@ -0,0 +1,72 @@
|
|||
<!DOCTYPE html>
|
||||
<!-- saved from url=(0057)https://medium.com/media/37989df7e0c024c98a85ab9154886677 -->
|
||||
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://medium.com/media/37989df7e0c024c98a85ab9154886677"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>MuZero pseudocode (https://arxiv.org/src/1911.08265v1/anc/pseudocode.py) – Medium</title><meta name="description" content="You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session."><meta name="twitter:widgets:csp" content="on"><meta name="robots" content="noindex"><!--<base target="_blank">--><base href="." target="_blank"><style>body {text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: "ff-tisa-web-pro", Georgia, Cambria, "Times New Roman", Times, serif; font-weight: 400; color: #333332; font-size: 18px; line-height: 1.4; margin: 0; background-color: white; overflow: hidden;}iframe {max-width: 100%;}</style></head><body><style>.gist .gist-file { margin-bottom: 0 !important; }.gist { text-rendering: auto; }</style><script src="./95d78debdbb8309bb77f90799d18ea3d.js" charset="utf-8"></script><link rel="stylesheet" href="./gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css"><div id="gist99758597" class="gist">
|
||||
<div class="gist-file">
|
||||
<div class="gist-data">
|
||||
<div class="js-gist-file-update-container js-task-list-container file-box">
|
||||
<div id="file-pseudocode-py" class="file my-2">
|
||||
|
||||
|
||||
<div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
|
||||
|
||||
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
|
||||
<tbody><tr>
|
||||
<td id="file-pseudocode-py-L1" class="blob-num js-line-number" data-line-number="1"></td>
|
||||
<td id="file-pseudocode-py-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">muzero</span>(<span class="pl-s1">config</span>: <span class="pl-v">MuZeroConfig</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L2" class="blob-num js-line-number" data-line-number="2"></td>
|
||||
<td id="file-pseudocode-py-LC2" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">storage</span> <span class="pl-c1">=</span> <span class="pl-v">SharedStorage</span>()</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L3" class="blob-num js-line-number" data-line-number="3"></td>
|
||||
<td id="file-pseudocode-py-LC3" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">replay_buffer</span> <span class="pl-c1">=</span> <span class="pl-v">ReplayBuffer</span>(<span class="pl-s1">config</span>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L4" class="blob-num js-line-number" data-line-number="4"></td>
|
||||
<td id="file-pseudocode-py-LC4" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L5" class="blob-num js-line-number" data-line-number="5"></td>
|
||||
<td id="file-pseudocode-py-LC5" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> <span class="pl-s1">_</span> <span class="pl-c1">in</span> <span class="pl-en">range</span>(<span class="pl-s1">config</span>.<span class="pl-s1">num_actors</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L6" class="blob-num js-line-number" data-line-number="6"></td>
|
||||
<td id="file-pseudocode-py-LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-en">launch_job</span>(<span class="pl-s1">run_selfplay</span>, <span class="pl-s1">config</span>, <span class="pl-s1">storage</span>, <span class="pl-s1">replay_buffer</span>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L7" class="blob-num js-line-number" data-line-number="7"></td>
|
||||
<td id="file-pseudocode-py-LC7" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L8" class="blob-num js-line-number" data-line-number="8"></td>
|
||||
<td id="file-pseudocode-py-LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-en">train_network</span>(<span class="pl-s1">config</span>, <span class="pl-s1">storage</span>, <span class="pl-s1">replay_buffer</span>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L9" class="blob-num js-line-number" data-line-number="9"></td>
|
||||
<td id="file-pseudocode-py-LC9" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L10" class="blob-num js-line-number" data-line-number="10"></td>
|
||||
<td id="file-pseudocode-py-LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-s1">storage</span>.<span class="pl-en">latest_network</span>()</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="gist-meta">
|
||||
<a href="https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d/raw/16c8c7ad17b0d0c76464bf2dbefa3f06cdd80da3/pseudocode.py" style="float:right">view raw</a>
|
||||
<a href="https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d#file-pseudocode-py">pseudocode.py</a>
|
||||
hosted with ❤ by <a href="https://github.com/">GitHub</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>var height = -1; var delayMs = 200; if (document) {document.domain = document.domain;}function notifyResize(height) {height = height ? height : document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize(height);var elements = document.getElementsByClassName("gist-data"); for (var i = 0; i < elements.length; i++) {elements[i].style.overflow = "visible"}resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === "#amp=1" && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: "amp", type: "embed-size", height: height}, "*");}if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage(height); resized = true;}return resized;}function maybeResize() {try {if (document.documentElement.offsetHeight != height && notifyResize()) {height = document.documentElement.offsetHeight;}delayMs = Math.min(delayMs * 2, 1000000); setTimeout(maybeResize, delayMs);} catch(error) {console.log('maybeResize error: ', error)}}maybeResize();</script></body></html>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
(self.webpackChunklite=self.webpackChunklite||[]).push([[4964],{77412:r=>{r.exports=function(r,t){for(var e=-1,n=null==r?0:r.length;++e<n&&!1!==t(r[e],e,r););return r}},44037:(r,t,e)=>{var n=e(98363),o=e(3674);r.exports=function(r,t){return r&&n(t,o(t),r)}},63886:(r,t,e)=>{var n=e(98363),o=e(81704);r.exports=function(r,t){return r&&n(t,o(t),r)}},85990:(r,t,e)=>{var n=e(46384),o=e(77412),c=e(34865),a=e(44037),u=e(63886),i=e(64626),s=e(278),b=e(18805),f=e(1911),j=e(58234),p=e(46904),l=e(64160),v=e(43824),y=e(29148),x=e(38517),A=e(1469),h=e(44144),w=e(56688),d=e(13218),g=e(72928),S=e(3674),m=e(81704),I="[object Arguments]",O="[object Function]",U="[object Object]",E={};E[I]=E["[object Array]"]=E["[object ArrayBuffer]"]=E["[object DataView]"]=E["[object Boolean]"]=E["[object Date]"]=E["[object Float32Array]"]=E["[object Float64Array]"]=E["[object Int8Array]"]=E["[object Int16Array]"]=E["[object Int32Array]"]=E["[object Map]"]=E["[object Number]"]=E[U]=E["[object RegExp]"]=E["[object Set]"]=E["[object String]"]=E["[object Symbol]"]=E["[object Uint8Array]"]=E["[object Uint8ClampedArray]"]=E["[object Uint16Array]"]=E["[object Uint32Array]"]=!0,E["[object Error]"]=E[O]=E["[object WeakMap]"]=!1,r.exports=function r(t,e,F,k,M,B){var C,D=1&e,N=2&e,P=4&e;if(F&&(C=M?F(t,k,M,B):F(t)),void 0!==C)return C;if(!d(t))return t;var R=A(t);if(R){if(C=v(t),!D)return s(t,C)}else{var V=l(t),G=V==O||"[object GeneratorFunction]"==V;if(h(t))return i(t,D);if(V==U||V==I||G&&!M){if(C=N||G?{}:x(t),!D)return N?f(t,u(C,t)):b(t,a(C,t))}else{if(!E[V])return M?t:{};C=y(t,V,D)}}B||(B=new n);var L=B.get(t);if(L)return L;B.set(t,C),g(t)?t.forEach((function(n){C.add(r(n,e,F,n,t,B))})):w(t)&&t.forEach((function(n,o){C.set(o,r(n,e,F,o,t,B))}));var T=R?void 0:(P?N?p:j:N?m:S)(t);return o(T||t,(function(n,o){T&&(n=t[o=n]),c(C,o,r(n,e,F,o,t,B))})),C}},25588:(r,t,e)=>{var n=e(64160),o=e(37005);r.exports=function(r){return o(r)&&"[object Map]"==n(r)}},29221:(r,t,e)=>{var n=e(64160),o=e(37005);r.exports=function(r){return o(r)&&"[object Set]"==n(r)}},63012:(r,t,e)=>{var n=e(97786),o=e(10611),c=e(71811);r.exports=function(r,t,e){for(var a=-1,u=t.length,i={};++a<u;){var s=t[a],b=n(r,s);e(b,s)&&o(i,c(s,r),b)}return i}},57157:(r,t,e)=>{var n=e(40214);r.exports=function(r,t){var e=t?n(r.buffer):r.buffer;return new r.constructor(e,r.byteOffset,r.byteLength)}},93147:r=>{var t=/\w*$/;r.exports=function(r){var e=new r.constructor(r.source,t.exec(r));return e.lastIndex=r.lastIndex,e}},40419:(r,t,e)=>{var n=e(62705),o=n?n.prototype:void 0,c=o?o.valueOf:void 0;r.exports=function(r){return c?Object(c.call(r)):{}}},18805:(r,t,e)=>{var n=e(98363),o=e(99551);r.exports=function(r,t){return n(r,o(r),t)}},1911:(r,t,e)=>{var n=e(98363),o=e(51442);r.exports=function(r,t){return n(r,o(r),t)}},46904:(r,t,e)=>{var n=e(68866),o=e(51442),c=e(81704);r.exports=function(r){return n(r,c,o)}},51442:(r,t,e)=>{var n=e(62488),o=e(85924),c=e(99551),a=e(70479),u=Object.getOwnPropertySymbols?function(r){for(var t=[];r;)n(t,c(r)),r=o(r);return t}:a;r.exports=u},43824:r=>{var t=Object.prototype.hasOwnProperty;r.exports=function(r){var e=r.length,n=new r.constructor(e);return e&&"string"==typeof r[0]&&t.call(r,"index")&&(n.index=r.index,n.input=r.input),n}},29148:(r,t,e)=>{var n=e(40214),o=e(57157),c=e(93147),a=e(40419),u=e(77133);r.exports=function(r,t,e){var i=r.constructor;switch(t){case"[object ArrayBuffer]":return n(r);case"[object Boolean]":case"[object Date]":return new i(+r);case"[object DataView]":return o(r,e);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return u(r,e);case"[object Map]":return new i;case"[object Number]":case"[object String]":return new i(r);case"[object RegExp]":return c(r);case"[object Set]":return new i;case"[object Symbol]":return a(r)}}},50361:(r,t,e)=>{var n=e(85990);r.exports=function(r){return n(r,5)}},56688:(r,t,e)=>{var n=e(25588),o=e(7518),c=e(31167),a=c&&c.isMap,u=a?o(a):n;r.exports=u},45220:r=>{r.exports=function(r){return null===r}},72928:(r,t,e)=>{var n=e(29221),o=e(7518),c=e(31167),a=c&&c.isSet,u=a?o(a):n;r.exports=u},94885:r=>{r.exports=function(r){if("function"!=typeof r)throw new TypeError("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!r.call(this);case 1:return!r.call(this,t[0]);case 2:return!r.call(this,t[0],t[1]);case 3:return!r.call(this,t[0],t[1],t[2])}return!r.apply(this,t)}}},14176:(r,t,e)=>{var n=e(67206),o=e(94885),c=e(35937);r.exports=function(r,t){return c(r,o(n(t)))}},35937:(r,t,e)=>{var n=e(29932),o=e(67206),c=e(63012),a=e(46904);r.exports=function(r,t){if(null==r)return{};var e=n(a(r),(function(r){return[r]}));return t=o(t),c(r,e,(function(r,e){return t(r,e[0])}))}}}]);
|
||||
//# sourceMappingURL=https://stats.medium.build/lite/sourcemaps/4964.fb36722e.chunk.js.map
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<!DOCTYPE html>
|
||||
<!-- saved from url=(0057)https://medium.com/media/57eaa5c07fa0d54806a3c01079a6365c -->
|
||||
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://medium.com/media/57eaa5c07fa0d54806a3c01079a6365c"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>SharedStorage (https://arxiv.org/src/1911.08265v1/anc/pseudocode.py) – Medium</title><meta name="description" content="You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session."><meta name="twitter:widgets:csp" content="on"><meta name="robots" content="noindex"><!--<base target="_blank">--><base href="." target="_blank"><style>body {text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: "ff-tisa-web-pro", Georgia, Cambria, "Times New Roman", Times, serif; font-weight: 400; color: #333332; font-size: 18px; line-height: 1.4; margin: 0; background-color: white; overflow: hidden;}iframe {max-width: 100%;}</style></head><body><style>.gist .gist-file { margin-bottom: 0 !important; }.gist { text-rendering: auto; }</style><script src="./0f723c9f48100eca4e842c551d8ac03b.js" charset="utf-8"></script><link rel="stylesheet" href="./gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css"><div id="gist99758814" class="gist">
|
||||
<div class="gist-file">
|
||||
<div class="gist-data">
|
||||
<div class="js-gist-file-update-container js-task-list-container file-box">
|
||||
<div id="file-pseudocode-py" class="file my-2">
|
||||
|
||||
|
||||
<div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
|
||||
|
||||
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
|
||||
<tbody><tr>
|
||||
<td id="file-pseudocode-py-L1" class="blob-num js-line-number" data-line-number="1"></td>
|
||||
<td id="file-pseudocode-py-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-v">SharedStorage</span>(<span class="pl-s1">object</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L2" class="blob-num js-line-number" data-line-number="2"></td>
|
||||
<td id="file-pseudocode-py-LC2" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L3" class="blob-num js-line-number" data-line-number="3"></td>
|
||||
<td id="file-pseudocode-py-LC3" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">__init__</span>(<span class="pl-s1">self</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L4" class="blob-num js-line-number" data-line-number="4"></td>
|
||||
<td id="file-pseudocode-py-LC4" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span> <span class="pl-c1">=</span> {}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L5" class="blob-num js-line-number" data-line-number="5"></td>
|
||||
<td id="file-pseudocode-py-LC5" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L6" class="blob-num js-line-number" data-line-number="6"></td>
|
||||
<td id="file-pseudocode-py-LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">latest_network</span>(<span class="pl-s1">self</span>) <span class="pl-c1">-></span> <span class="pl-v">Network</span>:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L7" class="blob-num js-line-number" data-line-number="7"></td>
|
||||
<td id="file-pseudocode-py-LC7" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L8" class="blob-num js-line-number" data-line-number="8"></td>
|
||||
<td id="file-pseudocode-py-LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>[<span class="pl-en">max</span>(<span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>.<span class="pl-en">keys</span>())]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L9" class="blob-num js-line-number" data-line-number="9"></td>
|
||||
<td id="file-pseudocode-py-LC9" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L10" class="blob-num js-line-number" data-line-number="10"></td>
|
||||
<td id="file-pseudocode-py-LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"># policy -> uniform, value -> 0, reward -> 0</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L11" class="blob-num js-line-number" data-line-number="11"></td>
|
||||
<td id="file-pseudocode-py-LC11" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-en">make_uniform_network</span>()</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L12" class="blob-num js-line-number" data-line-number="12"></td>
|
||||
<td id="file-pseudocode-py-LC12" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L13" class="blob-num js-line-number" data-line-number="13"></td>
|
||||
<td id="file-pseudocode-py-LC13" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">save_network</span>(<span class="pl-s1">self</span>, <span class="pl-s1">step</span>: <span class="pl-s1">int</span>, <span class="pl-s1">network</span>: <span class="pl-v">Network</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L14" class="blob-num js-line-number" data-line-number="14"></td>
|
||||
<td id="file-pseudocode-py-LC14" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">_networks</span>[<span class="pl-s1">step</span>] <span class="pl-c1">=</span> <span class="pl-s1">network</span></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="gist-meta">
|
||||
<a href="https://gist.github.com/davidADSP/0f723c9f48100eca4e842c551d8ac03b/raw/3194ccfc1ab7c3803f53dc6f5d8e6076e5cbcdfe/pseudocode.py" style="float:right">view raw</a>
|
||||
<a href="https://gist.github.com/davidADSP/0f723c9f48100eca4e842c551d8ac03b#file-pseudocode-py">pseudocode.py</a>
|
||||
hosted with ❤ by <a href="https://github.com/">GitHub</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>var height = -1; var delayMs = 200; if (document) {document.domain = document.domain;}function notifyResize(height) {height = height ? height : document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize(height);var elements = document.getElementsByClassName("gist-data"); for (var i = 0; i < elements.length; i++) {elements[i].style.overflow = "visible"}resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === "#amp=1" && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: "amp", type: "embed-size", height: height}, "*");}if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage(height); resized = true;}return resized;}function maybeResize() {try {if (document.documentElement.offsetHeight != height && notifyResize()) {height = document.documentElement.offsetHeight;}delayMs = Math.min(delayMs * 2, 1000000); setTimeout(maybeResize, delayMs);} catch(error) {console.log('maybeResize error: ', error)}}maybeResize();</script></body></html>
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
<!DOCTYPE html>
|
||||
<!-- saved from url=(0057)https://medium.com/media/83100f618299e154eaa27d3b5cfef9e4 -->
|
||||
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://medium.com/media/83100f618299e154eaa27d3b5cfef9e4"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>ReplayBuffer (https://arxiv.org/src/1911.08265v1/anc/pseudocode.py) – Medium</title><meta name="description" content="You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session."><meta name="twitter:widgets:csp" content="on"><meta name="robots" content="noindex"><!--<base target="_blank">--><base href="." target="_blank"><style>body {text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-family: "ff-tisa-web-pro", Georgia, Cambria, "Times New Roman", Times, serif; font-weight: 400; color: #333332; font-size: 18px; line-height: 1.4; margin: 0; background-color: white; overflow: hidden;}iframe {max-width: 100%;}</style></head><body><style>.gist .gist-file { margin-bottom: 0 !important; }.gist { text-rendering: auto; }</style><script src="./2bb4814c4d4a2b3528fc466d974796d6.js" charset="utf-8"></script><link rel="stylesheet" href="./gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css"><div id="gist99758972" class="gist">
|
||||
<div class="gist-file">
|
||||
<div class="gist-data">
|
||||
<div class="js-gist-file-update-container js-task-list-container file-box">
|
||||
<div id="file-pseudocode-py" class="file my-2">
|
||||
|
||||
|
||||
<div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
|
||||
|
||||
<table class="highlight tab-size js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">
|
||||
<tbody><tr>
|
||||
<td id="file-pseudocode-py-L1" class="blob-num js-line-number" data-line-number="1"></td>
|
||||
<td id="file-pseudocode-py-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-v">ReplayBuffer</span>(<span class="pl-s1">object</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L2" class="blob-num js-line-number" data-line-number="2"></td>
|
||||
<td id="file-pseudocode-py-LC2" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L3" class="blob-num js-line-number" data-line-number="3"></td>
|
||||
<td id="file-pseudocode-py-LC3" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">__init__</span>(<span class="pl-s1">self</span>, <span class="pl-s1">config</span>: <span class="pl-v">MuZeroConfig</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L4" class="blob-num js-line-number" data-line-number="4"></td>
|
||||
<td id="file-pseudocode-py-LC4" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">window_size</span> <span class="pl-c1">=</span> <span class="pl-s1">config</span>.<span class="pl-s1">window_size</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L5" class="blob-num js-line-number" data-line-number="5"></td>
|
||||
<td id="file-pseudocode-py-LC5" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">batch_size</span> <span class="pl-c1">=</span> <span class="pl-s1">config</span>.<span class="pl-s1">batch_size</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L6" class="blob-num js-line-number" data-line-number="6"></td>
|
||||
<td id="file-pseudocode-py-LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">buffer</span> <span class="pl-c1">=</span> []</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L7" class="blob-num js-line-number" data-line-number="7"></td>
|
||||
<td id="file-pseudocode-py-LC7" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L8" class="blob-num js-line-number" data-line-number="8"></td>
|
||||
<td id="file-pseudocode-py-LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">save_game</span>(<span class="pl-s1">self</span>, <span class="pl-s1">game</span>):</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L9" class="blob-num js-line-number" data-line-number="9"></td>
|
||||
<td id="file-pseudocode-py-LC9" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-en">len</span>(<span class="pl-s1">self</span>.<span class="pl-s1">buffer</span>) <span class="pl-c1">></span> <span class="pl-s1">self</span>.<span class="pl-s1">window_size</span>:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L10" class="blob-num js-line-number" data-line-number="10"></td>
|
||||
<td id="file-pseudocode-py-LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">buffer</span>.<span class="pl-en">pop</span>(<span class="pl-c1">0</span>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L11" class="blob-num js-line-number" data-line-number="11"></td>
|
||||
<td id="file-pseudocode-py-LC11" class="blob-code blob-code-inner js-file-line"> <span class="pl-s1">self</span>.<span class="pl-s1">buffer</span>.<span class="pl-en">append</span>(<span class="pl-s1">game</span>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L12" class="blob-num js-line-number" data-line-number="12"></td>
|
||||
<td id="file-pseudocode-py-LC12" class="blob-code blob-code-inner js-file-line">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="file-pseudocode-py-L13" class="blob-num js-line-number" data-line-number="13"></td>
|
||||
<td id="file-pseudocode-py-LC13" class="blob-code blob-code-inner js-file-line"> ...</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="gist-meta">
|
||||
<a href="https://gist.github.com/davidADSP/2bb4814c4d4a2b3528fc466d974796d6/raw/00ad54507e4bc6322a6eafe6d66c69fd9002dc83/pseudocode.py" style="float:right">view raw</a>
|
||||
<a href="https://gist.github.com/davidADSP/2bb4814c4d4a2b3528fc466d974796d6#file-pseudocode-py">pseudocode.py</a>
|
||||
hosted with ❤ by <a href="https://github.com/">GitHub</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>var height = -1; var delayMs = 200; if (document) {document.domain = document.domain;}function notifyResize(height) {height = height ? height : document.documentElement.offsetHeight; var resized = false; if (window.donkey && donkey.resize) {donkey.resize(height);var elements = document.getElementsByClassName("gist-data"); for (var i = 0; i < elements.length; i++) {elements[i].style.overflow = "visible"}resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === "#amp=1" && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: "amp", type: "embed-size", height: height}, "*");}if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize) {window.webkit.messageHandlers.resize.postMessage(height); resized = true;}return resized;}function maybeResize() {try {if (document.documentElement.offsetHeight != height && notifyResize()) {height = document.documentElement.offsetHeight;}delayMs = Math.min(delayMs * 2, 1000000); setTimeout(maybeResize, delayMs);} catch(error) {console.log('maybeResize error: ', error)}}maybeResize();</script></body></html>
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
document.write('<link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-4e64bbf96c31ed6c9ee61f08cea01836.css">')
|
||||
document.write('<div id=\"gist99758597\" class=\"gist\">\n <div class=\"gist-file\">\n <div class=\"gist-data\">\n <div class=\"js-gist-file-update-container js-task-list-container file-box\">\n <div id=\"file-pseudocode-py\" class=\"file my-2\">\n \n\n <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-python \">\n \n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip>\n <tr>\n <td id=\"file-pseudocode-py-L1\" class=\"blob-num js-line-number\" data-line-number=\"1\"><\/td>\n <td id=\"file-pseudocode-py-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>def<\/span> <span class=pl-en>muzero<\/span>(<span class=pl-s1>config<\/span>: <span class=pl-v>MuZeroConfig<\/span>):<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"><\/td>\n <td id=\"file-pseudocode-py-LC2\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-s1>storage<\/span> <span class=pl-c1>=<\/span> <span class=pl-v>SharedStorage<\/span>()<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"><\/td>\n <td id=\"file-pseudocode-py-LC3\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-s1>replay_buffer<\/span> <span class=pl-c1>=<\/span> <span class=pl-v>ReplayBuffer<\/span>(<span class=pl-s1>config<\/span>)<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"><\/td>\n <td id=\"file-pseudocode-py-LC4\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"><\/td>\n <td id=\"file-pseudocode-py-LC5\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-k>for<\/span> <span class=pl-s1>_<\/span> <span class=pl-c1>in<\/span> <span class=pl-en>range<\/span>(<span class=pl-s1>config<\/span>.<span class=pl-s1>num_actors<\/span>):<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"><\/td>\n <td id=\"file-pseudocode-py-LC6\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-en>launch_job<\/span>(<span class=pl-s1>run_selfplay<\/span>, <span class=pl-s1>config<\/span>, <span class=pl-s1>storage<\/span>, <span class=pl-s1>replay_buffer<\/span>)<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"><\/td>\n <td id=\"file-pseudocode-py-LC7\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"><\/td>\n <td id=\"file-pseudocode-py-LC8\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-en>train_network<\/span>(<span class=pl-s1>config<\/span>, <span class=pl-s1>storage<\/span>, <span class=pl-s1>replay_buffer<\/span>)<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"><\/td>\n <td id=\"file-pseudocode-py-LC9\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n <\/tr>\n <tr>\n <td id=\"file-pseudocode-py-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"><\/td>\n <td id=\"file-pseudocode-py-LC10\" class=\"blob-code blob-code-inner js-file-line\"> <span class=pl-k>return<\/span> <span class=pl-s1>storage<\/span>.<span class=pl-en>latest_network<\/span>()<\/td>\n <\/tr>\n<\/table>\n\n\n <\/div>\n\n <\/div>\n<\/div>\n\n <\/div>\n <div class=\"gist-meta\">\n <a href=\"https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d/raw/16c8c7ad17b0d0c76464bf2dbefa3f06cdd80da3/pseudocode.py\" style=\"float:right\">view raw<\/a>\n <a href=\"https://gist.github.com/davidADSP/95d78debdbb8309bb77f90799d18ea3d#file-pseudocode-py\">pseudocode.py<\/a>\n hosted with ❤ by <a href=\"https://github.com\">GitHub<\/a>\n <\/div>\n <\/div>\n<\/div>\n')
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
<!-- saved from url=(0072)https://a16180790160.cdn.optimizely.com/client_storage/a16180790160.html -->
|
||||
<html><link type="text/css" id="dark-mode" rel="stylesheet" href="https://a16180790160.cdn.optimizely.com/client_storage/a16180790160.html"><style type="text/css" id="dark-mode-custom-style"></style><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script>
|
||||
|
||||
var allowedOrigins = [["^https?://(.+\\.)?medium\\.com$", ""], ["^https?://(.+\\.)?hatch\\.dm$", ""]];
|
||||
var blockedOrigins = [];
|
||||
|
||||
!function(){"use strict";var d,l,r,c;try{d=window.localStorage}catch(e){l=e}function u(e){return!c||0!==e.indexOf(c.origin)}function v(e,i){return new RegExp(i[0],i[1]).test(e)}function p(e){if(!r){var i={id:"iframeerror",type:"ERROR",response:"Error accessing localStorage: "+(r=e?e.toString():"Localstorage is undefined")};0,event.source.postMessage(JSON.stringify(i),event.origin)}}window.addEventListener("message",function(e){var i,r,t,n,o,s=!1;for(o=0;o<allowedOrigins.length;o++)if(v(e.origin,allowedOrigins[o])){s=!0;break}if(s)for(o=0;o<blockedOrigins.length;o++)if(v(e.origin,blockedOrigins[o])){0,s=!1;break}if(s){c=e;try{i=JSON.parse(e.data)}catch(e){return void 0}if(t=e.origin+"_"+i.key,!d)return p(l);if("GET"===i.type)r=d.getItem(t);else if("PUT"===i.type)try{r=d.setItem(t,i.value)}catch(e){return p(e)}else if("GETALL"===i.type)for(var a in r={},d)d.hasOwnProperty(a)&&u(a)&&(r[a]=d.getItem(a));else{if("DELETE"!==i.type)return void 0;for(var a in d)if(d.hasOwnProperty(a)&&!u(a)){var g=(void 0,1===(f=a.split("$$")).length?null:f[0].split("_")[1]);g&&g!==i.visitorId&&d.removeItem(a)}}var f;void 0!==i.id&&(n={id:i.id,response:r},e.source.postMessage(JSON.stringify(n),e.origin))}},!0),window.addEventListener("storage",function(e){c&&u(e.key)&&c.source.postMessage(JSON.stringify({type:"SYNC",response:{key:e.key,value:e.newValue}}),c.origin)},!0)}();
|
||||
</script></head><body></body></html>
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
(function(){/*
|
||||
|
||||
Copyright The Closure Library Authors.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
var n=this||self,p=function(a,b){a=a.split(".");var c=n;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var q=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},r=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var t=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var v=window,x=document,y=function(a,b){x.addEventListener?x.addEventListener(a,b,!1):x.attachEvent&&x.attachEvent("on"+a,b)};var z={},A=function(){z.TAGGING=z.TAGGING||[];z.TAGGING[1]=!0};var B=/:[0-9]+$/,C=function(a,b,c){a=a.split("&");for(var d=0;d<a.length;d++){var e=a[d].split("=");if(decodeURIComponent(e[0]).replace(/\+/g," ")===b)return b=e.slice(1).join("="),c?b:decodeURIComponent(b).replace(/\+/g," ")}},F=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=D(a.protocol)||D(v.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:v.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||
|
||||
v.location.hostname).replace(B,"").toLowerCase());return E(a,b,void 0,void 0,void 0)},E=function(a,b,c,d,e){var f=D(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":d="";a&&a.href&&(d=a.href.indexOf("#"),d=0>d?a.href:a.href.substr(0,d));a=d;break;case "protocol":a=f;break;case "host":a=a.hostname.replace(B,"").toLowerCase();c&&(d=/^www\d*\./.exec(a))&&d[0]&&(a=a.substr(d[0].length));break;case "port":a=String(Number(a.port)||("http"==f?80:"https"==f?443:""));break;case "path":a.pathname||
|
||||
a.hostname||A();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(d=d||[],c=a[a.length-1],Array.prototype.indexOf)d=d.indexOf(c),d="number"==typeof d?d:-1;else{for(e=0;e<d.length;e++)if(d[e]===c){d=e;break a}d=-1}0<=d&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?","");e&&(a=C(a,e,void 0));break;case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=
|
||||
a&&a.href}return a},D=function(a){return a?a.replace(":","").toLowerCase():""},G=function(a){var b=x.createElement("a");a&&(b.href=a);var c=b.pathname;"/"!==c[0]&&(a||A(),c="/"+c);a=b.hostname.replace(B,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:a,pathname:c,search:b.search,hash:b.hash,port:b.port}};function H(){for(var a=I,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function J(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}var I,K;
|
||||
function aa(a){function b(k){for(;d<a.length;){var m=a.charAt(d++),l=K[m];if(null!=l)return l;if(!/^[\s\xa0]*$/.test(m))throw Error("Unknown base64 encoding at char: "+m);}return k}I=I||J();K=K||H();for(var c="",d=0;;){var e=b(-1),f=b(0),g=b(64),h=b(64);if(64===h&&-1===e)return c;c+=String.fromCharCode(e<<2|f>>4);64!=g&&(c+=String.fromCharCode(f<<4&240|g>>2),64!=h&&(c+=String.fromCharCode(g<<6&192|h)))}};var L;var N=function(){var a=ba,b=ca,c=M(),d=function(g){a(g.target||g.srcElement||{})},e=function(g){b(g.target||g.srcElement||{})};if(!c.init){y("mousedown",d);y("keyup",d);y("submit",e);var f=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);f.call(this)};c.init=!0}},O=function(a,b,c,d,e){a={callback:a,domains:b,fragment:2===c,placement:c,forms:d,sameHost:e};M().decorators.push(a)},P=function(a,b,c){for(var d=M().decorators,e={},f=0;f<d.length;++f){var g=d[f],h;if(h=
|
||||
!c||g.forms)a:{h=g.domains;var k=a,m=!!g.sameHost;if(h&&(m||k!==x.location.hostname))for(var l=0;l<h.length;l++)if(h[l]instanceof RegExp){if(h[l].test(k)){h=!0;break a}}else if(0<=k.indexOf(h[l])||m&&0<=h[l].indexOf(k)){h=!0;break a}h=!1}h&&(h=g.placement,void 0==h&&(h=g.fragment?2:1),h===b&&q(e,g.callback()))}return e},M=function(){var a={};var b=v.google_tag_data;v.google_tag_data=void 0===b?a:b;a=v.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var da=/(.*?)\*(.*?)\*(.*)/,ea=/([^?#]+)(\?[^#]*)?(#.*)?/;function Q(a){return new RegExp("(.*?)(^|&)"+a+"=([^&]*)&?(.*)")}
|
||||
var S=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()){b.push(c);var e=b,f=e.push;d=String(d);I=I||J();K=K||H();for(var g=[],h=0;h<d.length;h+=3){var k=h+1<d.length,m=h+2<d.length,l=d.charCodeAt(h),u=k?d.charCodeAt(h+1):0,w=m?d.charCodeAt(h+2):0,fa=l>>2;l=(l&3)<<4|u>>4;u=(u&15)<<2|w>>6;w&=63;m||(w=64,k||(u=64));g.push(I[fa],I[l],I[u],I[w])}f.call(e,g.join(""))}}a=b.join("*");return["1",R(a),a].join("*")},R=function(a,
|
||||
b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");if(!(b=L)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,e=0;8>e;e++)d=d&1?d>>>1^3988292384:d>>>1;b[c]=d}}L=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^L[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ia=function(a){return function(b){var c=G(v.location.href),d=c.search.replace("?","");var e=C(d,
|
||||
"_gl",!0);b.query=T(e||"")||{};e=F(c,"fragment");var f=e.match(Q("_gl"));b.fragment=T(f&&f[3]||"")||{};a&&ha(c,d,e)}};function U(a,b){if(a=Q(a).exec(b)){var c=a[2],d=a[4];b=a[1];d&&(b=b+c+d)}return b}
|
||||
var ha=function(a,b,c){function d(f,g){f=U("_gl",f);f.length&&(f=g+f);return f}if(v.history&&v.history.replaceState){var e=Q("_gl");if(e.test(b)||e.test(c))a=F(a,"path"),b=d(b,"?"),c=d(c,"#"),v.history.replaceState({},void 0,""+a+b+c)}},T=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=da.exec(a);if(d){var e=d;break a}a=decodeURIComponent(a)}e=void 0}if(e&&"1"===e[1]){var f=e[2],g=e[3];a:{for(e=0;e<b;++e)if(f===R(g,e)){var h=!0;break a}h=!1}if(h){b={};var k=g?g.split("*"):
|
||||
[];for(g=0;g<k.length;g+=2)b[k[g]]=aa(k[g+1]);return b}}}}catch(m){}};function V(a,b,c,d){function e(k){k=U(a,k);var m=k.charAt(k.length-1);k&&"&"!==m&&(k+="&");return k+h}d=void 0===d?!1:d;var f=ea.exec(c);if(!f)return"";c=f[1];var g=f[2]||"";f=f[3]||"";var h=a+"="+b;d?f="#"+e(f.substring(1)):g="?"+e(g.substring(1));return""+c+g+f}
|
||||
function W(a,b){var c="FORM"===(a.tagName||"").toUpperCase(),d=P(b,1,c),e=P(b,2,c);b=P(b,3,c);r(d)&&(d=S(d),c?X("_gl",d,a):Y("_gl",d,a,!1));!c&&r(e)&&(c=S(e),Y("_gl",c,a,!0));for(var f in b)b.hasOwnProperty(f)&&Z(f,b[f],a)}function Z(a,b,c,d){if(c.tagName){if("a"===c.tagName.toLowerCase())return Y(a,b,c,d);if("form"===c.tagName.toLowerCase())return X(a,b,c)}if("string"==typeof c)return V(a,b,c,d)}function Y(a,b,c,d){c.href&&(a=V(a,b,c.href,void 0===d?!1:d),t.test(a)&&(c.href=a))}
|
||||
function X(a,b,c){if(c&&c.action){var d=(c.method||"").toLowerCase();if("get"===d){d=c.childNodes||[];for(var e=!1,f=0;f<d.length;f++){var g=d[f];if(g.name===a){g.setAttribute("value",b);e=!0;break}}e||(d=x.createElement("input"),d.setAttribute("type","hidden"),d.setAttribute("name",a),d.setAttribute("value",b),c.appendChild(d))}else"post"===d&&(a=V(a,b,c.action),t.test(a)&&(c.action=a))}}
|
||||
var ba=function(a){try{a:{for(var b=100;a&&0<b;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){var c=a;break a}a=a.parentNode;b--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||W(c,c.hostname)}}catch(e){}},ca=function(a){try{if(a.action){var b=F(G(a.action),"host");W(a,b)}}catch(c){}};p("google_tag_data.glBridge.auto",function(a,b,c,d){N();O(a,b,"fragment"===c?2:1,!!d,!1)});p("google_tag_data.glBridge.passthrough",function(a,b,c){N();O(a,[E(v.location,"host",!0)],b,!!c,!0)});p("google_tag_data.glBridge.decorate",function(a,b,c){a=S(a);return Z("_gl",a,b,!!c)});p("google_tag_data.glBridge.generate",S);p("google_tag_data.glBridge.get",function(a,b){var c=ia(!!b);b=M();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)q(c,b.query),a&&q(c,b.fragment);return c});})(window);
|
||||
(function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};/*
|
||||
|
||||
Copyright The Closure Library Authors.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
var $c=function(a){this.C=a||[]};$c.prototype.set=function(a){this.C[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.C.length;b++)this.C[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var ha=window.GoogleAnalyticsObject,wa;if(wa=void 0!=ha)wa=-1<(ha.constructor+"").indexOf("String");var ya;if(ya=wa){var fc=window.GoogleAnalyticsObject;ya=fc?fc.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""}var gb=ya||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1;var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.C.slice(),c=0;c<a.C.length;c++)b[c]=b[c]||a.C[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
|
||||
1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,Id=function(a,b,c,d,e){if(a){var g=M.querySelector&&M.querySelector("script[nonce]")||null;g=g?g.nonce||g.getAttribute&&
|
||||
g.getAttribute("nonce")||"":"";c?(e=d="",b&&f.test(b)&&(d=' id="'+b+'"'),g&&Nd.test(g)&&(e=' nonce="'+g+'"'),f.test(a)&&M.write("<script"+d+e+' src="'+a+'">\x3c/script>')):(c=M.createElement("script"),c.type="text/javascript",c.async=!0,c.src=a,d&&(c.onload=d),e&&(c.onerror=e),b&&(c.id=b),g&&c.setAttribute("nonce",g),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a))}},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,
|
||||
"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&
|
||||
(c[a[e]]=b[e]);return c};var ee=function(){this.oa=[];this.ea={};this.m={}};ee.prototype.set=function(a,b,c){this.oa.push(a);c?this.m[":"+a]=b:this.ea[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.ea[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.oa.length;b++){var c=this.oa[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var Qa=window,Za=document,G=function(a){var b=Qa._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===Qa["ga-disable-"+a])return!0;try{var c=Qa.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Za.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return Za.getElementById("__gaOptOutExtension")?
|
||||
!0:!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g,ca){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");ca&&(c+=ca+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=
|
||||
Ca(a);for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){if(ye(a[Kd])){if(void 0===Ab){var b;if(b=(b=De.get())&&b._ga||void 0)Ab=b,J(81)}if(void 0!==Ab)return a[Q]||(a[Q]=Ab),!1}if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:{b=String(a[W]||xa());var c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga"));b=na(d,b,c);if(!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]),
|
||||
"$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;break a}b=!1}}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},
|
||||
1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=
|
||||
e.status&&(J(61),Qc("","$ERROR",3E4));var g=JSON.parse(e.responseText);g.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):g.clientId?Qc(g.clientId,g.securityToken,31536E6):!c&&g.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,g.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===
|
||||
fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)},ye=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0==
|
||||
c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}(d=b===c)||(c="."+c,d=b.substring(b.length-c.length,b.length)===c);if(d){b=!0;break a}else J(78)}b=!1}return b&&!1!==a};var bd=function(a){return(a?"https:":Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Ge=function(a){switch(a){default:case 1:return"https://www.google-analytics.com/gtm/js?id=";case 2:return"https://www.googletagmanager.com/gtag/js?id="}},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,
|
||||
c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d&&"text/plain"===g.getResponseHeader("Content-Type"))try{Ea(d,g.responseText,c)}catch(ca){ge("xhr",
|
||||
"rsp"),c()}else c();g=null}};g.send(b);return!0},Ea=function(a,b,c){if(1>b.length)ge("xhr","ver","0"),c();else if(3<a.count++)ge("xhr","tmr",""+a.count),c();else{var d=b.charAt(0);if("1"===d)oc(a,b.substring(1),c);else if(a.V&&"2"===d){var e=b.substring(1).split(","),g=0;b=function(){++g===e.length&&c()};for(d=0;d<e.length;d++)oc(a,e[d],b)}else ge("xhr","ver",String(b.length)),c()}},oc=function(a,b,c){if(0===b.length)c();else{var d=b.charAt(0);switch(d){case "d":pe("https://stats.g.doubleclick.net/j/collect",
|
||||
a.U,a,c);break;case "g":wc("https://www.google.%/ads/ga-audiences".replace("%","com"),a.google,c);(b=b.substring(1))&&(/^[a-z.]{1,6}$/.test(b)?wc("https://www.google.%/ads/ga-audiences".replace("%",b),a.google,ua):ge("tld","bcc",b));break;case "G":if(a.V){a.V("G-"+b.substring(1));c();break}case "x":if(a.V){a.V();c();break}default:ge("xhr","brc",d),c()}}},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*Math.random()||G("?")||(a=
|
||||
["t=error","_e="+a,"_v=j88","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc(bd(!0)+"/u/d",a.join("&"),ua))};var qc=function(){return O.gaData=O.gaData||{}},h=function(a){var b=qc();return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
|
||||
function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});!1===a.get(xe)&&b.push("npa=1");b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
|
||||
function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d||bd(!1)+"")+"/collect";switch(P(a,ad)){case "d":e=c||(d||bd(!1)+"")+"/j/collect";b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e.first_hit||(e.first_hit=(new Date).getTime());e=P(a,Na);delete h(e).pending_experiments;a.set(Ia,
|
||||
ua,!0)}function Hc(a){qc().expId&&a.set(Nc,qc().expId);qc().expVar&&a.set(Oc,qc().expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&((b=a.get(m))&&(d=b+"!"+d),a.set(m,d,!0))}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
|
||||
function yd(a){var b=O.gaDevIds||[];if(ka(b)){var c=a.get("&did");qa(c)&&0<c.length&&(b=b.concat(c.split(",")));c=[];for(var d=0;d<b.length;d++){var e;a:{for(e=0;e<c.length;e++)if(b[d]==c[e]){e=!0;break a}e=!1}e||c.push(b[d])}0!=c.length&&a.set("&did",c.join(","),!0)}}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua};
|
||||
Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c<ve.length;c++){var d=ve[c],e=d[0].exec(a);if(e){b=d[1](e);ue.set(b.name,b);break}}return b},yc=function(a){var b;ue.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);ue.set(a.name,a);return a.name},cb=function(a,b){ve.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");
|
||||
var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");
|
||||
var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
|
||||
S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
|
||||
var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(d){return d.get(c)},b.o=function(d,e,g,ca){d.set(c,g,ca)},b.F=void 0);return b});
|
||||
var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),ze=S("fpsCrossDomainTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),
|
||||
Yb=T("cookiePath",void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),Be=T("cookieFlags",void 0,""),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),
|
||||
je=T("storeGac",void 0,!0),oe=S("_x_19"),Ae=S("_fplc","_fplc"),F=T("_cs"),Je=T("_useUp",void 0,!1),Le=S("up","up"),gd=S("transportUrl"),Md=S("_r","_r"),Od=S("_slc","_slc"),qe=S("_dp"),ad=S("_jt",void 0,"n"),Ud=S("allowAdFeatures",void 0,!0),xe=S("allowAdPersonalizationSignals",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Ed=function(a){if("cookie"==a.get(ac))return a=Ca("FPLC"),0<a.length?a[0]:void 0},Fe=function(a){var b;if(b=P(a,oe)&&a.get(Ze))b=De.get(a.get(cc)),b=!(b&&b._fplc);b&&a.set(Ae,Ed(a)||"0")};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;
|
||||
a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;
|
||||
a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(P(b,kb),"gclid").length;(c||d)&&gc(function(e){c&&a.send("timing",e);d&&a.send("adtiming",e)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b);a.data.set(xd,P(a,Q))}(a.get(Hd)||uc(a)!=P(a,I))&&ma(a,I,la,864E5);if(a.get(je)){var c=P(a,ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=P(a,fe),g=P(a,ie),ca=kc(P(a,Yb)),l=lc(P(a,W)),k=P(a,Na);a=P(a,Be);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(k),c,ca,l,k,d,a)));le(b)}}else J(75)}},
|
||||
ma=function(a,b,c,d){var e=nd(a,b);if(e){c=P(a,c);var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Be),k=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,k,d,l)&&(hc=!0);else{J(32);for(var w=id(),Ce=0;Ce<w.length;Ce++)if(ca=w[Ce],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,k,d,l)){hc=!0;return}a.data.set(W,"auto")}}},uc=function(a){var b=Ca(P(a,la));return Xd(a,b)},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,
|
||||
(new Date).getTime(),!0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,
|
||||
s:ca.join(".")}):ca=kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=
|
||||
[],b=xa().split(".");if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var Jc=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,Kc=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,od=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=P(a,Q),c=P(a,I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a}
|
||||
function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
|
||||
var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}};
|
||||
var qd=function(a,b,c){var d=Kc.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=od.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
|
||||
a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
|
||||
Dc.prototype.S=function(a,b,c){function d(g){try{g=g||O.event;a:{var ca=g.target||g.srcElement;for(g=100;ca&&0<g;){if(ca.href&&ca.nodeName.match(/^a(?:rea)?$/i)){var l=ca;break a}ca=ca.parentNode;g--}l={}}("http:"==l.protocol||"https:"==l.protocol)&&sd(a,l.hostname||"")&&l.href&&(l.href=qd(e,l.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(g){g=
|
||||
g||O.event;if((g=g.target||g.srcElement)&&g.action){var ca=g.action.match(Jc);ca&&sd(a,ca[1])&&rd(e,g)}}))};Dc.prototype.$=function(a){if(a){var b=this,c=b.target.get(F);void 0!==c&&De.passthrough(function(){if(c("analytics_storage"))return{};var d={};return d._ga=b.target.get(Q),d._up="1",d},1,!0)}};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}
|
||||
function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}function $e(a){var b=af(a),c={};c._ga=a.get(Q);c._gid=a.get(I)||void 0;c._gac=b?[b.qa,b.timestamp].join("."):void 0;b=a.get(Ae);a=Ed(a);return c._fplc=b&&"0"!==b?b:a,c}function af(a){function b(e){return void 0==e||""===e?0:Number(e)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,Ie=/^G-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(d,e){e&&(c+="&"+d+"="+K(e))}var c=Ge(a.type)+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("cx",a.context);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c},
|
||||
He=function(a,b){var c=(new Date).getTime();O[a.B]=O[a.B]||[];c={"gtm.start":c};a.sync||(c.event="gtm.js");O[a.B].push(c);2===a.type&&function(d,e,g){O[a.B].push(arguments)}("config",a.id,b)},Ke=function(a,b,c,d){c=c||{};var e=1;Ie.test(b)&&(e=2);var g={id:b,type:e,B:c.dataLayer||"dataLayer",G:!1},ca=void 0;a.get(">m")==b&&(g.G=!0);1===e?(g.ia=!!a.get("anonymizeIp"),g.sync=d,b=String(a.get("name")),"t0"!=b&&(g.target=b),G(String(a.get("trackingId")))||(g.clientId=String(a.get(Q)),g.ka=Number(a.get(n)),
|
||||
c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,g.la=c,g.qa=E(P(a,kb),"gclid"))):2===e&&(g.context="c",ca={allow_google_signals:a.get(Ud),allow_ad_personalization_signals:a.get(xe)});He(g,ca);return t(g)};var H={},Jd=function(a,b){b||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(e){Pd(a,e,ed);Pd(a,e,ia);var g=c(e);Qd(a,e);return g});var d=b.get(Xb);b.set(Xb,function(e){var g=d(e);if(se(e)){J(80);var ca={U:re(e,1),google:re(e,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",ca.U,ca);e.set(ed,"",!0)}return g})},Pd=function(a,b,c){!1===b.get(Ud)||b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),
|
||||
!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",P(b,Yb),P(b,W),P(b,Na),6E4,P(b,Be))},se=function(a){return!!a.get(ed)&&!1!==a.get(Ud)},Ne=function(a){return!H[P(a,Na)]&&void 0===a.get(">m")&&void 0===a.get(fa)&&void 0===a.get(gd)&&void 0===a.get(oe)},re=function(a,b){var c=new ee,d=function(g){$a(g).F&&c.set($a(g).F,a.get(g))};d(hb);d(ib);d(Na);d(Q);d(ed);1==b&&(d(Ad),d(ia),d(I));!1===a.get(xe)&&c.set("npa","1");c.set($a(ld).F,Td(a));var e="";c.map(function(g,ca){e+=K(g)+"=";e+=K(""+ca)+"&"});e+="z="+
|
||||
hd();1==b?e="t=dc&aip=1&_r=3&"+e:2==b&&(e="t=sr&aip=1&_r=4&slf_rd=1&"+e);return e},Me=function(a){if(Ne(a))return H[P(a,Na)]=!0,function(b){if(b&&!H[b]){var c=Ke(a,b);Id(c);H[b]=!0}}},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.model;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.C);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);b=se(a);var c=Ne(a);b&&a.set(Md,1,!0);c&&a.set(Od,1,!0);if(b||c)a.set(ad,"d",!0),J(79),a.set(qe,{U:re(a,1),google:re(a,2),V:Me(a),count:0},!0)}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(e,g){d.model.data.set(e,g)}function c(e,g){b(e,g);d.filters.add(e)}var d=this;this.model=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b(Be,a[Be]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(oe,a[oe]);b(Je,a[Je]);b(F,a[F]);b(hb,1);b(ib,"j88");c(Qb,Ma);c(oa,
|
||||
ua);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(ze,Fe);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));pd(this.model);td(this.model,a[Q]);this.model.set(jb,Lc())};pc.prototype.get=function(a){return this.model.get(a)};pc.prototype.set=function(a,b){this.model.set(a,b)};
|
||||
pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(me[b]||[],c),c[Va]=b,this.model.set(c,void 0,!0),this.filters.D(this.model),this.model.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};
|
||||
var td=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/1E3}else d=!1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),(c=uc(a))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=
|
||||
d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]}));d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)){c=be("_ga",!!a.get(cc));
|
||||
g=be("_gl",!!a.get(cc));d=De.get(a.get(cc));e=d._ga;g&&0<g.indexOf("_ga*")&&!e&&J(30);if(b||!a.get(Je))g=!1;else if(g=a.get(F),void 0===g||g("analytics_storage"))g=!1;else{J(84);a.data.set(Le,1);if(g=d._up)(g=Jc.exec(M.referrer))?(g=g[1],ca=M.location.hostname,g=ca===g||0<=ca.indexOf("."+g)||0<=g.indexOf("."+ca)?!0:!1):g=!1;g=g?!0:!1}ca=d.gclid;l=d._gac;if(c||e||ca||l)if(c&&e&&J(36),a.get(bc)||ye(a.get(Kd))||g){e&&(J(38),a.data.set(Q,e),d._gid&&(J(51),a.data.set(I,d._gid)));ca?(J(82),a.data.set(ce,
|
||||
ca),d.gclsrc&&a.data.set(ie,d.gclsrc)):l&&(e=l.split("."))&&2===e.length&&(J(37),a.data.set(ce,e[0]),a.data.set(fe,e[1]));if(d=d._fplc)J(83),a.data.set(Ae,d);if(c)b:if(d=c.indexOf("."),-1==d)J(22);else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);
|
||||
break b}J(11);a.data.set(Q,d);if(c=be("_gac",!!a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe,c[2]),J(70))}}else J(21)}b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||(b=(b=O.gaGlobal)&&b.from_cookie&&"cookie"!==P(a,ac)?void 0:(b=b&&b.vid)&&-1!==b.search(jd)?b:void 0,b?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a);b=O.gaGlobal=O.gaGlobal||{};c=P(a,Q);a=c===P(a,xd);if(void 0==b.vid||a&&!b.from_cookie)b.vid=
|
||||
c,b.from_cookie=a},pd=function(a){var b=O.navigator,c=O.screen,d=M.location,e=a.set;a:{var g=!!a.get(ec),ca=!!a.get(Kd);var l=M.referrer;if(/^(https?|android-app):\/\//i.test(l)){if(g)break a;g="//"+M.location.hostname;if(!de(l,g)){if(ca&&(ca=g.replace(/\./g,"-")+".cdn.ampproject.org",de(l,ca))){l=void 0;break a}break a}}l=void 0}e.call(a,lb,l);d&&(e=d.pathname||"","/"!=e.charAt(0)&&(J(31),e="/"+e),a.set(kb,d.protocol+"//"+d.hostname+e+d.search));c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+
|
||||
"-bit");c=M.documentElement;l=(e=M.body)&&e.clientWidth&&e.clientHeight;ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!l)?ca=[c.clientWidth,c.clientHeight]:l&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);c=a.set;var k;if((e=(e=O.navigator)?e.plugins:null)&&e.length)for(l=0;l<e.length&&!k;l++)ca=e[l],-1<ca.name.indexOf("Shockwave Flash")&&(k=ca.description);if(!k)try{var w=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");k=w.GetVariable("$version")}catch(Ce){}if(!k)try{w=
|
||||
new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),k="WIN 6,0,21,0",w.AllowScriptAccess="always",k=w.GetVariable("$version")}catch(Ce){}if(!k)try{w=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),k=w.GetVariable("$version")}catch(Ce){}k&&(w=k.match(/[\d]+/g))&&3<=w.length&&(k=w[0]+"."+w[1]+" r"+w[2]);c.call(a,tb,k||void 0);a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,
|
||||
be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(k=0;k<b.length;++k)(D(b[k],"utm_id")||D(b[k],"utm_campaign")||D(b[k],"utm_source")||D(b[k],"utm_medium")||D(b[k],"utm_term")||D(b[k],"utm_content")||D(b[k],"gclid")||D(b[k],"dclid")||D(b[k],"gclsrc"))&&d.push(b[k]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}},me={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,
|
||||
Nb,Pb,Ob]};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var te=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=te.exec(a[0]);null!=b&&4==b.length&&(this.da=b[1]||"t0",this.K=b[2]||"",this.methodName=b[3],this.aa=[].slice.call(a,1),this.K||(this.A="create"==this.methodName,this.i="require"==this.methodName,this.g="provide"==this.methodName,this.ba="remove"==this.methodName),this.i&&(3<=this.aa.length?(this.X=this.aa[1],this.W=this.aa[2]):this.aa[1]&&(qa(this.aa[1])?this.X=this.aa[1]:this.W=this.aa[1])));b=a[1];a=a[2];
|
||||
if(!this.methodName)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.da)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.da)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
|
||||
var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);a=N.j(a);var g=c;c=void 0;if(p.test(b)){J(52);if(!a)return!0;g=Ke(a.model,b,d,e);c=function(){Z.D(["provide",b,function(){}]);var l=O[d&&d.dataLayer||"dataLayer"];l&&l.hide&&ea(l.hide.end)&&l.hide[b]&&(l.hide.end(),l.hide.end=void 0)}}!g&&Zd.hasOwnProperty(b)?
|
||||
(J(39),g=b+".js"):J(43);if(g){if(a){var ca=a.get(oe);qa(ca)||(ca=void 0)}g&&0<=g.indexOf("/")||(g=(ca||bd(!1))+"/plugins/ua/"+g);ca=ae(g);ne(ca.protocol)&&B(ca)&&(Id(ca.url,void 0,e,void 0,c),$d.set(b,!0))}}},v=function(a,b){var c=A.get(a)||[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,Ge(1))||D(a.url,Ge(2)))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;
|
||||
if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ne=function(a){var b=M.location.protocol;return"https:"==a||a==b?!0:"http:"!=a?!1:"http:"==b},ae=function(a){function b(l){var k=l.hostname||"",w=0<=k.indexOf("]");k=k.split(w?"]":":")[0].toLowerCase();w&&(k+="]");w=(l.protocol||"").toLowerCase();w=1*l.port||("http:"==w?80:"https:"==w?443:"");l=l.pathname||"";D(l,"/")||(l="/"+l);return[k,""+
|
||||
w,l]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.fa=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.fa.concat(b);for(Z.fa=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.fa.length););Z.fa=Z.fa.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.aa[0],d.aa[1]):(d.i&&(d.ha=y(d.da,d.aa[0],d.X,d.W)),b.push(d))}catch(e){}return b};
|
||||
Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.da==gb?N:N.j(a.da);if(a.A){if("t0"==a.da&&(b=N.create.apply(N,a.aa),null===b))return!0}else if(a.ba)N.remove(a.da);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.da,a.aa[0],a.X,a.W)),!u(a.aa[0],b,a.W))return!0}else if(a.K){var c=a.methodName,d=a.aa,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.methodName].apply(b,a.aa)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var we=[Na,W,V];N.create=function(a){var b=za(we,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);c=qc().tracker_created;if(ea(c))try{c(b)}catch(d){}return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
|
||||
N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+
|
||||
"/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);X("passthrough",b,b.$,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};var Ee=N.N,Oe=O[gb];Oe&&Oe.r?Ee():z(Ee);z(function(){Z.D(["provide","render",ua])});})(window);
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
(function() {function aa(a,b,c){if(null==a)throw new TypeError("The 'this' value for String.prototype."+c+" must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype."+c+" must not be a regular expression");return a+""}
|
||||
var ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(c.get||c.set)throw new TypeError("ES3 does not support getters and setters.");a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},ca="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;
|
||||
function da(a,b){if(b){for(var c=ca,d=a.split("."),e=0;e<d.length-1;e++){var f=d[e];f in c||(c[f]={});c=c[f]}d=d[d.length-1];e=c[d];f=b(e);f!=e&&null!=f&&ba(c,d,{configurable:!0,writable:!0,value:f})}}da("String.prototype.endsWith",function(a){return a?a:function(a,c){var b=aa(this,a,"endsWith");a+="";void 0===c&&(c=b.length);for(var e=Math.max(0,Math.min(c|0,b.length)),f=a.length;0<f&&0<e;)if(b[--e]!=a[--f])return!1;return 0>=f}});
|
||||
da("String.prototype.includes",function(a){return a?a:function(a,c){return-1!==aa(this,a,"includes").indexOf(a,c||0)}});da("String.prototype.startsWith",function(a){return a?a:function(a,c){var b=aa(this,a,"startsWith");a+="";for(var e=b.length,f=a.length,k=Math.max(0,Math.min(c|0,b.length)),m=0;m<f&&k<e;)if(b[k++]!=a[m++])return!1;return m>=f}});da("Number.isFinite",function(a){return a?a:function(a){return"number"!==typeof a?!1:!isNaN(a)&&Infinity!==a&&-Infinity!==a}});
|
||||
da("Number.isInteger",function(a){return a?a:function(a){return Number.isFinite(a)?a===Math.floor(a):!1}});
|
||||
function ea(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
|
||||
else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}function ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}
|
||||
function ha(a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?fa:ga;return ha.apply(null,arguments)};function g(a){var b=[];ia(new ja,a,b);return b.join("")}function ja(){}
|
||||
function ia(a,b,c){if(null==b)c.push("null");else{if("object"==typeof b){if("array"==ea(b)){var d=b;b=d.length;c.push("[");for(var e="",f=0;f<b;f++)c.push(e),e=d[f],ia(a,e,c),e=",";c.push("]");return}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();else{c.push("{");f="";for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(e=b[d],"function"!=typeof e&&(c.push(f),ka(d,c),c.push(":"),ia(a,e,c),f=","));c.push("}");return}}switch(typeof b){case "string":ka(b,c);break;case "number":c.push(isFinite(b)&&
|
||||
!isNaN(b)?String(b):"null");break;case "boolean":c.push(String(b));break;case "function":c.push("null");break;default:throw Error("Unknown type: "+typeof b);}}}var la={'"':'\\"',"\\":"\\\\","/":"\\/","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\u000b"},ma=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
|
||||
function ka(a,b){b.push('"',a.replace(ma,function(a){var b=la[a];b||(b="\\u"+(a.charCodeAt(0)|65536).toString(16).substr(1),la[a]=b);return b}),'"')};function p(a){a=String(a);try{return JSON.parse(a)}catch(b){}throw Error("Invalid JSON string: "+a);}function q(a){try{return"object"===typeof JSON&&"function"===typeof JSON.stringify?JSON.stringify(a):g(a)}catch(b){}throw Error("Could not stringify object");};function na(){function a(){if(b.length)b[0](function(){b.shift();a()})}var b=[];return function(c){b.push(c);1===b.length&&a()}};var oa=2,pa=200,qa=5E3,r="",u={},ra="undefined"!==typeof window&&!!(window.performance&&window.performance.timing&&window.performance.timing.navigationStart),sa="";function ta(a){return a&&"number"===typeof a?(Date.now()-a).toString():null}var ua={didClickJourneyClose:"Button(X)",didClickJourneyContinue:"Dismiss Journey text"},v=!1,va={"/v1/open":{link_identifier:"\\d+"},"/v1/pageview":{event:"pageview"},"/v1/dismiss":{event:"dismiss"},"/v1/url":{}},wa=!1;
|
||||
function xa(a,b){var c=document.createElement("a");c.href=a;var d=c.origin;d.endsWith("/")&&(d=d.substring(0,d.length-1));if(!["https://api2.branch.io","https://app.link","https://bnc.lt"].includes(d))return!1;c=c.pathname;"/"!=c[0]&&(c="/"+c);if(c.startsWith("/c/"))return!1;c=va[c];if(!c)return!0;if(0<Object.keys(c).length){if(!b)return!0;for(var e in c)if(d=new RegExp(c[e]),!b.hasOwnProperty(e)||!d.test(b[e]))return!0}return!1}
|
||||
function ya(a,b){if(a||b){for(var c="https://bnc.lt/a/"+a+"?",d="tags alias channel feature stage campaign type duration sdk source data".split(" "),e=0;e<d.length;e++){var f=d[e],k=b[f];if(k)if("tags"===f&&Array.isArray(k))for(var m=0;m<k.length;m++)c=("?"===c[c.length-1]?c+f:c+"&"+f)+"="+encodeURIComponent(k[m]);else if("string"===typeof k&&0<k.length||"number"===typeof k)"data"===f&&"string"===typeof k&&(k=za(k)),c=("?"===c[c.length-1]?c+f:c+"&"+f)+"="+encodeURIComponent(k)}return c}}
|
||||
function Aa(a){a&&(a.ha=null,a.N=null,a.H=null,a.j=null,a.g=null,a.D=null,a.v&&delete a.v,a.w&&delete a.w,a.c.remove("branch_view_enabled"),Ba(a.c,{},!0))}function x(a,b,c){a=a.replace(/\$(\d)/g,function(a,c){return b[parseInt(c,10)-1]});c&&(a+="\n Failure Code:"+c);return a}
|
||||
function Ca(a){var b=a.has_app;return{data:a.data||"",data_parsed:a.data_parsed||{},has_app:void 0===b?null:b,identity:a.identity||null,developer_identity:a.identity||null,referring_identity:a.referring_identity||null,referring_link:a.referring_link||null}}function Da(a){var b=/^\$journeys_\S+$/,c=a.data,d={};if(!c)return{};switch(typeof c){case "string":try{c=p(c)}catch(e){c={}}break;case "object":break;default:c={}}Object.keys(c).forEach(function(a){b.test(a)&&(d[a]=c[a])});return d}
|
||||
function Ea(){return y()?document.referrer:String(window.location)}
|
||||
function z(a){a.source="web-sdk";var b=a.data;switch(typeof b){case "string":try{b=p(b)}catch(c){b={_bncNoEval:!0}}break;case "object":break;default:b={}}b.$canonical_url||(b.$canonical_url=Ea());b.$og_title||(b.$og_title=A("title"));b.$og_description||(b.$og_description=A("description"));b.$og_image_url||(b.$og_image_url=A("image"));b.$og_video||(b.$og_video=A("video"));b.$og_type||(b.$og_type=A("type"));"string"===typeof b.$desktop_url&&(b.$desktop_url=b.$desktop_url.replace(/#r:[a-z0-9-_]+$/i,
|
||||
"").replace(/([\?\&]_branch_match_id=\d+)/,""));try{p(b)}catch(c){b=g(b)}a.data=b;return a}function Fa(a){function b(a){return""!==a}if(!a||"string"!==typeof a)return"";var c=document.createElement("a");c.href=a;a=c.pathname&&c.pathname.split("/").filter(b);return Array.isArray(a)&&a.length?a[a.length-1]+c.search:c.search}
|
||||
function B(a,b,c){a&&"object"===typeof a||(a={});if(!b||"object"!==typeof b)return a;for(var d in b)if(b.hasOwnProperty(d)){var e=b[d];!c||void 0!==e&&null!==e?a[d]=e:delete a[d]}return a}function Ga(){try{var a=(y()&&Ha()?window.top.location.hash:window.location.hash).match(/r:([^&]*)/);if(a&&1<=a.length)return a[1]}catch(b){}}function Ia(a){return!!/^((?!chrome|android|crios|firefox|fxios|edg|yabrowser).)*safari/i.test(a)}
|
||||
function Ja(a,b){b=b||11;var c=/version\/([^ ]*)/i.exec(a);if(c&&c[1])try{if(parseFloat(c[1])>=b)return!0}catch(d){}return!1}
|
||||
function C(){var a=navigator.userAgent;return a.match(/android/i)?"android":a.match(/ipad/i)||a&&Ia(a)&&a&&-1<a.indexOf("Macintosh")&&Ja(a,13)&&screen.height>screen.width?"ipad":a.match(/i(os|p(hone|od))/i)?"ios":a.match(/\(BB[1-9][0-9]*\;/i)?"blackberry":a.match(/Windows Phone/i)?"windows_phone":a.match(/Kindle/i)||a.match(/Silk/i)||a.match(/KFTT/i)||a.match(/KFOT/i)||a.match(/KFJWA/i)||a.match(/KFJWI/i)||a.match(/KFSOWI/i)||a.match(/KFTHWA/i)||a.match(/KFTHWI/i)||a.match(/KFAPWA/i)||a.match(/KFAPWI/i)?
|
||||
"kindle":!1}function Ka(){var a=navigator.userAgent;return Ia(a)?Ja(a,11):!1}function La(){var a=navigator.userAgent;return!!window.webkitURL&&a&&a&&/(iPad|iPod|iPhone)/.test(a)&&!/(chrome|crios)/i.test(a)&&!/(fxios|firefox)/i.test(a)&&!/edg/i.test(a)&&!/(opt|opr)/i.test(a)&&!/yabrowser/i.test(a)}function Ma(a){try{var b=(y()&&Ha()?window.top.location.search:window.location.search).substring(1).match(new RegExp(a+"=([^&]*)"));if(b&&1<=b.length)return b[1]}catch(c){}}
|
||||
function Na(a){return a.replace(/(\-\w)/g,function(a){return a[1].toUpperCase()})}
|
||||
function za(a){var b="",c,d,e,f,k,m,h=0;a=a.replace(/\r\n/g,"\n");d="";for(e=0;e<a.length;e++)f=a.charCodeAt(e),128>f?d+=String.fromCharCode(f):(127<f&&2048>f?d+=String.fromCharCode(f>>6|192):(d+=String.fromCharCode(f>>12|224),d+=String.fromCharCode(f>>6&63|128)),d+=String.fromCharCode(f&63|128));for(a=d;h<a.length;)c=a.charCodeAt(h++),d=a.charCodeAt(h++),e=a.charCodeAt(h++),f=c>>2,c=(c&3)<<4|d>>4,k=(d&15)<<2|e>>6,m=e&63,isNaN(d)?m=k=64:isNaN(e)&&(m=64),b=b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(f)+
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(k)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(m);return b}function Oa(a){return Pa(a)?atob(a):a}function Pa(a){if("string"!==typeof a||""===a||""===a.trim())return!1;try{return btoa(atob(a))===a}catch(b){return!1}}
|
||||
function Qa(a){a&&a.browser_fingerprint_id&&!Pa(a.browser_fingerprint_id)&&(a.browser_fingerprint_id=btoa(a.browser_fingerprint_id));a&&a.alternative_browser_fingerprint_id&&!Pa(a.alternative_browser_fingerprint_id)&&(a.alternative_browser_fingerprint_id=btoa(a.alternative_browser_fingerprint_id));return a}
|
||||
function Ra(a){a&&Pa(a.browser_fingerprint_id)&&(a.browser_fingerprint_id=atob(a.browser_fingerprint_id));a&&Pa(a.alternative_browser_fingerprint_id)&&(a.alternative_browser_fingerprint_id=atob(a.alternative_browser_fingerprint_id));return a}function Sa(a,b,c){"function"===typeof a.addEventListener?a.addEventListener(b,c,void 0):"function"===typeof a.attachEvent?a.attachEvent("on"+b,c):a["on"+b]=c}
|
||||
function Ta(a){if(!a)return null;-1<a.indexOf("://")&&(a=a.split("://")[1]);return a.substring(a.indexOf("/")+1)}function D(a){if(!a)return null;-1<a.indexOf("://")?a=a.split("://")[1]:"/"===a.charAt(0)&&(a=a.slice(1));return a}function A(a){var b;a=String(a);b=b||null;(a=document.querySelector('meta[property="og:'+a+'"]'))&&a.content&&(b=a.content);return b}
|
||||
function Ua(){var a=document.getElementsByTagName("meta"),b={};if(!a||0===a.length)return b;for(var c={hostedIOS:null,hostedAndroid:null,applinksIOS:null,applinksAndroid:null,twitterIOS:null,twitterAndroid:null},d=0;d<a.length;d++)if((a[d].getAttribute("name")||a[d].getAttribute("property"))&&a[d].getAttribute("content")){var e=a[d].getAttribute("name"),f=a[d].getAttribute("property"),e=e||f,f=e.split(":");3===f.length&&"branch"===f[0]&&"deeplink"===f[1]&&("$ios_deeplink_path"===f[2]?c.hostedIOS=
|
||||
D(a[d].getAttribute("content")):"$android_deeplink_path"===f[2]?c.hostedAndroid=D(a[d].getAttribute("content")):b[f[2]]=a[d].getAttribute("content"));"al:ios:url"===e&&(c.applinksIOS=D(a[d].getAttribute("content")));"twitter:app:url:iphone"===e&&(c.twitterIOS=D(a[d].getAttribute("content")));"al:android:url"===e&&(c.applinksAndroid=D(a[d].getAttribute("content")));"twitter:app:url:googleplay"===e&&(c.twitterAndroid=D(a[d].getAttribute("content")))}c&&"object"===typeof c&&Object.keys(c).length&&(c.hostedIOS?
|
||||
b.$ios_deeplink_path=c.hostedIOS:c.applinksIOS?b.$ios_deeplink_path=c.applinksIOS:c.twitterIOS&&(b.$ios_deeplink_path=c.twitterIOS),c.hostedAndroid?b.$android_deeplink_path=c.hostedAndroid:c.applinksAndroid?b.$android_deeplink_path=c.applinksAndroid:c.twitterAndroid&&(b.$android_deeplink_path=c.twitterAndroid),b.hasOwnProperty("$ios_deeplink_path")&&b.hasOwnProperty("$android_deeplink_path")&&b.$ios_deeplink_path===b.$android_deeplink_path&&(b.$deeplink_path=b.$ios_deeplink_path));return b}
|
||||
function Va(){var a;try{navigator.languages&&0<navigator.languages.length?a=navigator.languages[0]:navigator.language&&(a=navigator.language),a=a.substring(0,2).toUpperCase()}catch(b){a=null}return a}function Wa(a,b){var c=[];b.forEach(function(b){-1===a.indexOf(b)&&c.push(b)});return c}
|
||||
var Xa=["purchase"],Ya={missingPurchaseEvent:"event name is either missing, of the wrong type or not valid. Please specify 'purchase' as the event name.",missingCommerceData:"commerce_data is either missing, of the wrong type or empty. Please ensure that commerce_data is constructed correctly.",invalidKeysForRoot:"Please remove the following keys from the root of commerce_data: ",invalidKeysForProducts:"Please remove the following keys from commerce_data.products: ",invalidProductListType:"commerce_data.products must be an array of objects",
|
||||
invalidProductType:"Each product in the products list must be an object"};
|
||||
function Za(a){var b="sku name price quantity brand category variant".split(" "),c=Wa("common type transaction_id currency revenue revenue_in_usd exchange_rate shipping tax coupon affiliation persona products".split(" "),Object.keys(a));if(c.length)return Ya.invalidKeysForRoot+c.join(", ");var d=[],e;if(a.hasOwnProperty("products")){if(!Array.isArray(a.products))return Ya.invalidProductListType;a.products.forEach(function(a){"object"!==typeof a&&(e=Ya.invalidProductType);d=d.concat(Wa(b,Object.keys(a)))});
|
||||
if(e)return e;if(d.length)return Ya.invalidKeysForProducts+d.join(", ")}return null}function $a(a,b){if(!a||"string"!==typeof a||-1===Xa.indexOf(a.toLowerCase()))return Ya.missingPurchaseEvent;if(!b||"object"!==typeof b||!Object.keys(b).length)return Ya.missingCommerceData;var c=Za(b);return c?c:null}function E(a){return"string"!==typeof a?null:a.replace(/</g,"<").replace(/>/g,">")}
|
||||
function F(a,b,c){if(null!==c&&void 0!==c){if("object"===typeof c&&!Object.keys(c).length)return a;a[b]=c}return a}
|
||||
function ab(){var a={},b;b={};b=F(b,"$og_title",A("title"));b=F(b,"$og_description",A("description"));b=F(b,"$og_image_url",A("image"));b=F(b,"$og_video",A("video"));b=(b=F(b,"$og_type",A("type")))&&0<Object.keys(b).length?b:null;a=F(a,"og_data",b);a=F(a,"hosted_deeplink_data",Ua());b=document.getElementsByTagName("title");a=F(a,"title",0<b.length?b[0].innerText:null);b=document.querySelector('meta[name="description"]');a=F(a,"description",b&&b.content?b.content:null);b=document.querySelector('link[rel="canonical"]');
|
||||
return(a=F(a,"canonical_url",b&&b.href?b.href:null))&&0<Object.keys(a).length?a:{}}var bb="ADD_TO_CART ADD_TO_WISHLIST VIEW_CART INITIATE_PURCHASE ADD_PAYMENT_INFO PURCHASE SPEND_CREDITS SEARCH VIEW_ITEM VIEW_ITEMS RATE SHARE COMPLETE_REGISTRATION COMPLETE_TUTORIAL ACHIEVE_LEVEL UNLOCK_ACHIEVEMENT LOGIN SUBSCRIBE START_TRIAL INVITE RESERVE VIEW_AD CLICK_AD INITIATE_STREAM COMPLETE_STREAM".split(" "),cb="transaction_id revenue currency shipping tax coupon affiliation search_query description".split(" ");
|
||||
function db(a){if(!a||!Object.keys(a).length)return null;for(var b=Wa(cb,Object.keys(a)),c={},d=0;d<b.length;d++){var e=b[d];c[e]=a[e];delete a[e]}return{custom_data:eb(c),event_data:a}}function G(a,b){return!b||null===a&&"object"===b?!1:"array"===b?Array.isArray(a):typeof a===b&&!Array.isArray(a)}
|
||||
function fb(a){var b={},b=F(b,"http_origin",document.URL),b=F(b,"user_agent",navigator.userAgent),b=F(b,"language",Va()),b=F(b,"screen_width",screen.width||0),b=F(b,"screen_height",screen.height||0),b=F(b,"http_referrer",document.referrer),b=F(b,"browser_fingerprint_id",a.D),b=F(b,"developer_identity",a.g),b=F(b,"identity",a.g),b=F(b,"sdk","web");return b=F(b,"sdk_version","2.58.0")}function y(){return window.self!==window.top}
|
||||
function Ha(){var a="true";try{window.top.location.search&&(a="true")}catch(b){return!1}return"true"===a}function gb(a){return a?a:y()?Ha()?window.top.document.referrer:"":document.referrer}function eb(a){if(!G(a,"object")||!Object.keys(a).length)return{};for(var b in a)a.hasOwnProperty(b)&&(a[b]=G(a[b],"object")||G(a[b],"array")?q(a[b]):a[b].toString());return a}function hb(a,b){var c=a?B({},a):{};return b&&0<Object.keys(b).length?0<Object.keys(c).length?B(c,b):B({},b):c}
|
||||
function H(a){""!==r&&a.setAttribute("nonce",r)}function ib(a,b){isNaN(b)||0>=b?a():setTimeout(a,b)};function I(a,b){return function(c,d,e){if(v)return!1;if("number"===typeof e||e)if(0===b){if("object"!==typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"an object"])}else if(3===b){if(!(e instanceof Array))return x("API request $1, parameter $2 is not $3",[c,d,"an array"])}else if(2===b){if("number"!==typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"a number"])}else if(4===b){if("boolean"!==typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"a boolean"])}else{if("string"!==
|
||||
typeof e)return x("API request $1, parameter $2 is not $3",[c,d,"a string"]);if(1!==b&&!b.test(e))return x("API request $1, parameter $2 is not $3",[c,d,"in the proper format"])}else if(a)return x("API request $1 missing parameter $2",[c,d]);return!1}}function J(a){return B(a,{browser_fingerprint_id:I(!0,1),identity_id:I(!0,1),sdk:I(!0,1),session_id:I(!0,1)})}
|
||||
var jb={destination:"https://api2.branch.io",endpoint:"/v1/open",method:"POST",a:{browser_fingerprint_id:I(!1,1),alternative_browser_fingerprint_id:I(!1,1),identity_id:I(!1,1),link_identifier:I(!1,1),sdk:I(!1,1),options:I(!1,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4),current_url:I(!1,1),screen_height:I(!1,2),screen_width:I(!1,2)}},kb={destination:"https://app.link",endpoint:"/_r",method:"GET",L:!0,a:{sdk:I(!0,1),_t:I(!1,1),branch_key:I(!0,1)}},lb={destination:"",endpoint:"",method:"GET",
|
||||
f:{link_url:I(!0,1)},a:{click:I(!0,1)}},mb={destination:"https://bnc.lt",endpoint:"/c",method:"POST",f:{link_url:I(!0,1)},a:{sdk:I(!1,1),phone:I(!0,1)}},nb={destination:"https://api2.branch.io",endpoint:"/v1/referralcode",method:"POST",a:J({amount:I(!0,2),bucket:I(!1,1),calculation_type:I(!0,2),creation_source:I(!0,2),expiration:I(!1,1),location:I(!0,2),prefix:I(!1,1),type:I(!0,1)})},ob={destination:"https://api2.branch.io",endpoint:"/v1/referralcode",method:"POST",f:{code:I(!0,1)},a:J({})},pb={destination:"https://api2.branch.io",
|
||||
endpoint:"/v1/applycode",method:"POST",f:{code:I(!0,1)},a:J({})},qb={destination:"https://api2.branch.io",endpoint:"/v1/logout",method:"POST",a:J({session_id:I(!0,1)})},rb={destination:"https://api2.branch.io",endpoint:"/v1/profile",method:"POST",a:J({identity_id:I(!0,1),identity:I(!0,1)})},sb={destination:"https://api2.branch.io",endpoint:"/v1/referrals",method:"GET",f:{identity_id:I(!0,1)},a:J({})},tb={destination:"https://api2.branch.io",endpoint:"/v1/credithistory",method:"GET",a:J({begin_after_id:I(!1,
|
||||
1),bucket:I(!1,1),direction:I(!1,2),length:I(!1,2),link_click_id:I(!1,1)})},ub={destination:"https://api2.branch.io",endpoint:"/v1/credits",method:"GET",a:J({branch_key:I(!0,1),identity:I(!0,1)})},vb={destination:"https://api2.branch.io",endpoint:"/v1/redeem",method:"POST",a:J({amount:I(!0,2),bucket:I(!0,1),identity_id:I(!0,1)})},wb={destination:"https://api2.branch.io",endpoint:"/v1/url",method:"POST",qa:"obj",a:J({alias:I(!1,1),campaign:I(!1,1),channel:I(!1,1),data:I(!1,1),feature:I(!1,1),identity_id:I(!0,
|
||||
1),stage:I(!1,1),tags:I(!1,3),type:I(!1,2),source:I(!1,1),instrumentation:I(!1,1)})},xb={destination:"https://api2.branch.io",endpoint:"/v1/qr-code",method:"POST",qa:"obj",a:J({alias:I(!1,1),campaign:I(!1,1),channel:I(!1,1),data:I(!1,1),qr_code_settings:I(!1,1),feature:I(!1,1),identity_id:I(!0,1),stage:I(!1,1),tags:I(!1,3),type:I(!1,2),source:I(!1,1)})},yb={destination:"https://api2.branch.io",endpoint:"/v1/deepview",L:!0,method:"POST",a:J({campaign:I(!1,1),_t:I(!1,1),channel:I(!1,1),data:I(!0,1),
|
||||
feature:I(!1,1),link_click_id:I(!1,1),open_app:I(!1,4),append_deeplink_path:I(!1,4),stage:I(!1,1),tags:I(!1,3),deepview_type:I(!0,1),source:I(!0,1)})},zb={destination:"https://api2.branch.io",endpoint:"/v1/has-app",method:"GET",a:{browser_fingerprint_id:I(!0,1),instrumentation:I(!1,1)}},Ab={destination:"https://api2.branch.io",endpoint:"/v1/event",method:"POST",a:J({event:I(!0,1),metadata:I(!0,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4)})},Bb={destination:"https://api2.branch.io",endpoint:"/v1/event",
|
||||
method:"POST",a:J({event:I(!0,1),metadata:I(!1,0),initial_referrer:I(!1,1),commerce_data:I(!0,0)})},Cb={destination:"https://api2.branch.io",endpoint:"/v2/event/standard",method:"POST",a:{name:I(!0,1),user_data:I(!0,1),custom_data:I(!1,1),event_data:I(!1,1),content_items:I(!1,1),customer_event_alias:I(!1,1)}},Db={destination:"https://api2.branch.io",endpoint:"/v2/event/custom",method:"POST",a:{name:I(!0,1),user_data:I(!0,1),custom_data:I(!1,1),content_items:I(!1,1),customer_event_alias:I(!1,1)}},
|
||||
Eb={destination:"https://api2.branch.io",endpoint:"/v1/pageview",method:"POST",a:J({event:I(!0,1),metadata:I(!1,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4),branch_view_id:I(!1,1),no_journeys:I(!1,4),user_language:I(!1,1),open_app:I(!1,4),has_app_websdk:I(!1,4),source:I(!1,1),feature:I(!1,1),is_iframe:I(!1,4),data:I(!1,0),callback_string:I(!1,1),journey_displayed:I(!1,4),audience_rule_id:I(!1,1),journey_dismissals:I(!1,0),identity_id:I(!1,1)})},Fb={destination:"https://api2.branch.io",endpoint:"/v1/dismiss",
|
||||
method:"POST",a:J({event:I(!0,1),metadata:I(!1,0),initial_referrer:I(!1,1),tracking_disabled:I(!1,4),branch_view_id:I(!1,1),no_journeys:I(!1,4),user_language:I(!1,1),open_app:I(!1,4),has_app_websdk:I(!1,4),source:I(!1,1),feature:I(!1,1),is_iframe:I(!1,4),data:I(!1,0),callback_string:I(!1,1),journey_displayed:I(!1,4),audience_rule_id:I(!1,1),journey_dismissals:I(!1,0),dismissal_source:I(!1,1)})},Gb={destination:"https://api2.branch.io",endpoint:"/v1/cpid",method:"POST",a:{user_data:I(!0,1)}},Ib={destination:"https://api2.branch.io",
|
||||
endpoint:"/v1/cpid/latd",method:"POST",a:{user_data:I(!0,1)}};function Jb(a){for(var b=0;b<a.length;b++){var c=this[a[b]],c="function"===typeof c?c():c;if(c.isEnabled())return c.A={},c}}function K(a){return"branch_session"===a||"branch_session_first"===a?a:"BRANCH_WEBSDK_KEY"+a}function Kb(a){return"true"===a?!0:"false"===a?!1:a}function Lb(a){return"branch_session"===a||"branch_session_first"===a||0===a.indexOf("BRANCH_WEBSDK_KEY")}function Mb(a){a=a.trim();var b=a.indexOf("=");return{name:a.substring(0,b),value:Kb(a.substring(b+1,a.length))}}
|
||||
function Nb(a){var b;try{b=a&&localStorage?localStorage:sessionStorage}catch(c){return{isEnabled:function(){return!1}}}return{getAll:function(){if("undefined"===typeof b)return null;var a=null,d;for(d in b)d.indexOf("BRANCH_WEBSDK_KEY")||(null===a&&(a={}),a[d.replace("BRANCH_WEBSDK_KEY","")]=Kb(b.getItem(d)));return Ra(a)},get:function(a,d){return"browser_fingerprint_id"===a||"alternative_browser_fingerprint_id"===a?d&&localStorage?Oa(localStorage.getItem(K(a))):Oa(b.getItem(K(a))):Kb(d&&localStorage?
|
||||
localStorage.getItem(K(a)):b.getItem(K(a)))},set:function(a,d,e){e&&localStorage?localStorage.setItem(K(a),d):b.setItem(K(a),d)},remove:function(a,d){d&&localStorage?localStorage.removeItem(K(a)):b.removeItem(K(a))},clear:function(){Object.keys(b).forEach(function(a){a.indexOf("BRANCH_WEBSDK_KEY")||b.removeItem(a)})},isEnabled:function(){try{return b.setItem("test",""),b.removeItem("test"),!0}catch(c){return!1}}}}Jb.prototype.local=function(){return Nb(!0)};Jb.prototype.session=function(){return Nb(!1)};
|
||||
function Ob(){function a(a,c){c&&(a=K(a));document.cookie=a+"=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"}return{getAll:function(){for(var a={},c=document.cookie.split(";"),d=0;d<c.length;d++){var e=Mb(c[d]);e&&e.hasOwnProperty("name")&&e.hasOwnProperty("value")&&Lb(e.name)&&(a[e.name.replace("BRANCH_WEBSDK_KEY","")]=e.value)}return a},get:function(a){a=K(a);for(var b=document.cookie.split(";"),d=0;d<b.length;d++){var e=Mb(b[d]);if(e&&e.hasOwnProperty("name")&&e.hasOwnProperty("value")&&e.name===
|
||||
a)return e.value}return null},set:function(a,c){document.cookie=K(a)+"="+c+"; path=/"},remove:function(b){a(b,!0)},clear:function(){for(var b=document.cookie.split(";"),c=0;c<b.length;c++){var d=Mb(b[c]);d&&d.hasOwnProperty("name")&&Lb(d.name)&&a(d.name,!1)}},isEnabled:function(){return navigator.cookieEnabled}}}Jb.prototype.cookie=function(){return Ob()};
|
||||
Jb.prototype.pojo={getAll:function(){return this.A},get:function(a){return this.A[a]||null},set:function(a,b){this.A[a]=b},remove:function(a){delete this.A[a]},clear:function(){this.A={}},isEnabled:function(){return!0}};function L(a,b){try{var c=p(a.get(b?"branch_session_first":"branch_session",b))||null;return Ra(c)}catch(d){return null}}function Ba(a,b,c){b=Qa(b);a.set("branch_session",g(b));c&&a.set("branch_session_first",g(b),!0)}function Pb(a,b){if(b){var c=L(a)||{},c=g(Qa(B(c,b)));a.set("branch_session",c)}}
|
||||
function Qb(a,b,c){function d(a,b){return Qa(B(p(a),b,c))}var e=a.get("branch_session",!1)||{};a.set("branch_session",g(d(e,b)));e=a.get("branch_session_first",!0)||{};a.set("branch_session_first",g(d(e,b)),!0)};function Rb(){}Rb.prototype.h=0;function Sb(a,b,c){if("undefined"===typeof b)return"";var d=[];if(b instanceof Array){for(a=0;a<b.length;a++)d.push(encodeURIComponent(c)+"="+encodeURIComponent(b[a]));return d.join("&")}for(var e in b)b.hasOwnProperty(e)&&(b[e]instanceof Array||"object"===typeof b[e]?d.push(Sb(a,b[e],c?c+"."+e:e)):d.push(encodeURIComponent(c?c+"."+e:e)+"="+encodeURIComponent(b[e])));return d.join("&")}
|
||||
function Tb(a,b,c){function d(a,c){"undefined"===typeof c&&(c={});if(a.branch_key&&h.test(a.branch_key))return c.branch_key=a.branch_key,c;if(a.app_id&&m.test(a.app_id))return c.app_id=a.app_id,c;if(a.instrumentation)c.instrumentation=a.instrumentation;else throw Error(x("API request $1 missing parameter $2",[b.endpoint,"branch_key or app_id"]));}var e,f,k=b.destination+b.endpoint,m=/^[0-9]{15,20}$/,h=/key_(live|test)_[A-Za-z0-9]{32}/;if("/v1/has-app"===b.endpoint)try{b.f=d(c,b.f)}catch(l){return{error:l.message}}if("undefined"!==
|
||||
typeof b.f)for(e in b.f)if(b.f.hasOwnProperty(e)){if(f="function"===typeof b.f[e]?b.f[e](b.endpoint,e,c[e]):f)return{error:f};k+="/"+c[e]}var n={};if("undefined"!==typeof b.a&&"/v1/pageview"!==b.endpoint&&"/v1/dismiss"!==b.endpoint)for(e in b.a){if(b.a.hasOwnProperty(e)){if(f=b.a[e](b.endpoint,e,c[e]))return{error:f};f=c[e];"undefined"!==typeof f&&""!==f&&null!==f&&(n[e]=f)}}else"/v1/pageview"!==b.endpoint&&"/v1/dismiss"!==b.endpoint||B(n,c);if("POST"===b.method||"/v1/credithistory"===b.endpoint)try{c=
|
||||
d(c,n)}catch(l){return{error:l.message}}"/v1/event"===b.endpoint&&(n.metadata=q(n.metadata||{}),n.hasOwnProperty("commerce_data")&&(n.commerce_data=q(n.commerce_data||{})));("/v1/pageview"===b.endpoint||"/v1/dismiss"===b.endpoint)&&n.metadata&&(n.metadata=q(n.metadata||{}));"/v1/open"===b.endpoint&&(n.options=q(n.options||{}));return{data:Sb(a,n,""),url:k.replace(/^\//,"")}}
|
||||
function Ub(a,b,c){var d=document.createElement("script");d.type="text/javascript";d.async=!0;d.src=a;H(d);a=document.getElementsByTagName("head");!a||1>a.length?"function"===typeof b&&b():(a[0].appendChild(d),"function"===typeof b&&Sa(d,"error",b),"function"===typeof c&&Sa(d,"load",c))}
|
||||
function Vb(a,b,c,d,e){var f=Date.now(),k=sa;!a.h&&Ka()&&a.h++;var m="branch_callback__"+a.h++;a=0<=b.indexOf("branch.io")?"&data=":"&post_data=";c="POST"===d?encodeURIComponent(za(g(c))):"";var h=window.setTimeout(function(){window[m]=function(){};F(u,k,ta(f));e(Error("Request timed out"),null,504)},qa);window[m]=function(a){window.clearTimeout(h);e(null,a)};Ub(b+(0>b.indexOf("?")?"?":"")+(c?a+c:"")+(0<=b.indexOf("/c/")?"&click=1":"")+"&callback="+m,function(){e(Error("Request blocked by client, probably adblock"),
|
||||
null)},function(){F(u,k,ta(f));try{"function"===typeof this.remove?this.remove():this.parentNode.removeChild(this)}catch(n){}delete window[m]})}
|
||||
function Wb(a,b,c,d,e,f,k,m){var h=Date.now(),n=sa,l=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");m&&(l.responseType=m);l.ontimeout=function(){F(u,n,ta(h));f(Error("Request timed out"),null,504)};l.onerror=function(a){f(Error(a.error||"Error in API: "+l.status),null,l.status)};l.onreadystatechange=function(){var a;if(4===l.readyState)if(F(u,n,ta(h)),200===l.status){if("arraybuffer"===l.responseType)a=l.response;else if(k)a=l.responseText;else try{a=p(l.responseText)}catch(w){a=
|
||||
{}}f(null,a,l.status)}else if(402===l.status)f(Error("Not enough credits to redeem."),null,l.status);else if("4"===l.status.toString().substring(0,1)||"5"===l.status.toString().substring(0,1))l.responseURL&&l.responseURL.includes("v2/event")?f(l.responseText,null,l.status):f(Error("Error in API: "+l.status),null,l.status)};try{l.open(d,b,!0),l.timeout=qa,l.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),l.send(c)}catch(t){e.set("use_jsonp",!0),Vb(a,b,c,d,f)}}
|
||||
function Xb(a,b,c,d,e){function f(){d.get("use_jsonp")||b.L?Vb(a,n,c,b.method,k):Wb(a,n,l,b.method,d,k,W,Hb)}function k(c,d,h){"function"===typeof a.aa&&a.aa(n,b.method,t,c,h,d);c&&0<w&&"5"===(h||"").toString().substring(0,1)?(w--,window.setTimeout(function(){f()},pa)):e(c,d)}sa="/v1/pageview"===b.endpoint&&c&&c.journey_displayed?b.endpoint+"-1-brtt":b.endpoint+"-brtt";("/v1/url"===b.endpoint||"/v1/has-app"===b.endpoint)&&1<Object.keys(u).length&&(delete u["-brtt"],c.instrumentation=q(B({},u)),u=
|
||||
{});if(v)for(var m=["browser_fingerprint_id","alternative_browser_fingerprint_id","identity_id","session_id"],h=0;h<m.length;h++)c.hasOwnProperty(m[h])&&delete c[m[h]];m=Tb(a,b,c);if(m.error)return e(Error(q({message:m.error,endpoint:b.endpoint,data:c})));var n,l="";"GET"===b.method?n=m.url+"?"+m.data:(n=m.url,l=m.data);var t;d.get("use_jsonp")||b.L?t=c:t=l;var w=oa;if(v&&xa(n,c))return wa?k(Error("Requested operation cannot be completed since tracking is disabled"),null,300):k(null,{},200);var W=
|
||||
!1,Hb;"/v1/qr-code"===b.endpoint&&(W=!0,Hb="arraybuffer");f()};function M(a){a&&a.parentNode.removeChild(a)}function Yb(a,b){a&&!a.className.match(new RegExp("(\\s|^)"+b+"(\\s|$)"))&&(a.className+=" "+b)}function Zb(a){var b=document.body;b&&b.className.match(new RegExp("(\\s|^)"+a+"(\\s|$)"))&&(b.className=b.className.replace(new RegExp("(\\s|^)"+a+"(\\s|$)")," "))}function $b(a){var b=new Date;return b.setDate(b.getDate()+a)}
|
||||
function ac(a){return document.body.currentStyle?document.body.currentStyle[Na(a)]:window.getComputedStyle(document.body).getPropertyValue(a)}
|
||||
function bc(a){function b(a){function c(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)/100}function e(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)/100}if(!a)return 0;var f=a.replace(/[0-9,\.]/g,"");a=a.match(/\d+/g);var k=parseInt(0<a.length?a[0]:"0",10);return parseInt({px:function(a){return a},em:function(a){return document.body.currentStyle?a*b(document.body.currentStyle.fontSize):a*parseFloat(window.getComputedStyle(document.body).fontSize)},
|
||||
rem:function(a){return document.documentElement.currentStyle?a*b(document.documentElement.currentStyle.fontSize):a*parseFloat(window.getComputedStyle(document.documentElement).fontSize)},vw:function(a){return a*e()},vh:function(a){return a*c()},vmin:function(a){return a*Math.min(c(),e())},vmax:function(a){return a*Math.max(c(),e())},"%":function(){return document.body.clientWidth/100*k}}[f](k),10)}return(b("76px")+b(a)).toString()+"px"}
|
||||
function cc(a,b){var c=a.get("hideBanner",!0);if(b.ra&&navigator&&Number(navigator.doNotTrack))return!1;try{"string"===typeof c&&(c=p(c))}catch(e){c=!1}var c="number"===typeof c?new Date>=new Date(c):!c,d=b.K;"number"===typeof d&&(d=!1);return!document.getElementById("branch-banner")&&!document.getElementById("branch-banner-iframe")&&(c||d)&&(b.ta&&!C()||b.P&&"android"===C()||b.ua&&"ipad"===C()||b.U&&"ios"===C()||b.R&&"blackberry"===C()||b.T&&"windows_phone"===C()||b.S&&"kindle"===C())};function dc(a,b){return"#branch-banner-iframe { position: "+("top"!==b||a?"fixed":"absolute")+"; }\n"}
|
||||
function ec(a,b){var c=".branch-banner-is-active { -webkit-transition: all 0.375s ease; transition: all 00.375s ease; }\n#branch-banner { width:100%; z-index: 99999; font-family: Helvetica Neue, Sans-serif; -webkit-font-smoothing: antialiased; -webkit-user-select: none; -moz-user-select: none; user-select: none; -webkit-transition: all 0.25s ease; transition: all 00.25s ease; }\n#branch-banner .button{ border: 1px solid "+(a.buttonBorderColor||("dark"===a.theme?"transparent":"#ccc"))+"; background: "+
|
||||
(a.buttonBackgroundColor||"#fff")+"; color: "+(a.buttonFontColor||"#000")+"; cursor: pointer; margin-top: 0px; font-size: 14px; display: inline-block; margin-left: 5px; font-weight: 400; text-decoration: none; border-radius: 4px; padding: 6px 12px; transition: all .2s ease;}\n#branch-banner .button:hover { border: 1px solid "+(a.buttonBorderColorHover||("dark"===a.theme?"transparent":"#BABABA"))+"; background: "+(a.buttonBackgroundColorHover||"#E0E0E0")+"; color: "+(a.buttonFontColorHover||"#000")+
|
||||
";}\n#branch-banner .button:focus { outline: none; }\n#branch-banner * { margin-right: 4px; position: relative; line-height: 1.2em; }\n#branch-banner-close { font-weight: 400; cursor: pointer; float: left; z-index: 2;padding: 0 5px 0 5px; margin-right: 0; }\n#branch-banner .content { width:100%; overflow: hidden; height: 76px; background: rgba(255, 255, 255, 0.95); color: #333; "+("top"===a.position?"border-bottom":"border-top")+': 1px solid #ddd; }\n#branch-banner-close { color: #000; font-size: 24px; top: 14px; opacity: .5; transition: opacity .3s ease; }\n#branch-banner-close:hover { opacity: 1; }\n#branch-banner .title { font-size: 18px; font-weight:bold; color: #555; }\n#branch-banner .description { font-size: 12px; font-weight: normal; color: #777; max-height: 30px; overflow: hidden; }\n#branch-banner .icon { float: left; padding-bottom: 40px; margin-right: 10px; margin-left: 5px; }\n#branch-banner .icon img { width: 63px; height: 63px; margin-right: 0; }\n#branch-banner .reviews { font-size:13px; margin: 1px 0 3px 0; color: #777; }\n#branch-banner .reviews .star { display:inline-block; position: relative; margin-right:0; }\n#branch-banner .reviews .star span { display: inline-block; margin-right: 0; color: #555; position: absolute; top: 0; left: 0; }\n#branch-banner .reviews .review-count { font-size:10px; }\n#branch-banner .reviews .star .half { width: 50%; overflow: hidden; display: block; }\n#branch-banner .content .left { padding: 6px 5px 6px 5px; }\n#branch-banner .vertically-align-middle { top: 50%; transform: translateY(-50%); -webkit-transform: translateY(-50%); -ms-transform: translateY(-50%); }\n#branch-banner .details > * { display: block; }\n#branch-banner .content .left { height: 63px; }\n#branch-banner .content .right { float: right; height: 63px; margin-bottom: 50px; padding-top: 22px; z-index: 1; }\n#branch-banner .right > div { float: left; }\n#branch-banner-action { top: 17px; }\n#branch-banner .content:after { content: ""; position: absolute; left: 0; right: 0; top: 100%; height: 1px; background: rgba(0, 0, 0, 0.2); }\n#branch-banner .theme-dark.content { background: rgba(51, 51, 51, 0.95); }\n#branch-banner .theme-dark #branch-banner-close{ color: #fff; text-shadow: 0 1px 1px rgba(0, 0, 0, .15); }\n#branch-banner .theme-dark .details { text-shadow: 0 1px 1px rgba(0, 0, 0, .15); }\n#branch-banner .theme-dark .title { color: #fff; }\n#branch-banner .theme-dark .description { color: #fff; }\n#branch-banner .theme-dark .reviews { color: #888; }\n#branch-banner .theme-dark .reviews .star span{ color: #fff; }\n#branch-banner .theme-dark .reviews .review-count{ color: #fff; }\n',
|
||||
d=C();"ios"!==d&&"ipad"!==d||!a.U?"android"===d&&a.P?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n#branch-banner #branch-banner-close,#branch-banner .theme-dark #branch-banner-close { height:17px; width: 17px; text-align: center; font-size: 15px; top: 24px; border-radius:14px; border:0; line-height:14px; color:#b1b1b3; background:#efefef; padding: 0; opacity: 1; }\n#branch-banner .button { top: 0; text-decoration:none; border-bottom: 3px solid #A4C639; padding: 0 10px; height: 24px; line-height: 24px; text-align: center; color: #fff; margin-top: 2px; font-weight: bold; background-color: #A4C639; border-radius: 5px; }\n#branch-banner .button:hover { border-bottom:3px solid #8c9c29; background-color: #c1d739; }\n":
|
||||
"blackberry"===d&&a.R?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n":
|
||||
"windows_phone"===d&&a.T?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n":
|
||||
"kindle"===d&&a.S?c+="#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n":
|
||||
(c+="#branch-banner { position: fixed; min-width: 600px; }\n#branch-sms-block * { vertical-align: bottom; font-size: 15px; }\n#branch-sms-block { display: inline-block; }\n#branch-banner input{ border: 1px solid #ccc; font-weight: 400; border-radius: 4px; height: 30px; padding: 5px 7px 4px; width: 145px; font-size: 14px;}\n#branch-banner input:focus { outline: none; }\n#branch-banner input.error { color: rgb(194, 0, 0); border-color: rgb(194, 0, 0); }\n#branch-banner .branch-icon-wrapper { width:25px; height: 25px; vertical-align: middle; display: inline-block; margin-top: -18px; }\n@keyframes branch-spinner { 0% { transform: rotate(0deg); -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); } 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); } }\n@-webkit-keyframes branch-spinner { 0% { transform: rotate(0deg); -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); } 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); } }\n#branch-spinner { -webkit-animation: branch-spinner 1s ease-in-out infinite; animation: branch-spinner 1s ease-in-out infinite; transition: all 0.7s ease-in-out; border:2px solid #ddd; border-bottom-color:#428bca; width:80%; height:80%; border-radius:50%; -webkit-font-smoothing: antialiased !important; }\n#branch-banner .theme-dark input { border-color: transparent; }\n",
|
||||
c=window.ActiveXObject?c+"#branch-banner .checkmark { color: #428bca; font-size: 22px; }\n":c+"#branch-banner .checkmark { stroke: #428bca; stroke-dashoffset: 745.74853515625; stroke-dasharray: 745.74853515625; -webkit-animation: dash 2s ease-out forwards; animation: dash 2s ease-out forwards; }\n@-webkit-keyframes dash { 0% { stroke-dashoffset: 745.748535 15625; } 100% { stroke-dashoffset: 0; } }\n@keyframes dash { 0% { stroke-dashoffset: 745.74853515625; } 100% { stroke-dashoffset: 0; } }\n"):c+=
|
||||
"#branch-banner { position: absolute; }\n#branch-banner .content .left .details .title { font-size: 12px; }\n#branch-mobile-action { white-space: nowrap; }\n#branch-banner .content .left .details .description { font-size: 11px; font-weight: normal; }\n@media only screen and (min-device-width: 320px) and (max-device-width: 350px) { #branch-banner .content .right { max-width: 120px; } }\n@media only screen and (min-device-width: 351px) and (max-device-width: 400px) and (orientation: landscape) { #branch-banner .content .right { max-width: 150px; } }\n@media only screen and (min-device-width: 401px) and (max-device-width: 480px) and (orientation: landscape) { #branch-banner .content .right { max-width: 180px; } }\n";
|
||||
c+=a.fa;a.F&&(c+="body { margin: 0; }\n",d=document.createElement("style"),d.type="text/css",d.id="branch-iframe-css",H(d),d.innerHTML="body { -webkit-transition: all 0.375s ease; transition: all 00.375s ease; }\n#branch-banner-iframe { box-shadow: 0 0 5px rgba(0, 0, 0, .35); width: 1px; min-width:100%; left: 0; right: 0; border: 0; height: 76px; z-index: 99999; -webkit-transition: all 0.25s ease; transition: all 00.25s ease; }\n"+(C()?dc(a.ma,a.position):dc(a.ga,a.position)),(document.head||document.getElementsByTagName("head")[0]).appendChild(d));
|
||||
d=document.createElement("style");d.type="text/css";d.id="branch-css";d.innerHTML=c;H(d);c=a.F?b.contentWindow.document:document;(c=c.head||c.getElementsByTagName("head")[0])&&"function"===typeof c.appendChild&&c.appendChild(d);"top"===a.position?b.style.top="-76px":"bottom"===a.position&&(b.style.bottom="-76px")};function fc(a,b){var c;if(a.B||a.M){if(a.B){c="";for(var d=0;5>d;d++)c+='<span class="star"><svg class="star" fill="#555555" height="12" viewBox="3 2 20 19" width="12"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/><path d="M0 0h24v24H0z" fill="none"/><foreignObject display="none"><span class="star">\u2606</span></foreignObject></svg>',a.B>d&&
|
||||
(c+=d+1>a.B&&a.B%1?'<span class="half"><svg fill="#555555" height="12" viewBox="3 2 20 19" width="12"><defs><path d="M0 0h24v24H0V0z" id="a"/></defs><clipPath id="b"><use overflow="visible" xlink:href="#a"/></clipPath><path clip-path="url(#b)" d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></svg><foreignObject display="none"><span class="half">\u2605</span></foreignObject></span>':'<span class="full"><svg fill="#555555" height="12" viewBox="3 2 20 19" width="12"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/><path d="M0 0h24v24H0z" fill="none"/><foreignObject display="none"><span class="full">\u2605</span></foreignObject></svg> </span>'),
|
||||
c+="</span>";c='<span class="stars">'+c+"</span>"}else c="";c='<div class="reviews">'+c+(a.M?'<span class="review-count">'+a.M+"</span>":"")+"</div>"}else c="";return'<div class="content'+(a.theme?" theme-"+a.theme:"")+'"><div class="right">'+b+'</div><div class="left">'+(a.ia?"":'<div id="branch-banner-close" class="branch-animation" aria-label="Close">×</div>')+'<div class="icon"><img src="'+a.icon+'" alt="Application icon"></div><div class="details vertically-align-middle"><div class="title">'+
|
||||
a.title+"</div>"+c+'<div class="description">'+a.description+"</div></div></div></div>"}
|
||||
function gc(a,b){var c='<div id="branch-sms-form-container">'+(C()?'<a id="branch-mobile-action" class="button" href="#" target="_parent">'+((L(b)||{}).has_app?a.na:a.ja)+"</a>":'<div class="branch-icon-wrapper" id="branch-loader-wrapper" style="opacity: 0;"><div id="branch-spinner"></div></div><div id="branch-sms-block"><form id="sms-form"><input type="phone" aria-label="Enter phone number" class="branch-animation" name="branch-sms-phone" id="branch-sms-phone" placeholder="'+a.pa+'"><button type="submit" id="branch-sms-send" class="branch-animation button">'+
|
||||
a.sa+"</button></form></div>")+"</div>";if(a.F){var d=document.createElement("iframe");d.src="about:blank";d.style.overflow="hidden";d.scrolling="no";d.id="branch-banner-iframe";d.className="branch-animation";H(d);document.body.appendChild(d);var e=C(),c='<html><head></head><body class="'+("ios"===e||"ipad"===e?"branch-banner-ios":"android"===e?"branch-banner-android":"branch-banner-desktop")+'"><div id="branch-banner" class="branch-animation">'+fc(a,c)+"</body></html>";d.contentWindow.document.open();
|
||||
d.contentWindow.document.write(c);d.contentWindow.document.close()}else d=document.createElement("div"),d.id="branch-banner",d.className="branch-animation",d.innerHTML=fc(a,c),document.body.appendChild(d);return c=d};function hc(a,b,c,d){function e(){k();h.style.background="#FFD4D4";m.className="error";setTimeout(function(){h.style.background="#FFFFFF";m.className=""},2E3)}function f(){t=a.createElement("div");t.className="branch-icon-wrapper";t.id="branch-checkmark";t.style="opacity: 0;";t.innerHTML=window.ActiveXObject?'<span class="checkmark">✓</span>':'<svg version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 98.5 98.5" enable-background="new 0 0 98.5 98.5" xml:space="preserve"><path class="checkmark" fill="none" stroke-width="8" stroke-miterlimit="10" d="M81.7,17.8C73.5,9.3,62,4,49.2,4C24.3,4,4,24.3,4,49.2s20.3,45.2,45.2,45.2s45.2-20.3,45.2-45.2c0-8.6-2.4-16.6-6.5-23.4l0,0L45.6,68.2L24.7,47.3"/></svg>';
|
||||
l.appendChild(t);h.style.opacity="0";m.style.opacity="0";n.style.opacity="0";setTimeout(function(){t.style.opacity="1"},20);m.value=""}function k(){h.removeAttribute("disabled");m.removeAttribute("disabled");h.style.opacity="1";m.style.opacity="1";n.style.opacity="0"}var m=a.getElementById("branch-sms-phone"),h=a.getElementById("branch-sms-send"),n=a.getElementById("branch-loader-wrapper"),l=a.getElementById("branch-sms-form-container"),t;if(m){var w=m.value;/^\d{7,}$/.test(w.replace(/[\s()+\-\.]|ext/gi,
|
||||
""))?(N(b,"willSendBannerSMS"),h.setAttribute("disabled",""),m.setAttribute("disabled",""),h.style.opacity=".4",m.style.opacity=".4",n.style.opacity="1",m.className="",b.sendSMS(w,d,c,function(a){a?(N(b,"sendBannerSMSError"),e()):(N(b,"didSendBannerSMS"),f(),setTimeout(function(){l.removeChild(t);k()},3E3))})):e()}}
|
||||
function ic(a,b,c,d){function e(a,c){"function"===typeof a&&(c=a,a={});a=a||{};"top"===b.position?k.style.top="-76px":"bottom"===b.position&&(k.style.bottom="-76px");"number"===typeof b.K?d.set("hideBanner",$b(b.K),!0):d.set("hideBanner",!0,!0);a.Z?("top"===b.position?document.body.style.marginTop=n:"bottom"===b.position&&(document.body.style.marginBottom=t),Zb("branch-banner-is-active"),M(k),M(document.getElementById("branch-css")),c()):(setTimeout(function(){M(k);M(document.getElementById("branch-css"));
|
||||
c()},270),setTimeout(function(){"top"===b.position?document.body.style.marginTop=n:"bottom"===b.position&&(document.body.style.marginBottom=t);Zb("branch-banner-is-active")},20))}function f(){"top"===b.position?k.style.top="0":"bottom"===b.position&&(k.style.bottom="0");N(a,"didShowBanner")}if(!cc(d,b))return N(a,"willNotShowBanner"),null;N(a,"willShowBanner");var k=gc(b,d);ec(b,k);c.channel=c.channel||"app banner";var m=b.F?k.contentWindow.document:document;if(C()){b.open_app=b.oa;b.append_deeplink_path=
|
||||
b.da;b.make_new_link=b.la;b.deepview_type="banner";a.deepview(c,b);var h=m.getElementById("branch-mobile-action");h&&(h.onclick=function(b){b.preventDefault();a.deepviewCta()})}else m.getElementById("sms-form")?m.getElementById("sms-form").addEventListener("submit",function(d){d.preventDefault();hc(m,a,b,c)}):k.onload=function(){m=k.contentWindow.document;m.getElementById("sms-form")&&m.getElementById("sms-form").addEventListener("submit",function(d){d.preventDefault();hc(m,a,b,c)})};var h=ac("margin-top"),
|
||||
n=document.body.style.marginTop,l=ac("margin-bottom"),t=document.body.style.marginBottom,w=m.getElementById("branch-banner-close");w&&(w.onclick=function(b){b.preventDefault();N(a,"willCloseBanner");e({},function(){N(a,"didCloseBanner")})});Yb(document.body,"branch-banner-is-active");"top"===b.position?document.body.style.marginTop=bc(h):"bottom"===b.position&&(document.body.style.marginBottom=bc(l));b.Z?f():setTimeout(f,20);return e};var jc={},kc,lc=1,O="top",mc="absolute",P="76px",nc=!1,oc=!1,Q=[],pc=!1,qc=window.innerHeight,rc=window.innerWidth;window.innerHeight<window.innerWidth&&(qc=window.innerWidth,rc=window.innerHeight);
|
||||
var sc=0,tc=0,uc=!1,vc=/<script type="application\/json">((.|\s)*?)<\/script>/,wc=/<script type="text\/javascript">((.|\s)*?)<\/script>/,xc=/<style type="text\/css" id="branch-css">((.|\s)*?)<\/style>/,yc=/<style type="text\/css" id="branch-iframe-css">((.|\s)*?)<\/style>/,zc=/#branch-banner-spacer {((.|\s)*?)}/,Ac=/margin-bottom: (.*?);/,R=null,Bc=null,Cc=!1,Dc=!1,Ec=!1,Fc=!1,Gc=!1,Hc="",Ic=[],S=null;function Jc(a){if(a=a.match(vc))return p(a[1])}
|
||||
function Kc(a){var b=document.createElement("style");b.type="text/css";b.id="branch-iframe-css";sc=ac("margin-top");var c=+sc.slice(0,-2);tc=ac("margin-bottom");var d=+tc.slice(0,-2),e=+P.slice(0,-2);a||("top"===O?document.body.style.marginTop=(+e+c).toString()+"px":"bottom"===O&&(document.body.style.marginBottom=(+e+d).toString()+"px"));0<Q.length&&Q.forEach(function(a){var b,c=window.getComputedStyle(a);c&&(b=nc&&"fixed"===c.getPropertyValue("position"));b||(a.style.marginTop=P)});"top"===Hc&&Hc!==
|
||||
O&&Gc&&Ic&&0<Ic.length&&Ic.forEach(function(a){a.style.marginTop=0});Gc=!1;Hc="";Ic=[];Fc=!1;a?b.innerHTML=a:b.innerHTML=Lc();H(b);document.head.appendChild(b)}
|
||||
function Lc(){var a="",b="";document.body.style.transition="";document.getElementById("branch-banner-iframe")&&(document.getElementById("branch-banner-iframe").style.transition="");Ec||(a="body { -webkit-transition: all 0.375s ease; }\n",document.body.style.transition="all 00.375s ease",b="-webkit-transition: all 0.25s ease; transition: all 00.25s ease;");return(a?a:"")+("#branch-banner-iframe { box-shadow: 0 0 5px rgba(0, 0, 0, .35); width: 1px; min-width:100%; left: 0; right: 0; border: 0; height: "+
|
||||
P+"; z-index: 99999; "+b+" }\n#branch-banner-iframe { position: "+mc+"; }\n@media only screen and (orientation: landscape) { body { "+("top"===O?"margin-top: ":"margin-bottom: ")+(nc?rc+"px":P)+"; }\n#branch-banner-iframe { height: "+(nc?rc+"px":P)+"; }")}
|
||||
function Mc(a,b){Yb(document.body,"branch-banner-is-active");nc&&"fixed"===mc&&Yb(document.body,"branch-banner-no-scroll");setTimeout(function(){b?(a.style.top=null,a.style.bottom=null):"top"===O?a.style.top="0":"bottom"===O&&(S&&S.journey_link_data&&!S.journey_link_data.safeAreaRequired?a.style.bottom="0":(pc=!0,document.getElementById("branch-banner-iframe").style.transition="all 0s",Nc(!1,!0),window.addEventListener("resize",Oc),window.addEventListener("scroll",Pc)));N(R,"didShowJourney",S);Cc=
|
||||
!0},20)}function Oc(){pc&&Nc(!1,!1)}function Pc(){pc&&(window.pageYOffset>window.innerHeight?Nc(!0,!1):Nc(!1,!1))}function Nc(a,b){var c=document.getElementById("branch-banner-iframe"),d=c.offsetHeight,e=c.offsetTop,f=window.innerHeight;b&&window.pageYOffset?c.style.bottom="0":a?c.style.top=f-d+d/2+"px":f-e!=d&&(c.style.top=""+(f-d)+"px")}function Qc(a){a=a.globalDismissPeriod;if("number"===typeof a){if(-1===a)a=!0;else{var b=new Date;a=b.setSeconds(b.getSeconds()+a)}return a}}
|
||||
function Rc(a,b,c,d,e,f,k){var m=T;d&&e&&(Array.prototype.forEach.call(e.contentWindow.document.querySelectorAll("#branch-mobile-action"),function(a){a.addEventListener("click",function(){N(R,"didClickJourneyCTA",S);Fc=!0;d();Sc(e)})}),Tc(".branch-banner-continue","didClickJourneyContinue",c,e,a,b,f,k,m),Tc(".branch-banner-close","didClickJourneyClose",c,e,a,b,f,k,m))}
|
||||
function Tc(a,b,c,d,e,f,k,m,h){Array.prototype.forEach.call(d.contentWindow.document.querySelectorAll(a),function(a){a.addEventListener("click",function(){Uc(b,c,d,e,f,k,m,h)})})}function Vc(a,b,c){var d=a.get("journeyDismissals",!0),d=d?p(d):{};d[c]={view_id:b,dismiss_time:Date.now()};a.set("journeyDismissals",q(d),!0)}
|
||||
function Wc(a){return void 0===a||null===a?null:a.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'").replace(/¦/g,"\u00a6").replace(/«/g,"\u00ab").replace(/´/g,"\u00b4").replace(/·/g,"\u00b7").replace(/»/g,"\u00bb").replace(/&/g,"&").replace(/¿/g,"\u00bf").replace(/×/g,"\u00d7").replace(/÷/g,"\u00f7").replace(/À/g,"\u00c0").replace(/Á/g,"\u00c1").replace(/Â/g,"\u00c2").replace(/Ã/g,
|
||||
"\u00c3").replace(/Ä/g,"\u00c4").replace(/Å/g,"\u00c5").replace(/Æ/g,"\u00c6").replace(/Ç/g,"\u00c7").replace(/È/g,"\u00c8").replace(/É/g,"\u00c9").replace(/Ê/g,"\u00ca").replace(/Ë/g,"\u00cb").replace(/Ì/g,"\u00cc").replace(/Í/g,"\u00cd").replace(/Î/g,"\u00ce").replace(/Ï/g,"\u00cf").replace(/Ð/g,"\u00d0").replace(/Ñ/g,"\u00d1").replace(/Ò/g,"\u00d2").replace(/Ó/g,"\u00d3").replace(/Ô/g,"\u00d4").replace(/Õ/g,
|
||||
"\u00d5").replace(/Ö/g,"\u00d6").replace(/Ø/g,"\u00d8").replace(/Ù/g,"\u00d9").replace(/Ú/g,"\u00da").replace(/Û/g,"\u00db").replace(/Ü/g,"\u00dc").replace(/Ý/g,"\u00dd").replace(/Þ/g,"\u00de").replace(/ß/g,"\u00df").replace(/à/g,"\u00e0").replace(/á/g,"\u00e1").replace(/â/g,"\u00e2").replace(/ã/g,"\u00e3").replace(/ä/g,"\u00e4").replace(/å/g,"\u00e5").replace(/æ/g,"\u00e6").replace(/ç/g,"\u00e7").replace(/è/g,
|
||||
"\u00e8").replace(/é/g,"\u00e9").replace(/ê/g,"\u00ea").replace(/ë/g,"\u00eb").replace(/ì/g,"\u00ec").replace(/í/g,"\u00ed").replace(/î/g,"\u00ee").replace(/ï/g,"\u00ef").replace(/ð/g,"\u00f0").replace(/ñ/g,"\u00f1").replace(/ò/g,"\u00f2").replace(/ó/g,"\u00f3").replace(/ô/g,"\u00f4").replace(/õ/g,"\u00f5").replace(/ö/g,"\u00f6").replace(/ø/g,"\u00f8").replace(/ù/g,"\u00f9").replace(/ú/g,"\u00fa").replace(/û/g,
|
||||
"\u00fb").replace(/ü/g,"\u00fc").replace(/ý/g,"\u00fd").replace(/þ/g,"\u00fe").replace(/ÿ/g,"\u00ff")}
|
||||
function Xc(a,b){var c={},d=Ua();d&&0<Object.keys(d).length&&(c.hosted_deeplink_data=d);c=a.I(Yc(null,c),null,R,!0);if(S&&S.journey_link_data){F(c,"journey_id",S.journey_link_data.journey_id);F(c,"journey_name",Wc(S.journey_link_data.journey_name));F(c,"view_id",S.journey_link_data.view_id);F(c,"view_name",Wc(S.journey_link_data.view_name));F(c,"channel",Wc(S.journey_link_data.channel));F(c,"campaign",Wc(S.journey_link_data.campaign));try{F(c,"tags",JSON.stringify(S.journey_link_data.tags))}catch(e){c.tags=
|
||||
JSON.stringify([])}}F(c,"dismissal_source",b);return c}
|
||||
function Uc(a,b,c,d,e,f,k,m){var h=k?0:Qc(f);N(R,a,S);Fc=!0;Sc(c);if(!k)if(void 0!==h&&b.set("globalJourneysDismiss",h,!0),Vc(b,d,e),f.dismissRedirect)window.location=f.dismissRedirect;else{var n=function(){R.removeListener(n);var b=Xc(m,ua[a]);R.b(Fb,b,function(a,c){!a&&"object"===typeof c&&c.template&&m.O(c,null,!1)&&m.J(c.template,b,b.branch_view_id||c.event_data.branch_view_data.id,c.event_data.branch_view_data,!1,c.journey_link_data)})};R.addListener("branch_internal_event_didCloseJourney",n)}}
|
||||
function Yc(a,b){return B({url:a&&a.url||Ea(),user_agent:navigator.userAgent,language:navigator.language,screen_width:screen.width||-1,screen_height:screen.height||-1,window_device_pixel_ratio:window.devicePixelRatio||1},b||{})}
|
||||
function Sc(a,b){Dc||(uc=!0);if(Ec&&!Dc){document.body.style.transition="all 00.375s ease";document.getElementById("branch-banner-iframe").style.transition="all 00.25s ease";var c=document.getElementById("branch-iframe-css").innerHTML+"\n";document.getElementById("branch-iframe-css").innerHTML="";document.getElementById("branch-iframe-css").innerHTML=c+"body { -webkit-transition: all 0.375s ease; }\n#branch-banner-iframe { -webkit-transition: all 0.25s ease; }\n"}"top"===O?a.style.top="-"+P:"bottom"===
|
||||
O&&(a.style.bottom="-"+P);N(R,"willCloseJourney",S);setTimeout(function(){M(a);M(document.getElementById("branch-css"));M(document.getElementById("branch-iframe-css"));M(document.getElementById("branch-journey-cta"));(!Dc||Fc)&&Q&&0<Q.length?Q.forEach(function(a){a.style.marginTop=0}):(Gc=Dc,Hc=O,Ic=Q);"top"===O?document.body.style.marginTop=sc:"bottom"===O&&(document.body.style.marginBottom=tc);Zb("branch-banner-is-active");Zb("branch-banner-no-scroll");pc&&(pc=!1,window.removeEventListener("resize",
|
||||
Oc),window.removeEventListener("scroll",Pc));N(R,"didCloseJourney",S);b||N(R,"branch_internal_event_didCloseJourney",S);Cc=!1;setTimeout(function(){uc=!1},250)},Dc?0:270)}
|
||||
function Zc(a){var b={banner_id:kc};if(a&&"object"===typeof a&&0<Object.keys(a).length){var c=["browser_fingerprint_id","app_id","source","open_app","link_click_id"];if(a&&"object"===typeof a&&!Array.isArray(a)&&0<Object.keys(a).length&&c&&Array.isArray(c)&&0<c.length)for(var d in a)a.hasOwnProperty(d)&&-1<c.indexOf(d)&&delete a[d];b.journey_link_data={};B(b.journey_link_data,a)}S=b}function $c(){return jc&&R&&R.m&&R.m.data?R.m.data.$journeys_cta:!1}
|
||||
function ad(){if($c())return R.m.data.$journeys_cta}function bd(a){try{if($c()&&0<ad().length)return a.replace(/validate[(].+[)];/g,'validate("'+ad()+'")').replace("window.top.location.replace(","window.top.location = ")}catch(b){}return a};var T={};
|
||||
function cd(a,b){var c=b?"OPEN":"GET",d=a,e=Jc(d);e&&e.bannerHeight&&e.position&&e.sticky?(P=e.bannerHeight,O=e.position,mc=e.sticky):(d=d.match(zc))?(O="top",(d=d[1].match(Ac))&&(P=d[1]),mc="absolute"):(O="bottom",mc="fixed");if(-1!==P.indexOf("vh")||-1!==P.indexOf("%"))d=P.indexOf("vh")?P.slice(0,-2):P.slice(0,-1),P=d/100*qc+"px",100>d?oc=!0:nc=!0;if(d=Jc(a)){var f;b&&d&&d.ctaText&&d.ctaText.has_app?f=d.ctaText.has_app:d&&d.ctaText&&d.ctaText.no_app&&(f=d.ctaText.no_app);c=f;Q=[];if(d&&d.injectorSelector&&
|
||||
(f=document.querySelectorAll(d.injectorSelector)))for(d=0;d<f.length;d++)Q.push(f[d].parentElement)}f=(f=a.match(xc))?f[1]:void 0;if(d=a.match(wc))d=d[1],e=document.createElement("script"),e.id="branch-journey-cta",H(e),e.innerHTML=d,document.body.appendChild(e);d=(d=a.match(yc))?d[1]:void 0;var e=a,k=e.match(vc),m=e.match(wc),h=e.match(xc),n=e.match(yc);k&&(e=e.replace(vc,""));m&&(e=e.replace(wc,""));h&&(e=e.replace(xc,""));n&&(e=e.replace(yc,""));a=e;e=document.createElement("iframe");e.src="about:blank";
|
||||
e.style.overflow="hidden";e.scrolling="no";e.id="branch-banner-iframe";e.className="branch-animation";e.title="Branch Banner";e.setAttribute("aria-label","Branch Banner");H(e);document.body.appendChild(e);k=C();k='<html><head></head><body class="'+("ios"===k||"ipad"===k?"branch-banner-ios":"android"===k?"branch-banner-android":"branch-banner-desktop")+'">'+a+"</body></html>";e.contentWindow.document.open();e.contentWindow.document.write(k);e.contentWindow.document.close();Kc(d);k=document.createElement("style");
|
||||
k.type="text/css";k.id="branch-css";k.innerHTML=f;H(k);f=e.contentWindow.document;f.head.appendChild(k);if(oc||nc){var l=f.getElementsByClassName("branch-banner-content")[0];l&&(l.style.height=P)}"top"===O?e.style.top="-"+P:"bottom"===O&&(e.style.bottom="-"+P);try{var l=f.getElementsByClassName("branch-banner-content")[0],t=window.getComputedStyle(l).getPropertyValue("background-color").split(", ");t[3]&&!parseFloat(t[3])&&(e.style.boxShadow="none")}catch(w){}e.contentWindow.document.getElementById("branch-mobile-action").innerHTML=
|
||||
c;N(R,"willShowJourney",S);Mc(e,d);return e}T.O=function(a,b,c){if(document.getElementById("branch-banner")||document.getElementById("branch-banner-iframe")||document.getElementById("branch-banner-container")||!C()||!a.event_data||!a.template)return!1;if(c)return!0;(a=!a.event_data.branch_view_data.id||b&&b.no_journeys)||(a=R,b=a.c.get("globalJourneysDismiss",!0),!0===b||b>Date.now()?a=!0:(a.c.remove("globalJourneysDismiss",!0),a=!1));return a?(T.Ba=1,!1):!0};
|
||||
T.ka=function(a){R.b(Eb,{event:"pageview",journey_displayed:!0,audience_rule_id:a.audience_rule_id,branch_view_id:a.branch_view_id},function(){})};
|
||||
T.J=function(a,b,c,d,e,f){if(!uc){kc=c;Zc(f);var k=d.audience_rule_id;(f=document.getElementById("branch-iframe-css"))&&f.parentElement.removeChild(f);f=document.createElement("div");f.id="branch-banner";document.body.insertBefore(f,null);Yb(f,"branch-banner-is-active");var m=!1,h=b.callback_string,n=null,l=null,t=R.c;if(a){var w=Jc(a)||{};a=bd(a);var W=window.setTimeout(function(){window[h]=function(){}},qa);window[h]=function(a){window.clearTimeout(W);m||(l=a,Rc(c,k,t,l,n,w,e))};Bc=n=cd(a,b.has_app_websdk);
|
||||
if(null===n){m=!0;return}Rc(c,k,t,l,n,w,e);ra&&(u["journey-load-time"]=(Date.now()-window.performance.timing.navigationStart).toString())}document.body.removeChild(f);v||e||T.ka(d)}};
|
||||
T.I=function(a,b,c,d){R=c;b||(b={});a||(a={});Ec=b.disable_entry_animation||!1;Dc=b.disable_exit_animation||!1;var e=B({},c.m),f=L(c.c)||{},k=f.hasOwnProperty("has_app")?f.has_app:!1,m=c.c.get("journeyDismissals",!0),h=(b.user_language||Va()||"en").toLowerCase()||null,n=gb(U(c)),l;(l=b.branch_view_id)||(l="_branch_view_id".replace(/[\[\]]/g,"\\$&"),l=(l=(new RegExp("[?&]"+l+"(=([^&#]*)|&|#|$)")).exec(Ea()))&&l[2]?decodeURIComponent(l[2].replace(/\+/g," ")):"");l=l||null;c=b.make_new_link?null:Fa(U(c));
|
||||
e.event=d?"dismiss":"pageview";e.metadata=a;e=F(e,"initial_referrer",n);e=F(e,"branch_view_id",l);e=F(e,"no_journeys",b.no_journeys);e=F(e,"is_iframe",y());e=F(e,"journey_dismissals",m);e.user_language=h;e.open_app=b.open_app||!1;e.has_app_websdk=k;e.feature="journeys";e.callback_string="branch_view_callback__"+lc++;e.data||(e.data={});e.data=B(Ua(),e.data);e.data=B(Da(f||{}),e.data);c&&(e.data.link_click_id=c);(a=f.data?p(f.data):null)&&a["+referrer"]&&(e.data["+referrer"]=a["+referrer"]);return e=
|
||||
z(e)};var V={androidAppIndexingTagsPresent:!1,iosAppIndexingTagsPresent:!1,androidDetailsComplete:!1,iosDetailsComplete:!1},X={};function dd(a){var b;"android"===a&&V.androidDetailsComplete&&(b="android-app://"+X.androidPackageName+"/"+X.androidURL,b=ed(b),fd(b));"ios"===a&&V.iosDetailsComplete&&(b="ios-app://"+X.iosAppId+"/"+X.iosURL,b=ed(b),fd(b))}
|
||||
function ed(a){var b={"~channel":"Firebase App Indexing","~feature":"Auto App Indexing",$canonical_url:Ea()};if("object"===typeof X.data)for(var c in X.data)X.data.hasOwnProperty(c)&&!b.hasOwnProperty(c)&&(b[c]=X.data[c]);return a+(-1<a.indexOf("?")?"&":"?")+"link_click_id=a-"+btoa(q(b))}function fd(a){var b=document.createElement("link");b.setAttribute("rel","alternate");b.setAttribute("href",a);document.head.appendChild(b)}
|
||||
function gd(a){"android"===a&&"string"===typeof X.androidPackageName&&"string"===typeof X.androidURL&&(V.androidDetailsComplete=!0,dd("android"));"ios"===a&&"string"===typeof X.iosAppId&&"string"===typeof X.iosURL&&(V.iosDetailsComplete=!0,dd("ios"))}
|
||||
function hd(a){for(var b=document.getElementsByTagName("meta"),c=0;c<b.length;c++){var d=b[c];"ios"===a&&"al:ios:app_store_id"===d.getAttribute("property")&&(X.iosAppId=d.getAttribute("content"));"ios"===a&&"al:ios:url"===d.getAttribute("property")&&(X.iosURL=d.getAttribute("content").replace("://","/"));"android"===a&&"al:android:package"===d.getAttribute("property")&&(X.androidPackageName=d.getAttribute("content"));"android"===a&&"al:android:url"===d.getAttribute("property")&&(X.androidURL=d.getAttribute("content").replace("://",
|
||||
"/"))}gd(a)};var id;
|
||||
function Y(a,b,c){return function(){var d=this,e,f,k=arguments[arguments.length-1];a&&"function"===typeof k?(e=Array.prototype.slice.call(arguments,0,arguments.length-1)||[],f=k):(f=function(){},e=Array.prototype.slice.call(arguments));d.ba(function(k){function h(b,c){try{if(b&&!a)throw b;1===a?f(b):2===a&&f(b,c)}finally{k()}}if(!c){if(1===d.o)return h(Error(x("Branch SDK initialization pending and a Branch method was called outside of the queue order")),null);if(2===d.o)return h(Error(x("Branch SDK initialization failed, so further methods cannot be called",d.l,
|
||||
d.s)),null);if(0===d.o||!d.o)return h(Error(x("Branch SDK not initialized")),null)}e.unshift(h);b.apply(d,e)})}}function Z(){if(!(this instanceof Z))return id||(id=new Z),id;this.ba=na();this.c=new Jb(["session","cookie","pojo"]);this.V=new Rb;this.h=[];this.X="web2.58.0";this.l=this.o=0;this.s=null}
|
||||
Z.prototype.b=function(a,b,c){this.W&&(b.app_id=this.W);this.i&&(b.branch_key=this.i);(a.a&&a.a.session_id||a.f&&a.f.session_id)&&this.H&&(b.session_id=this.H);(a.a&&a.a.identity_id||a.f&&a.f.identity_id)&&this.j&&(b.identity_id=this.j);0>a.endpoint.indexOf("/v1/")?(a.a&&a.a.developer_identity||a.f&&a.f.developer_identity)&&this.g&&(b.developer_identity=this.g):(a.a&&a.a.identity||a.f&&a.f.identity)&&this.g&&(b.identity=this.g);(a.a&&a.a.link_click_id||a.f&&a.f.link_click_id)&&this.$&&(b.link_click_id=
|
||||
this.$);(a.a&&a.a.sdk||a.f&&a.f.sdk)&&this.X&&(b.sdk=this.X);(a.a&&a.a.browser_fingerprint_id||a.f&&a.f.browser_fingerprint_id)&&this.D&&(b.browser_fingerprint_id=this.D);v&&(b.tracking_disabled=v);return Xb(this.V,a,b,this.c,function(a,b){c(a,b)})};function U(a){var b=L(a.c);return(b=b&&b.referring_link)?b:(a=a.c.get("click_id"))?"https://bnc.lt/c/"+a:null}function N(a,b,c){for(var d=0;d<a.h.length;d++)a.h[d].event&&a.h[d].event!==b||a.h[d].listener(b,c)}
|
||||
Z.prototype.init=Y(2,function(a,b,c){function d(){var a,b;"undefined"!==typeof document.hidden?(a="hidden",b="visibilitychange"):"undefined"!==typeof document.mozHidden?(a="mozHidden",b="mozvisibilitychange"):"undefined"!==typeof document.msHidden?(a="msHidden",b="msvisibilitychange"):"undefined"!==typeof document.webkitHidden&&(a="webkitHidden",b="webkitvisibilitychange");b&&!h.ea&&(h.ea=!0,document.addEventListener(b,function(){document[a]||(k(null),"function"===typeof h.w&&h.w())},!1))}function e(b,
|
||||
d){d&&(d=m(d),v||(d=f(d),Ba(h.c,d,t)),h.o=3,d.data_parsed=d.data&&0!==d.data.length?p(d.data):{});if(b)return h.o=2,h.l||(h.l=1,h.s=b.message),a(b,d&&Ca(d));try{a(b,d&&Ca(d))}catch(od){}finally{h.renderFinalize()}var e=ab(),k=G(c.metadata,"object")?c.metadata:null;k&&(k=hb(e.hosted_deeplink_data,k))&&0<Object.keys(k).length&&(e.hosted_deeplink_data=k);var l=T.I(Yc(c,e),c,h,!1);h.renderQueue(function(){h.b(Eb,l,function(a,b){if(!a&&"object"===typeof b){var d=l.branch_view_id?!0:!1;T.O(b,c,d)?T.J(b.template,
|
||||
l,l.branch_view_id||b.event_data.branch_view_data.id,b.event_data.branch_view_data,d,b.journey_link_data):((b.auto_branchify||!n&&Ma("branchify_url")&&U(h))&&this.branch.deepview({},{make_new_link:!1,open_app:!0,auto_branchify:!0}),N(R,"willNotShowJourney"))}v&&(wa=!0)})})}function f(a){t&&(a.identity=h.g);return a}function k(a){var b={sdk:"2.58.0",branch_key:h.i},c=L(h.c)||{},d=L(h.c,!0)||{};d.browser_fingerprint_id&&(b._t=d.browser_fingerprint_id);Ka()||La()||h.b(kb,b,function(a,b){a&&(h.l=3,h.s=
|
||||
a.message);b&&(c.browser_fingerprint_id=b)});h.b(zb,{browser_fingerprint_id:c.browser_fingerprint_id},function(b,d){b&&(h.l=4,h.s=b.message);b||!d||c.has_app||(c.has_app=!0,Pb(h.c,c),N(h,"didDownloadApp"));a&&a(null,c)})}function m(a){a.link_click_id&&(h.$=a.link_click_id.toString());a.session_id&&(h.H=a.session_id.toString());a.identity_id&&(h.j=a.identity_id.toString());a.identity&&(h.g=a.identity.toString());a.link&&(h.N=a.link);if(a.referring_link){var b=a.referring_link;a.referring_link=b?"http"!==
|
||||
b.substring(0,4)?"https://bnc.lt"+b:b:null}!a.click_id&&a.referring_link&&(a.click_id=Fa(a.referring_link));h.D=a.browser_fingerprint_id;return a}ra&&(u["init-began-at"]=(Date.now()-window.performance.timing.navigationStart).toString());var h=this;h.o=1;-1<b.indexOf("key_")?h.i=b:h.W=b;c=c&&G(c,"object")?c:{};oa=(h.G=c)&&c.retries&&Number.isInteger(c.retries)?c.retries:oa;pa=c&&c.retry_delay&&Number.isInteger(c.retry_delay)?c.retry_delay:pa;qa=c&&c.timeout&&Number.isInteger(c.timeout)?c.timeout:qa;
|
||||
r=c&&c.nonce?c.nonce:r;v=c&&c.tracking_disabled&&!0===c.tracking_disabled?!0:!1;wa=!1;v&&Aa(h);b=L(h.c,!0);h.j=b&&b.identity_id;b=L(h.c);var n=c&&"undefined"!==typeof c.branch_match_id&&null!==c.branch_match_id?c.branch_match_id:null,l=n||Ma("_branch_match_id")||Ga(),t=!h.j;h.C=!!h.c.get("branch_view_enabled");if(b&&b.session_id&&!l&&!Ma("branchify_url"))Pb(h.c,{data:""}),Pb(h.c,{referring_link:""}),d(),k(e);else{b={sdk:"2.58.0",branch_key:h.i};var w=L(h.c,!0)||{};w.browser_fingerprint_id&&(b._t=
|
||||
w.browser_fingerprint_id);w.identity&&(h.g=w.identity);var W=parseInt(Ma("[?&]_open_delay_ms"),10);Ka()||La()?ib(function(){h.b(jb,{link_identifier:l,browser_fingerprint_id:l||w.browser_fingerprint_id,alternative_browser_fingerprint_id:w.browser_fingerprint_id,options:c,initial_referrer:gb(U(h)),current_url:y()&&Ha()?window.top.location.href:window.location.href,screen_height:screen.height||0,screen_width:screen.width||0},function(a,b){a&&(h.l=2,h.s=a.message);a||"object"!==typeof b||(b.branch_view_enabled&&
|
||||
(h.C=!!b.branch_view_enabled,h.c.set("branch_view_enabled",h.C)),l&&(b.click_id=l));d();e(a,b)})},W):h.b(kb,b,function(a,b){if(a)return h.l=3,h.s=a.message,e(a,null);ib(function(){h.b(jb,{link_identifier:l,browser_fingerprint_id:l||b,alternative_browser_fingerprint_id:w.browser_fingerprint_id,options:c,initial_referrer:gb(U(h)),current_url:y()&&Ha()?window.top.location.href:window.location.href,screen_height:screen.height||0,screen_width:screen.width||0},function(a,b){a&&(h.l=2,h.s=a.message);a||
|
||||
"object"!==typeof b||(b.branch_view_enabled&&(h.C=!!b.branch_view_enabled,h.c.set("branch_view_enabled",h.C)),l&&(b.click_id=l));d();e(a,b)})},W)})}},!0);Z.prototype.renderQueue=Y(0,function(a,b){this.ca?b():(this.u=this.u||[],this.u.push(b));a(null,null)});Z.prototype.renderFinalize=Y(2,function(a){this.u&&0<this.u.length&&(this.u.forEach(function(a){a.call(this)}),delete this.u);this.ca=!0;a(null,null)});
|
||||
Z.prototype.data=Y(2,function(a){var b=Ca(L(this.c));b.referring_link=U(this);b.data_parsed=b.data&&0!==b.data.length?p(b.data):{};a(null,b)});Z.prototype.first=Y(2,function(a){a(null,Ca(L(this.c,!0)))});
|
||||
Z.prototype.setIdentity=Y(2,function(a,b){var c=this;this.b(rb,{identity:b},function(d,e){d&&a(d);e=e||{};c.j=e.identity_id?e.identity_id.toString():null;c.N=e.link;c.g=b;e.developer_identity=b;e.referring_data_parsed=e.referring_data?p(e.referring_data):null;Qb(c.c,{identity:b,identity_id:c.j});a(null,e)})});
|
||||
Z.prototype.logout=Y(1,function(a){var b=this;this.b(qb,{},function(c,d){c&&a(c);d=d||{};d={data_parsed:null,data:null,referring_link:null,click_id:null,link_click_id:null,identity:null,session_id:d.session_id,identity_id:d.identity_id,link:d.link,device_fingerprint_id:b.ha||null};b.N=d.link;b.H=d.session_id;b.j=d.identity_id;b.g=null;Qb(b.c,d,!0);a(null)})});Z.prototype.getBrowserFingerprintId=Y(2,function(a){var b=L(this.c,!0)||{};a(null,b.browser_fingerprint_id||null)});
|
||||
Z.prototype.crossPlatformIds=Y(2,function(a){this.b(Gb,{user_data:q(fb(this))},function(b,c){return a(b||null,c&&c.user_data||null)})});Z.prototype.lastAttributedTouchData=Y(2,function(a,b){b=G(b,"number")?b:null;var c=fb(this);F(c,"attribution_window",b);this.b(Ib,{user_data:q(c)},function(b,c){return a(b||null,c||null)})});
|
||||
Z.prototype.track=Y(1,function(a,b,c,d){c=c||{};d=d||{};r=d.nonce?d.nonce:r;if("pageview"===b){(b=hb(Ua(),c))&&0<Object.keys(b).length&&(c.hosted_deeplink_data=b);var e=T.I(Yc(d,c),d,this,!1);this.b(Eb,e,function(b,c){if(!b&&"object"===typeof c){var f=e.branch_view_id?!0:!1;T.O(c,d,f)?T.J(c.template,e,e.branch_view_id||c.event_data.branch_view_data.id,c.event_data.branch_view_data,f,c.journey_link_data):N(R,"willNotShowJourney")}"function"===typeof a&&a.apply(this,arguments)})}else this.b(Ab,{event:b,
|
||||
metadata:B({url:Ea(),user_agent:navigator.userAgent,language:navigator.language},c),initial_referrer:gb(U(this))},function(b,c){"function"===typeof a&&a.apply(this,arguments)})});
|
||||
Z.prototype.logEvent=Y(1,function(a,b,c,d,e){b=G(b,"string")?b:null;c=G(c,"object")?c:null;e=G(e,"string")?e:null;b&&-1<bb.indexOf(b)?(d=G(d,"array")?d:null,c=db(c),this.b(Cb,{name:b,user_data:q(fb(this)),custom_data:q(c&&c.custom_data||{}),event_data:q(c&&c.event_data||{}),content_items:q(d||[]),customer_event_alias:e},function(b){return a(b||null)})):this.b(Db,{name:b,user_data:q(fb(this)),custom_data:q(eb(c||{})),content_items:q(d||[]),customer_event_alias:e},function(b){return a(b||null)})});
|
||||
Z.prototype.link=Y(2,function(a,b){var c=z(b),d=this.i;this.b(wb,c,function(b,f){if(b)return a(b,ya(d,c));a(null,f&&f.url)})});
|
||||
Z.prototype.sendSMS=Y(1,function(a,b,c,d){function e(c){f.b(mb,{link_url:c,phone:b},function(b){a(b||null)})}var f=this;if("function"===typeof d)d={};else if("undefined"===typeof d||null===d)d={};d.make_new_link=d.make_new_link||!1;c.channel&&"app banner"!==c.channel||(c.channel="sms");var k=U(f);k&&!d.make_new_link?e(Fa(k)):f.b(wb,z(c),function(b,c){if(b)return a(b);var d=c.url;/(bnc.lt\/|app\.link\/)/.test(d)||(d="https://bnc.lt/"+Ta(d));f.b(lb,{link_url:d,click:"click"},function(b,c){if(b)return a(b);
|
||||
e(c.click_id)})})});Z.prototype.qrCode=Y(2,function(a,b,c){z(b).qr_code_settings=q(eb(c||{}));this.b(xb,z(b),function(b,c){function d(){}b||(d.rawBuffer=c,d.base64=function(){if(this.rawBuffer)return btoa(String.fromCharCode.apply(null,new Uint8Array(this.rawBuffer)));throw Error("QrCode.rawBuffer is empty.");});return a(b||null,d||null)})});
|
||||
Z.prototype.deepview=Y(1,function(a,b,c){var d=this;c||(c={});c.deepview_type="undefined"===typeof c.deepview_type?"deepview":"banner";b.data=B(Ua(),b.data);b=y()?B({is_iframe:!0},b):b;b=z(b);var e=ya(this.i,b);if(c.open_app||null===c.open_app||"undefined"===typeof c.open_app)b.open_app=!0;b.append_deeplink_path=!!c.append_deeplink_path;b.deepview_type=c.deepview_type;var f=U(d);f&&!c.make_new_link&&(b.link_click_id=Fa(f));b.banner_options=c;c.auto_branchify&&(b.auto_branchify=!0);d.w=ha(this.b,d,
|
||||
yb,b,function(b,c){if(b)return v||(d.v=function(){window.top.location=e}),a(b);"function"===typeof c&&(d.v=c);a(null)});d.w()});
|
||||
Z.prototype.deepviewCta=Y(1,function(a){if("undefined"===typeof this.v)return v?a(Error("Requested operation cannot be completed since tracking is disabled"),null):a(Error("Cannot call Deepview CTA, please call branch.deepview() first"),null);window.event&&(window.event.preventDefault?window.event.preventDefault():window.event.returnValue=!1);N(this,"didDeepviewCTA");this.v();a()});Z.prototype.referrals=Y(2,function(a){this.b(sb,{},a)});
|
||||
Z.prototype.getCode=Y(2,function(a,b){b.type="credit";b.creation_source=b.creation_source||2;this.b(nb,b,a)});Z.prototype.validateCode=Y(1,function(a,b){this.b(ob,{code:b},a)});Z.prototype.applyCode=Y(1,function(a,b){this.b(pb,{code:b},a)});Z.prototype.credits=Y(2,function(a){this.b(ub,{branch_key:this.i,identity:this.g},a)});Z.prototype.creditHistory=Y(2,function(a,b){this.b(tb,b||{},a)});Z.prototype.redeem=Y(1,function(a,b,c){this.b(vb,{amount:b,bucket:c},function(b){a(b||null)})});
|
||||
Z.prototype.addListener=function(a,b){"function"===typeof a&&void 0===b&&(b=a,a=null);b&&this.h.push({listener:b,event:a||null})};Z.prototype.removeListener=function(a){a&&(this.h=this.h.filter(function(b){if(b.listener!==a)return b}))};function jd(a,b,c){c=c||{};try{a.m=p(q(c))}finally{a.m=a.m||{}}b()}Z.prototype.setBranchViewData=Y(1,function(a,b){jd.call(null,this,a,b)},!0);
|
||||
Z.prototype.closeJourney=Y(1,function(a){var b=this;b.renderQueue(function(){if(Bc&&Cc)N(b,"didCallJourneyClose",S),Sc(Bc,!0);else return a("Journey already dismissed.")});a()});
|
||||
Z.prototype.banner=Y(1,function(a,b,c){c=c||{};jd.call(null,this,function(){},c);"undefined"===typeof b.showAgain&&"undefined"!==typeof b.forgetHide&&(b.showAgain=b.forgetHide);var d={icon:E(b.icon)||"",title:E(b.title)||"",description:E(b.description)||"",M:"number"===typeof b.reviewCount&&0<b.reviewCount?Math.floor(b.reviewCount):null,B:"number"===typeof b.rating&&5>=b.rating&&0<b.rating?Math.round(2*b.rating)/2:null,na:E(b.openAppButtonText)||"View in app",ja:E(b.downloadAppButtonText)||"Download App",
|
||||
sa:E(b.sendLinkText)||"Send Link",pa:E(b.phonePreviewText)||"(999) 999-9999",F:"undefined"===typeof b.iframe?!0:b.iframe,U:"undefined"===typeof b.showiOS?!0:b.showiOS,ua:"undefined"===typeof b.showiPad?!0:b.showiPad,P:"undefined"===typeof b.showAndroid?!0:b.showAndroid,R:"undefined"===typeof b.showBlackberry?!0:b.showBlackberry,T:"undefined"===typeof b.showWindowsPhone?!0:b.showWindowsPhone,S:"undefined"===typeof b.showKindle?!0:b.showKindle,ta:"undefined"===typeof b.showDesktop?!0:b.showDesktop,
|
||||
ia:!!b.disableHide,K:"number"===typeof b.forgetHide?b.forgetHide:!!b.forgetHide,ra:"undefined"===typeof b.respectDNT?!1:b.respectDNT,position:b.position||"top",fa:b.customCSS||"",ma:"undefined"===typeof b.mobileSticky?!1:b.mobileSticky,ga:"undefined"===typeof b.desktopSticky?!0:b.desktopSticky,xa:b.buttonBorderColor||"",va:b.buttonBackgroundColor||"",za:b.buttonFontColor||"",ya:b.buttonBorderColorHover||"",wa:b.buttonBackgroundColorHover||"",Aa:b.buttonFontColorHover||"",la:!!b.make_new_link,oa:!!b.open_app,
|
||||
Z:!!b.immediate,da:!!b.append_deeplink_path};"undefined"!==typeof b.showMobile&&(d.U=b.showMobile,d.P=b.showMobile,d.R=b.showMobile,d.T=b.showMobile,d.S=b.showMobile);c.data=B(Ua(),c.data);var e=this;e.renderQueue(function(){e.Y=ic(e,d,c,e.c)});a()});Z.prototype.closeBanner=Y(0,function(a){var b=this;b.renderQueue(function(){b.Y&&(N(b,"willCloseBanner"),b.Y(function(){N(b,"didCloseBanner")}))});a()});
|
||||
Z.prototype.autoAppIndex=Y(1,function(a,b){b=b||{};var c=document.getElementsByTagName("link"),d=c.length;if(d)for(var e=0;e<d;e++){var f=c[e],k=f.href;k&&(k.includes("ios-app")&&(V.iosAppIndexingTagsPresent=!0,f.setAttribute("href",ed(k))),k.includes("android-app")&&(V.androidAppIndexingTagsPresent=!0,f.setAttribute("href",ed(k))))}X=b;V.androidAppIndexingTagsPresent||(gd("android"),V.androidDetailsComplete||hd("android"));V.iosAppIndexingTagsPresent||(gd("ios"),V.iosDetailsComplete||hd("ios"));
|
||||
V.iosDetailsComplete||V.androidDetailsComplete?a(null):a("Firebase App Indexing tags were not added to your webpage. Please check your configuration.")});Z.prototype.trackCommerceEvent=Y(1,function(a,b,c,d){var e=this;e.renderQueue(function(){var f=$a(b,c);if(f)return a(Error(f));e.b(Bb,{event:b,metadata:B({url:document.URL,user_agent:navigator.userAgent,language:navigator.language},d||{}),initial_referrer:gb(U(e)),commerce_data:c},function(b){a(b||null)})});a()});
|
||||
Z.prototype.disableTracking=Y(1,function(a,b){if(!1===b||"false"===b)wa=v=!1,this.i&&this.G&&(!0===this.G.tracking_disabled&&delete this.G.tracking_disabled,this.init(this.i,this.G));else if(void 0===b||!0===b||"true"===b)Aa(this),wa=v=!0,this.closeBanner(),this.closeJourney();a()},!0);Z.prototype.setAPIResponseCallback=Y(0,function(a,b){this.V.aa=b;a()},!0);var kd=new Z;if(window.branch&&window.branch._q)for(var ld=window.branch._q,md=0;md<ld.length;md++){var nd=ld[md];kd[nd[0]].apply(kd,nd[1])}"function"===typeof define&&define.amd?define("branch",function(){return kd}):"object"===typeof exports&&(module.exports=kd);window&&(window.branch=kd);})();
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
(self.webpackChunklite=self.webpackChunklite||[]).push([[118],{8538:(n,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>A});var t=r(94725),o=r(67294),i=r(12291),s=r(99264),a=r(57168),u=r(72351),c=r(52837),l=r(61250),f=r(31235),d=r(31117),v=r(27737),p=r(67616),g=r(29035),m=r(63038),h=r.n(m),_=r(59713),b=r.n(_),w=r(44059),E=r(14034);function T(){for(var n=new E.y,e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];if(0===r.length)return n;var o=r.map((function(){return[]}));return r.forEach((function(e,r){e.observe((function(e){o[r].push(e),o.every((function(n){return n.length>0}))&&n.set(o.map((function(n){return n.shift()})))}))})),n}var P=function(n){return function(e){return b()({},n,e)}};const A=function(){var n,e,r,m,_,b,E,A,M,S,y,C,k,L,O,F;return o.useEffect((function(){var n=T(p.sY,p.wZ,p.vY).map((function(n){var e=h()(n,3),r=e[0],t=e[1],o=e[2];return{responseEndToLCP:new p.jb(r.response.end,t.end),responseEndToFCP:new p.jb(r.response.end,o.end)}})),e=T(p.sY,p.qH.map(P("fid")),p.vY.map(P("fcp")),p.wZ.map(P("lcp")),n);p.cA.observe((function(n){n||e.observe((function(n){var e=n.reduce((function(n,e){return Object.assign(n,e)}),{}),r=Object.keys(e).reduce((function(n,r){var t=e[r].duration;return n[r]=t%1==0?t:Number(t.toFixed(1)),n}),{}),t=document.children[0],o={html:null==t?void 0:t.innerHTML.length,redux:JSON.stringify(window.__PRELOADED_STATE__).length,apollo:JSON.stringify(window.__APOLLO_STATE__).length};w.t.log("client hydrated",{perf:r,sizes:o})}))})),p.Df.observe((function(n){return w.t.log("client resource sizes",{resources:n})}))}),[]),n=(0,i.v9)((function(n){return n.tracing.tracer})),e=(0,i.v9)((function(n){return n.tracing.originalSpan})),r=(0,s.c)(),m=r.loading,_=r.isBot,b=(0,i.v9)((function(n){return n.client.routingEntity})),E=(0,i.v9)((function(n){return n.auroraPage.isAuroraPageEnabled})),A=(0,a.r)(),M=A.loading,S=A.viewerId,y=(0,i.v9)((function(n){return n.config.performanceTags})),C=(0,f.xg)(),k=(0,f.f$)(),L=(0,i.I0)(),O=(0,l.dh)(),F=(0,u.Av)(),o.useEffect((function(){var r;if(n&&F&&!m&&!_&&!M&&S){var o=O(window.location.pathname),i=null!==(r=null==o?void 0:o.route.metricName)&&void 0!==r?r:"unidentified",s=(0,v.j)(S),a=(0,g.ic)(navigator.userAgent),u=[];C?u.push("edge_cache_enabled"):k&&u.push("edge_cache_control");var l=u.join(","),f={"user.logged_in":s,"user.experiment":l,"device.mobile_or_tablet":a,"req.route_name":i,"req.route":i,"req.router":(null==b?void 0:b.type)||c.Cr.DEFAULT};y.forEach((function(n){return f["req.".concat(n)]=1}));var h={auroraPage:E,loggedIn:s,mobileOrTablet:a,experiment:l,route:i},w=function(n){return Math.round(1e3*n)},T=function(e,r,t,o){var i=t.start,s=t.end,a=n.startSpan("timing.".concat(r),{childOf:e,tags:f}).setBeginMicros(w(i)).setEndMicros(w(s));return null!=o&&o(a),a.finish(),a};p.sY.observe((function(r){var o,i,s,a;F.reportRender(h,r);var u=n.startSpan("timing.navigation",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.load.start)).setEndMicros(w(r.load.end)).log({redirect_count:null!==(o=null===(i=window)||void 0===i||null===(s=i.performance)||void 0===s||null===(a=s.navigation)||void 0===a?void 0:a.redirectCount)&&void 0!==o?o:0});T(u,"beforeDomainLookup",r.before_domain_lookup),T(u,"domainLookup",r.domain_lookup),T(u,"connect",r.connect),T(u,"request",r.request),T(u,"response",r.response),T(u,"processing",r.processing);var c=r.overall_fcp,l=r.client,v=r.render;null!=c&&T(u,"firstContentfulPaint",c),null!=l&&T(u,"client",l,(function(n){null!=v&&T(n,"render",v)})),u.finish(),L((0,d.YU)(u.generateTraceURL()))})),p.vY.observe((function(r){F.reportFirstContentfulPaint(h,r),n.startSpan("timing.firstContentfulPaint.v2",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.start)).setEndMicros(w(r.end)).finish()})),p.wZ.observe((function(r){F.reportLargestContentfulPaint(h,r),n.startSpan("timing.largestContentfulPaint",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.start)).setEndMicros(w(r.end)).finish()})),p.yI.observe((function(n){F.reportCumulativeLayoutShift(h,n)})),p.cA.observe((function(n){n&&F.reportUnsupportedPerfObserver(h)})),p.qH.observe((function(r){F.reportInput(h,r),n.startSpan("timing.input.first.delay",{references:e?[(0,t.followsFrom)(e)]:void 0,tags:f}).setBeginMicros(w(r.start)).setEndMicros(w(r.end)).finish()}))}}),[n,M,S,m,_]),null}},72864:(n,e,r)=>{"use strict";r.r(e),r.d(e,{init:()=>i,extractSpan:()=>s});var t=r(45573),o=r(94725),i=function(n){var e=n.name,r=n.host,i=n.token,s=n.appVersion,a=new t.Tracer({component_name:e,xhr_instrumentation:!1,access_token:i,collector_host:r,default_span_tags:{"component.version":s}});return(0,o.initGlobalTracer)(a),a},s=function(n,e){if(e)return n.extract(o.FORMAT_HTTP_HEADERS,e)}}}]);
|
||||
//# sourceMappingURL=https://stats.medium.build/lite/sourcemaps/instrumentation.2774f137.chunk.js.map
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
(self.webpackChunklite=self.webpackChunklite||[]).push([[9152],{76668:(n,e,t)=>{"use strict";t.r(e),t.d(e,{default:()=>d});var r=t(67294),a=t(12291),o=t(57168),i=t(72351),u=t(44059),l=t(61250),c=t(27737),f=t(67616),m=function(n){return Math.round(1e3*n)};const d=function(n){var e=n.to,t=n.from,d=r.useRef(null),v=(0,i.Av)(),g=(0,l.dh)(),h=(0,a.v9)((function(n){return n.debug.originalSpanCarrier})),p=(0,a.v9)((function(n){return n.tracing}),a.wU),s=p.originalSpan,w=p.tracer,k=(0,o.r)(),b=k.loading,C=k.viewerId;return r.useEffect((function(){if(w&&!b&&C)if(d.current||e.pathname===t.pathname){if(d.current){var n,r,a,o,i=d.current.pathname,l=d.current.time,p=Date.now();d.current=null;var k={to:null!==(n=null===(r=g(e.pathname))||void 0===r?void 0:r.route.name)&&void 0!==n?n:"unknown",from:null!==(a=null===(o=g(i))||void 0===o?void 0:o.route.name)&&void 0!==a?a:"unknown",loggedIn:(0,c.j)(C)},I={tags:k};h&&(I.childOf=s),w.startSpan("client.navigation",I).setBeginMicros(m(l)).setEndMicros(m(p)).finish(),v&&v.reportClientNav(k,new f.jb(l,p)),u.t.log("client navigation",{duration:p-l,to:e.pathname,toRouteName:k.to,from:i,fromRouteName:k.from,loggedIn:k.loggedIn})}}else d.current={pathname:t.pathname,time:Date.now()}}),[w,e.pathname,t.pathname,b,C]),null}}}]);
|
||||
//# sourceMappingURL=https://stats.medium.build/lite/sourcemaps/reporting.0e714607.chunk.js.map
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
#credential_picker_container{border:none;height:330px;position:fixed;right:20px;top:20px;width:391px;z-index:9999}#credential_picker_container iframe{border:none;width:391px;height:330px}#g_a11y_announcement{height:1px;left:-10000px;overflow:hidden;position:absolute;top:auto;width:1px}.L5Fo6c-sM5MNb{border:0;display:block;left:0;position:relative;top:0}.L5Fo6c-bF1uUb{-webkit-border-radius:4px;border-radius:4px;bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0}.L5Fo6c-bF1uUb:focus{border:none;outline:none}sentinel{}
|
||||
/*# sourceURL=/_/gsi/_/ss/k=gsi.gsi.n64yMIEPTMo.L.W.O/am=cg/d=1/ct=zgms/rs=AF0KOtV4Ub2H8p50TbLsIBxnE82DWYYB8g/m=gis_client_style */
|
||||
|
|
@ -0,0 +1,323 @@
|
|||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/81d2bf1/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-400-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/81d2bf1/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-400-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/be78681/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-400-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/be78681/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-400-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/77a0c0c/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-700-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/77a0c0c/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-700-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/f50d520/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/charter-700-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'charter';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/f50d520/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/charter-700-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'fell';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/415369b/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/fell-400-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'fell';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/415369b/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/fell-400-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'fell';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/78ce731/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/fell-400-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'fell';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/78ce731/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/fell-400-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'gt-super';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/4a44748/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/gt-super-400-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'gt-super';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/4a44748/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/gt-super-400-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'noe';
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/b6752aa/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/noe-display-500-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'noe';
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/b6752aa/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/noe-display-500-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'opendyslexic';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/1c491fd/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/opendyslexic-400-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'opendyslexic';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/1c491fd/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/opendyslexic-400-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'opendyslexic';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/0a6190b/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/opendyslexic-400-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'opendyslexic';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/0a6190b/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/opendyslexic-400-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/51a79f1/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-300-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/51a79f1/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-300-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/6fd11d6/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-300-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/6fd11d6/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-300-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/3887986/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-400-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/3887986/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-400-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/b492c44/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-400-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/b492c44/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-400-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 500;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/54b52d6/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-500-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 500;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/54b52d6/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-500-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/df9ba7f/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-500-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/df9ba7f/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-500-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/9da4d76/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-700-italic.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
src: url('https://glyph.medium.com/font/9da4d76/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-700-italic.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/cf896f3/0-3j_4g_6bu_6c4_6c8_6c9_6cc_6cd_6ci_6cm/sohne-700-normal.woff') format('woff');
|
||||
unicode-range: U+0-7F,U+A0,U+200A,U+2014,U+2018,U+2019,U+201C,U+201D,U+2022,U+2026;
|
||||
}
|
||||
|
||||
/* rest */
|
||||
@font-face {
|
||||
font-family: 'sohne';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
src: url('https://glyph.medium.com/font/cf896f3/3k-4f_4h-6bt_6bv-6c3_6c5-6c7_6ca-6cb_6ce-6ch_6cj-6cl_6cn-nvnj/sohne-700-normal.woff') format('woff');
|
||||
unicode-range: U+80-9F,U+A1-2009,U+200B-2013,U+2015-2017,U+201A-201B,U+201E-2021,U+2023-2025,U+2027-10FFFF;
|
||||
}
|
||||
|
|
@ -0,0 +1,614 @@
|
|||
# Lint as: python3
|
||||
"""Pseudocode description of the MuZero algorithm."""
|
||||
# pylint: disable=unused-argument
|
||||
# pylint: disable=missing-docstring
|
||||
# pylint: disable=g-explicit-length-test
|
||||
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import google_type_annotations
|
||||
from __future__ import print_function
|
||||
|
||||
import collections
|
||||
import math
|
||||
import typing
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
import numpy
|
||||
import tensorflow as tf
|
||||
|
||||
##########################
|
||||
####### Helpers ##########
|
||||
|
||||
MAXIMUM_FLOAT_VALUE = float('inf')
|
||||
|
||||
KnownBounds = collections.namedtuple('KnownBounds', ['min', 'max'])
|
||||
|
||||
|
||||
class MinMaxStats(object):
|
||||
"""A class that holds the min-max values of the tree."""
|
||||
|
||||
def __init__(self, known_bounds: Optional[KnownBounds]):
|
||||
self.maximum = known_bounds.max if known_bounds else -MAXIMUM_FLOAT_VALUE
|
||||
self.minimum = known_bounds.min if known_bounds else MAXIMUM_FLOAT_VALUE
|
||||
|
||||
def update(self, value: float):
|
||||
self.maximum = max(self.maximum, value)
|
||||
self.minimum = min(self.minimum, value)
|
||||
|
||||
def normalize(self, value: float) -> float:
|
||||
if self.maximum > self.minimum:
|
||||
# We normalize only when we have set the maximum and minimum values.
|
||||
return (value - self.minimum) / (self.maximum - self.minimum)
|
||||
return value
|
||||
|
||||
|
||||
class MuZeroConfig(object):
|
||||
|
||||
def __init__(self,
|
||||
action_space_size: int,
|
||||
max_moves: int,
|
||||
discount: float,
|
||||
dirichlet_alpha: float,
|
||||
num_simulations: int,
|
||||
batch_size: int,
|
||||
td_steps: int,
|
||||
num_actors: int,
|
||||
lr_init: float,
|
||||
lr_decay_steps: float,
|
||||
visit_softmax_temperature_fn,
|
||||
known_bounds: Optional[KnownBounds] = None):
|
||||
### Self-Play
|
||||
self.action_space_size = action_space_size
|
||||
self.num_actors = num_actors
|
||||
|
||||
self.visit_softmax_temperature_fn = visit_softmax_temperature_fn
|
||||
self.max_moves = max_moves
|
||||
self.num_simulations = num_simulations
|
||||
self.discount = discount
|
||||
|
||||
# Root prior exploration noise.
|
||||
self.root_dirichlet_alpha = dirichlet_alpha
|
||||
self.root_exploration_fraction = 0.25
|
||||
|
||||
# UCB formula
|
||||
self.pb_c_base = 19652
|
||||
self.pb_c_init = 1.25
|
||||
|
||||
# If we already have some information about which values occur in the
|
||||
# environment, we can use them to initialize the rescaling.
|
||||
# This is not strictly necessary, but establishes identical behaviour to
|
||||
# AlphaZero in board games.
|
||||
self.known_bounds = known_bounds
|
||||
|
||||
### Training
|
||||
self.training_steps = int(1000e3)
|
||||
self.checkpoint_interval = int(1e3)
|
||||
self.window_size = int(1e6)
|
||||
self.batch_size = batch_size
|
||||
self.num_unroll_steps = 5
|
||||
self.td_steps = td_steps
|
||||
|
||||
self.weight_decay = 1e-4
|
||||
self.momentum = 0.9
|
||||
|
||||
# Exponential learning rate schedule
|
||||
self.lr_init = lr_init
|
||||
self.lr_decay_rate = 0.1
|
||||
self.lr_decay_steps = lr_decay_steps
|
||||
|
||||
def new_game(self):
|
||||
return Game(self.action_space_size, self.discount)
|
||||
|
||||
|
||||
def make_board_game_config(action_space_size: int, max_moves: int,
|
||||
dirichlet_alpha: float,
|
||||
lr_init: float) -> MuZeroConfig:
|
||||
|
||||
def visit_softmax_temperature(num_moves, training_steps):
|
||||
if num_moves < 30:
|
||||
return 1.0
|
||||
else:
|
||||
return 0.0 # Play according to the max.
|
||||
|
||||
return MuZeroConfig(
|
||||
action_space_size=action_space_size,
|
||||
max_moves=max_moves,
|
||||
discount=1.0,
|
||||
dirichlet_alpha=dirichlet_alpha,
|
||||
num_simulations=800,
|
||||
batch_size=2048,
|
||||
td_steps=max_moves, # Always use Monte Carlo return.
|
||||
num_actors=3000,
|
||||
lr_init=lr_init,
|
||||
lr_decay_steps=400e3,
|
||||
visit_softmax_temperature_fn=visit_softmax_temperature,
|
||||
known_bounds=KnownBounds(-1, 1))
|
||||
|
||||
|
||||
def make_go_config() -> MuZeroConfig:
|
||||
return make_board_game_config(
|
||||
action_space_size=362, max_moves=722, dirichlet_alpha=0.03, lr_init=0.01)
|
||||
|
||||
|
||||
def make_chess_config() -> MuZeroConfig:
|
||||
return make_board_game_config(
|
||||
action_space_size=4672, max_moves=512, dirichlet_alpha=0.3, lr_init=0.1)
|
||||
|
||||
|
||||
def make_shogi_config() -> MuZeroConfig:
|
||||
return make_board_game_config(
|
||||
action_space_size=11259, max_moves=512, dirichlet_alpha=0.15, lr_init=0.1)
|
||||
|
||||
|
||||
def make_atari_config() -> MuZeroConfig:
|
||||
|
||||
def visit_softmax_temperature(num_moves, training_steps):
|
||||
if training_steps < 500e3:
|
||||
return 1.0
|
||||
elif training_steps < 750e3:
|
||||
return 0.5
|
||||
else:
|
||||
return 0.25
|
||||
|
||||
return MuZeroConfig(
|
||||
action_space_size=18,
|
||||
max_moves=27000, # Half an hour at action repeat 4.
|
||||
discount=0.997,
|
||||
dirichlet_alpha=0.25,
|
||||
num_simulations=50,
|
||||
batch_size=1024,
|
||||
td_steps=10,
|
||||
num_actors=350,
|
||||
lr_init=0.05,
|
||||
lr_decay_steps=350e3,
|
||||
visit_softmax_temperature_fn=visit_softmax_temperature)
|
||||
|
||||
|
||||
class Action(object):
|
||||
|
||||
def __init__(self, index: int):
|
||||
self.index = index
|
||||
|
||||
def __hash__(self):
|
||||
return self.index
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.index == other.index
|
||||
|
||||
def __gt__(self, other):
|
||||
return self.index > other.index
|
||||
|
||||
|
||||
class Player(object):
|
||||
pass
|
||||
|
||||
|
||||
class Node(object):
|
||||
|
||||
def __init__(self, prior: float):
|
||||
self.visit_count = 0
|
||||
self.to_play = -1
|
||||
self.prior = prior
|
||||
self.value_sum = 0
|
||||
self.children = {}
|
||||
self.hidden_state = None
|
||||
self.reward = 0
|
||||
|
||||
def expanded(self) -> bool:
|
||||
return len(self.children) > 0
|
||||
|
||||
def value(self) -> float:
|
||||
if self.visit_count == 0:
|
||||
return 0
|
||||
return self.value_sum / self.visit_count
|
||||
|
||||
|
||||
class ActionHistory(object):
|
||||
"""Simple history container used inside the search.
|
||||
|
||||
Only used to keep track of the actions executed.
|
||||
"""
|
||||
|
||||
def __init__(self, history: List[Action], action_space_size: int):
|
||||
self.history = list(history)
|
||||
self.action_space_size = action_space_size
|
||||
|
||||
def clone(self):
|
||||
return ActionHistory(self.history, self.action_space_size)
|
||||
|
||||
def add_action(self, action: Action):
|
||||
self.history.append(action)
|
||||
|
||||
def last_action(self) -> Action:
|
||||
return self.history[-1]
|
||||
|
||||
def action_space(self) -> List[Action]:
|
||||
return [Action(i) for i in range(self.action_space_size)]
|
||||
|
||||
def to_play(self) -> Player:
|
||||
return Player()
|
||||
|
||||
|
||||
class Environment(object):
|
||||
"""The environment MuZero is interacting with."""
|
||||
|
||||
def step(self, action):
|
||||
pass
|
||||
|
||||
|
||||
class Game(object):
|
||||
"""A single episode of interaction with the environment."""
|
||||
|
||||
def __init__(self, action_space_size: int, discount: float):
|
||||
self.environment = Environment() # Game specific environment.
|
||||
self.history = []
|
||||
self.rewards = []
|
||||
self.child_visits = []
|
||||
self.root_values = []
|
||||
self.action_space_size = action_space_size
|
||||
self.discount = discount
|
||||
|
||||
def terminal(self) -> bool:
|
||||
# Game specific termination rules.
|
||||
pass
|
||||
|
||||
def legal_actions(self) -> List[Action]:
|
||||
# Game specific calculation of legal actions.
|
||||
return []
|
||||
|
||||
def apply(self, action: Action):
|
||||
reward = self.environment.step(action)
|
||||
self.rewards.append(reward)
|
||||
self.history.append(action)
|
||||
|
||||
def store_search_statistics(self, root: Node):
|
||||
sum_visits = sum(child.visit_count for child in root.children.values())
|
||||
action_space = (Action(index) for index in range(self.action_space_size))
|
||||
self.child_visits.append([
|
||||
root.children[a].visit_count / sum_visits if a in root.children else 0
|
||||
for a in action_space
|
||||
])
|
||||
self.root_values.append(root.value())
|
||||
|
||||
def make_image(self, state_index: int):
|
||||
# Game specific feature planes.
|
||||
return []
|
||||
|
||||
def make_target(self, state_index: int, num_unroll_steps: int, td_steps: int,
|
||||
to_play: Player):
|
||||
# The value target is the discounted root value of the search tree N steps
|
||||
# into the future, plus the discounted sum of all rewards until then.
|
||||
targets = []
|
||||
for current_index in range(state_index, state_index + num_unroll_steps + 1):
|
||||
bootstrap_index = current_index + td_steps
|
||||
if bootstrap_index < len(self.root_values):
|
||||
value = self.root_values[bootstrap_index] * self.discount**td_steps
|
||||
else:
|
||||
value = 0
|
||||
|
||||
for i, reward in enumerate(self.rewards[current_index:bootstrap_index]):
|
||||
value += reward * self.discount**i # pytype: disable=unsupported-operands
|
||||
|
||||
if current_index < len(self.root_values):
|
||||
targets.append((value, self.rewards[current_index],
|
||||
self.child_visits[current_index]))
|
||||
else:
|
||||
# States past the end of games are treated as absorbing states.
|
||||
targets.append((0, 0, []))
|
||||
return targets
|
||||
|
||||
def to_play(self) -> Player:
|
||||
return Player()
|
||||
|
||||
def action_history(self) -> ActionHistory:
|
||||
return ActionHistory(self.history, self.action_space_size)
|
||||
|
||||
|
||||
class ReplayBuffer(object):
|
||||
|
||||
def __init__(self, config: MuZeroConfig):
|
||||
self.window_size = config.window_size
|
||||
self.batch_size = config.batch_size
|
||||
self.buffer = []
|
||||
|
||||
def save_game(self, game):
|
||||
if len(self.buffer) > self.window_size:
|
||||
self.buffer.pop(0)
|
||||
self.buffer.append(game)
|
||||
|
||||
def sample_batch(self, num_unroll_steps: int, td_steps: int):
|
||||
games = [self.sample_game() for _ in range(self.batch_size)]
|
||||
game_pos = [(g, self.sample_position(g)) for g in games]
|
||||
return [(g.make_image(i), g.history[i:i + num_unroll_steps],
|
||||
g.make_target(i, num_unroll_steps, td_steps, g.to_play()))
|
||||
for (g, i) in game_pos]
|
||||
|
||||
def sample_game(self) -> Game:
|
||||
# Sample game from buffer either uniformly or according to some priority.
|
||||
return self.buffer[0]
|
||||
|
||||
def sample_position(self, game) -> int:
|
||||
# Sample position from game either uniformly or according to some priority.
|
||||
return -1
|
||||
|
||||
|
||||
class NetworkOutput(typing.NamedTuple):
|
||||
value: float
|
||||
reward: float
|
||||
policy_logits: Dict[Action, float]
|
||||
hidden_state: List[float]
|
||||
|
||||
|
||||
class Network(object):
|
||||
|
||||
def initial_inference(self, image) -> NetworkOutput:
|
||||
# representation + prediction function
|
||||
return NetworkOutput(0, 0, {}, [])
|
||||
|
||||
def recurrent_inference(self, hidden_state, action) -> NetworkOutput:
|
||||
# dynamics + prediction function
|
||||
return NetworkOutput(0, 0, {}, [])
|
||||
|
||||
def get_weights(self):
|
||||
# Returns the weights of this network.
|
||||
return []
|
||||
|
||||
def training_steps(self) -> int:
|
||||
# How many steps / batches the network has been trained for.
|
||||
return 0
|
||||
|
||||
|
||||
class SharedStorage(object):
|
||||
|
||||
def __init__(self):
|
||||
self._networks = {}
|
||||
|
||||
def latest_network(self) -> Network:
|
||||
if self._networks:
|
||||
return self._networks[max(self._networks.keys())]
|
||||
else:
|
||||
# policy -> uniform, value -> 0, reward -> 0
|
||||
return make_uniform_network()
|
||||
|
||||
def save_network(self, step: int, network: Network):
|
||||
self._networks[step] = network
|
||||
|
||||
|
||||
##### End Helpers ########
|
||||
##########################
|
||||
|
||||
|
||||
# MuZero training is split into two independent parts: Network training and
|
||||
# self-play data generation.
|
||||
# These two parts only communicate by transferring the latest network checkpoint
|
||||
# from the training to the self-play, and the finished games from the self-play
|
||||
# to the training.
|
||||
def muzero(config: MuZeroConfig):
|
||||
storage = SharedStorage()
|
||||
replay_buffer = ReplayBuffer(config)
|
||||
|
||||
for _ in range(config.num_actors):
|
||||
launch_job(run_selfplay, config, storage, replay_buffer)
|
||||
|
||||
train_network(config, storage, replay_buffer)
|
||||
|
||||
return storage.latest_network()
|
||||
|
||||
|
||||
##################################
|
||||
####### Part 1: Self-Play ########
|
||||
|
||||
|
||||
# Each self-play job is independent of all others; it takes the latest network
|
||||
# snapshot, produces a game and makes it available to the training job by
|
||||
# writing it to a shared replay buffer.
|
||||
def run_selfplay(config: MuZeroConfig, storage: SharedStorage,
|
||||
replay_buffer: ReplayBuffer):
|
||||
while True:
|
||||
network = storage.latest_network()
|
||||
game = play_game(config, network)
|
||||
replay_buffer.save_game(game)
|
||||
|
||||
|
||||
# Each game is produced by starting at the initial board position, then
|
||||
# repeatedly executing a Monte Carlo Tree Search to generate moves until the end
|
||||
# of the game is reached.
|
||||
def play_game(config: MuZeroConfig, network: Network) -> Game:
|
||||
game = config.new_game()
|
||||
|
||||
while not game.terminal() and len(game.history) < config.max_moves:
|
||||
# At the root of the search tree we use the representation function to
|
||||
# obtain a hidden state given the current observation.
|
||||
root = Node(0)
|
||||
current_observation = game.make_image(-1)
|
||||
expand_node(root, game.to_play(), game.legal_actions(),
|
||||
network.initial_inference(current_observation))
|
||||
add_exploration_noise(config, root)
|
||||
|
||||
# We then run a Monte Carlo Tree Search using only action sequences and the
|
||||
# model learned by the network.
|
||||
run_mcts(config, root, game.action_history(), network)
|
||||
action = select_action(config, len(game.history), root, network)
|
||||
game.apply(action)
|
||||
game.store_search_statistics(root)
|
||||
return game
|
||||
|
||||
|
||||
# Core Monte Carlo Tree Search algorithm.
|
||||
# To decide on an action, we run N simulations, always starting at the root of
|
||||
# the search tree and traversing the tree according to the UCB formula until we
|
||||
# reach a leaf node.
|
||||
def run_mcts(config: MuZeroConfig, root: Node, action_history: ActionHistory,
|
||||
network: Network):
|
||||
min_max_stats = MinMaxStats(config.known_bounds)
|
||||
|
||||
for _ in range(config.num_simulations):
|
||||
history = action_history.clone()
|
||||
node = root
|
||||
search_path = [node]
|
||||
|
||||
while node.expanded():
|
||||
action, node = select_child(config, node, min_max_stats)
|
||||
history.add_action(action)
|
||||
search_path.append(node)
|
||||
|
||||
# Inside the search tree we use the dynamics function to obtain the next
|
||||
# hidden state given an action and the previous hidden state.
|
||||
parent = search_path[-2]
|
||||
network_output = network.recurrent_inference(parent.hidden_state,
|
||||
history.last_action())
|
||||
expand_node(node, history.to_play(), history.action_space(), network_output)
|
||||
|
||||
backpropagate(search_path, network_output.value, history.to_play(),
|
||||
config.discount, min_max_stats)
|
||||
|
||||
|
||||
def select_action(config: MuZeroConfig, num_moves: int, node: Node,
|
||||
network: Network):
|
||||
visit_counts = [
|
||||
(child.visit_count, action) for action, child in node.children.items()
|
||||
]
|
||||
t = config.visit_softmax_temperature_fn(
|
||||
num_moves=num_moves, training_steps=network.training_steps())
|
||||
_, action = softmax_sample(visit_counts, t)
|
||||
return action
|
||||
|
||||
|
||||
# Select the child with the highest UCB score.
|
||||
def select_child(config: MuZeroConfig, node: Node,
|
||||
min_max_stats: MinMaxStats):
|
||||
_, action, child = max(
|
||||
(ucb_score(config, node, child, min_max_stats), action,
|
||||
child) for action, child in node.children.items())
|
||||
return action, child
|
||||
|
||||
|
||||
# The score for a node is based on its value, plus an exploration bonus based on
|
||||
# the prior.
|
||||
def ucb_score(config: MuZeroConfig, parent: Node, child: Node,
|
||||
min_max_stats: MinMaxStats) -> float:
|
||||
pb_c = math.log((parent.visit_count + config.pb_c_base + 1) /
|
||||
config.pb_c_base) + config.pb_c_init
|
||||
pb_c *= math.sqrt(parent.visit_count) / (child.visit_count + 1)
|
||||
|
||||
prior_score = pb_c * child.prior
|
||||
value_score = min_max_stats.normalize(child.value())
|
||||
return prior_score + value_score
|
||||
|
||||
|
||||
# We expand a node using the value, reward and policy prediction obtained from
|
||||
# the neural network.
|
||||
def expand_node(node: Node, to_play: Player, actions: List[Action],
|
||||
network_output: NetworkOutput):
|
||||
node.to_play = to_play
|
||||
node.hidden_state = network_output.hidden_state
|
||||
node.reward = network_output.reward
|
||||
policy = {a: math.exp(network_output.policy_logits[a]) for a in actions}
|
||||
policy_sum = sum(policy.values())
|
||||
for action, p in policy.items():
|
||||
node.children[action] = Node(p / policy_sum)
|
||||
|
||||
|
||||
# At the end of a simulation, we propagate the evaluation all the way up the
|
||||
# tree to the root.
|
||||
def backpropagate(search_path: List[Node], value: float, to_play: Player,
|
||||
discount: float, min_max_stats: MinMaxStats):
|
||||
for node in search_path:
|
||||
node.value_sum += value if node.to_play == to_play else -value
|
||||
node.visit_count += 1
|
||||
min_max_stats.update(node.value())
|
||||
|
||||
value = node.reward + discount * value
|
||||
|
||||
|
||||
# At the start of each search, we add dirichlet noise to the prior of the root
|
||||
# to encourage the search to explore new actions.
|
||||
def add_exploration_noise(config: MuZeroConfig, node: Node):
|
||||
actions = list(node.children.keys())
|
||||
noise = numpy.random.dirichlet([config.root_dirichlet_alpha] * len(actions))
|
||||
frac = config.root_exploration_fraction
|
||||
for a, n in zip(actions, noise):
|
||||
node.children[a].prior = node.children[a].prior * (1 - frac) + n * frac
|
||||
|
||||
|
||||
######### End Self-Play ##########
|
||||
##################################
|
||||
|
||||
##################################
|
||||
####### Part 2: Training #########
|
||||
|
||||
|
||||
def train_network(config: MuZeroConfig, storage: SharedStorage,
|
||||
replay_buffer: ReplayBuffer):
|
||||
network = Network()
|
||||
learning_rate = config.lr_init * config.lr_decay_rate**(
|
||||
tf.train.get_global_step() / config.lr_decay_steps)
|
||||
optimizer = tf.train.MomentumOptimizer(learning_rate, config.momentum)
|
||||
|
||||
for i in range(config.training_steps):
|
||||
if i % config.checkpoint_interval == 0:
|
||||
storage.save_network(i, network)
|
||||
batch = replay_buffer.sample_batch(config.num_unroll_steps, config.td_steps)
|
||||
update_weights(optimizer, network, batch, config.weight_decay)
|
||||
storage.save_network(config.training_steps, network)
|
||||
|
||||
|
||||
def update_weights(optimizer: tf.train.Optimizer, network: Network, batch,
|
||||
weight_decay: float):
|
||||
loss = 0
|
||||
for image, actions, targets in batch:
|
||||
# Initial step, from the real observation.
|
||||
value, reward, policy_logits, hidden_state = network.initial_inference(
|
||||
image)
|
||||
predictions = [(1.0, value, reward, policy_logits)]
|
||||
|
||||
# Recurrent steps, from action and previous hidden state.
|
||||
for action in actions:
|
||||
value, reward, policy_logits, hidden_state = network.recurrent_inference(
|
||||
hidden_state, action)
|
||||
predictions.append((1.0 / len(actions), value, reward, policy_logits))
|
||||
|
||||
hidden_state = tf.scale_gradient(hidden_state, 0.5)
|
||||
|
||||
for prediction, target in zip(predictions, targets):
|
||||
gradient_scale, value, reward, policy_logits = prediction
|
||||
target_value, target_reward, target_policy = target
|
||||
|
||||
l = (
|
||||
scalar_loss(value, target_value) +
|
||||
scalar_loss(reward, target_reward) +
|
||||
tf.nn.softmax_cross_entropy_with_logits(
|
||||
logits=policy_logits, labels=target_policy))
|
||||
|
||||
loss += tf.scale_gradient(l, gradient_scale)
|
||||
|
||||
for weights in network.get_weights():
|
||||
loss += weight_decay * tf.nn.l2_loss(weights)
|
||||
|
||||
optimizer.minimize(loss)
|
||||
|
||||
|
||||
def scalar_loss(prediction, target) -> float:
|
||||
# MSE in board games, cross entropy between categorical values in Atari.
|
||||
return -1
|
||||
|
||||
######### End Training ###########
|
||||
##################################
|
||||
|
||||
################################################################################
|
||||
############################# End of pseudocode ################################
|
||||
################################################################################
|
||||
|
||||
|
||||
# Stubs to make the typechecker happy.
|
||||
def softmax_sample(distribution, temperature: float):
|
||||
return 0, 0
|
||||
|
||||
|
||||
def launch_job(f, *args):
|
||||
f(*args)
|
||||
|
||||
|
||||
def make_uniform_network():
|
||||
return Network()
|
||||