{
    "version": "https://jsonfeed.org/version/1",
    "title": "月落星沉",
    "subtitle": "路漫漫其修远兮  吾将上下而求索",
    "icon": "https://blog.asxe.vip/images/favicon.ico",
    "description": null,
    "home_page_url": "https://blog.asxe.vip",
    "items": [
        {
            "id": "https://blog.asxe.vip/2024/06/05/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
            "url": "https://blog.asxe.vip/2024/06/05/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
            "title": "深度学习记录",
            "date_published": "2024-06-05T06:37:47.000Z",
            "content_html": "<ul>\n<li>张量属于可变对象</li>\n</ul>\n<h2 id=\"torchdotx-y-tensor\"><a class=\"anchor\" href=\"#torchdotx-y-tensor\">#</a> torch.dot(x, y) -&gt; Tensor</h2>\n<p>用于求向量点积，即相同位置乘积之和。其结果与 ** torch.sum (x * y) ** 相同。</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>x <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>tensor<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>y <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>tensor<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>dot<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">*</span> y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span><span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">*</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><figure class=\"highlight txt\"><figcaption data-lang=\"txt\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>tensor(14)</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>tensor([1, 4, 9])</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>tensor(14)</pre></td></tr></table></figure><h2 id=\"torchmv\"><a class=\"anchor\" href=\"#torchmv\">#</a> <span class=\"exturl\" data-url=\"aHR0cDovL3RvcmNoLm12\">torch.mv</span>(x, y) -&gt; Tensor</h2>\n<p>求矩阵 x 和向量 y 的 ** 矩阵 - 向量积 **。</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>x <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>tensor<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>y <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>arange<span class=\"token punctuation\">(</span><span class=\"token number\">15</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>reshape<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>y <span class=\"token operator\">*</span> x<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>mv<span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><figure class=\"highlight txt\"><figcaption data-lang=\"txt\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>tensor([[ 0,  1,  2],</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>        [ 3,  4,  5],</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        [ 6,  7,  8],</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        [ 9, 10, 11],</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        [12, 13, 14]])</pre></td></tr><tr><td data-num=\"6\"></td><td><pre>tensor([[ 0,  2,  6],</pre></td></tr><tr><td data-num=\"7\"></td><td><pre>        [ 3,  8, 15],</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        [ 6, 14, 24],</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        [ 9, 20, 33],</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        [12, 26, 42]])</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>tensor([ 8, 26, 44, 62, 80])</pre></td></tr></table></figure><h2 id=\"torchrand-tensor\"><a class=\"anchor\" href=\"#torchrand-tensor\">#</a> torch.rand() -&gt; Tensor</h2>\n<p>该函数返回一个填充了区间 [0， 1] 上均匀分布的随机数的张量。</p>\n<h2 id=\"自动求导自动微分机制\"><a class=\"anchor\" href=\"#自动求导自动微分机制\">#</a> 自动求导（自动微分机制）</h2>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>x <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>arange<span class=\"token punctuation\">(</span><span class=\"token number\">4.0</span><span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>grad<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 默认为 None</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>y <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> torch<span class=\"token punctuation\">.</span>dot<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>y<span class=\"token punctuation\">.</span>backward<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>grad<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><figure class=\"highlight txt\"><figcaption data-lang=\"txt\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>tensor([0., 1., 2., 3.], requires_grad=True)</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>None</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>tensor([ 0.,  4.,  8., 12.])</pre></td></tr></table></figure><p>其中 ** x = torch.arange (4.0, requires_grad=True) ** 可以用示例代替：</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>x <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>arange<span class=\"token punctuation\">(</span><span class=\"token number\">4.0</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>x<span class=\"token punctuation\">.</span>requires_grad_<span class=\"token punctuation\">(</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>当你需要计算其他函数时：</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\"># pytorch 默认会累积梯度，因此需要清除之前得到的值</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>x<span class=\"token punctuation\">.</span>grad<span class=\"token punctuation\">.</span>zero_<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>y <span class=\"token operator\">=</span> x<span class=\"token punctuation\">.</span><span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>y<span class=\"token punctuation\">.</span>backward<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>grad<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"多层感知机\"><a class=\"anchor\" href=\"#多层感知机\">#</a> 多层感知机</h2>\n<h3 id=\"多层感知机的手动实现\"><a class=\"anchor\" href=\"#多层感知机的手动实现\">#</a> 多层感知机的手动实现</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">from</span> torch <span class=\"token keyword\">import</span> nn</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">from</span> util <span class=\"token keyword\">import</span> deep</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>batch_size <span class=\"token operator\">=</span> <span class=\"token number\">256</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>train_iter<span class=\"token punctuation\">,</span> test_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_data_mnist<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>num_inputs<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">,</span> num_hidden2 <span class=\"token operator\">=</span> <span class=\"token number\">784</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token number\">128</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>w1 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Parameter<span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>b1 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Parameter<span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>num_hidden1<span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>w2 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Parameter<span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span>num_hidden1<span class=\"token punctuation\">,</span> num_hidden2<span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>b2 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Parameter<span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>num_hidden2<span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>w3 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Parameter<span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span>num_hidden2<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>b3 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Parameter<span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>num_outputs<span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>params <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>w1<span class=\"token punctuation\">,</span> b1<span class=\"token punctuation\">,</span> w2<span class=\"token punctuation\">,</span> b2<span class=\"token punctuation\">,</span> w3<span class=\"token punctuation\">,</span> b3<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre></pre></td></tr><tr><td data-num=\"18\"></td><td><pre></pre></td></tr><tr><td data-num=\"19\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">relu</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    a <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>zeros_like<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token keyword\">return</span> torch<span class=\"token punctuation\">.</span><span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre></pre></td></tr><tr><td data-num=\"23\"></td><td><pre></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">net</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    x <span class=\"token operator\">=</span> x<span class=\"token punctuation\">.</span>reshape<span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> num_inputs<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    h <span class=\"token operator\">=</span> relu<span class=\"token punctuation\">(</span>x @ w1 <span class=\"token operator\">+</span> b1<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    h2 <span class=\"token operator\">=</span> relu<span class=\"token punctuation\">(</span>h @ w2 <span class=\"token operator\">+</span> b2<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>    <span class=\"token keyword\">return</span> h2 @ w3 <span class=\"token operator\">+</span> b3</pre></td></tr><tr><td data-num=\"29\"></td><td><pre></pre></td></tr><tr><td data-num=\"30\"></td><td><pre></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>loss <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>CrossEntropyLoss<span class=\"token punctuation\">(</span>reduction<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>num_epochs<span class=\"token punctuation\">,</span> lr <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.1</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>updater <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>optim<span class=\"token punctuation\">.</span>SGD<span class=\"token punctuation\">(</span>params<span class=\"token punctuation\">,</span> lr<span class=\"token operator\">=</span>lr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre></pre></td></tr><tr><td data-num=\"35\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>    deep<span class=\"token punctuation\">.</span>train_ch3<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> train_iter<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">,</span> num_epochs<span class=\"token punctuation\">,</span> updater<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>    deep<span class=\"token punctuation\">.</span>predict<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"多层感知机的简洁实现\"><a class=\"anchor\" href=\"#多层感知机的简洁实现\">#</a> 多层感知机的简洁实现</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">from</span> torch <span class=\"token keyword\">import</span> nn</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">from</span> util <span class=\"token keyword\">import</span> deep</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>net <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Sequential<span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Flatten<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span><span class=\"token number\">784</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>ReLU<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span><span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>ReLU<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span><span class=\"token number\">128</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">init_weights</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">if</span> <span class=\"token builtin\">type</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        nn<span class=\"token punctuation\">.</span>init<span class=\"token punctuation\">.</span>normal_<span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">,</span> std<span class=\"token operator\">=</span><span class=\"token number\">0.01</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>net<span class=\"token punctuation\">.</span><span class=\"token builtin\">apply</span><span class=\"token punctuation\">(</span>init_weights<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>loss <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>CrossEntropyLoss<span class=\"token punctuation\">(</span>reduction<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>num_epochs<span class=\"token punctuation\">,</span> lr<span class=\"token punctuation\">,</span> batch_size <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>trainer <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>optim<span class=\"token punctuation\">.</span>SGD<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">.</span>parameters<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> lr<span class=\"token operator\">=</span>lr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>train_iter<span class=\"token punctuation\">,</span> test_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_data_mnist<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    deep<span class=\"token punctuation\">.</span>train_ch3<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> train_iter<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">,</span> num_epochs<span class=\"token punctuation\">,</span> trainer<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    deep<span class=\"token punctuation\">.</span>predict<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"权重衰减\"><a class=\"anchor\" href=\"#权重衰减\">#</a> 权重衰减</h2>\n<h3 id=\"权重衰减的手动实现\"><a class=\"anchor\" href=\"#权重衰减的手动实现\">#</a> 权重衰减的手动实现</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">from</span> util <span class=\"token keyword\">import</span> deep</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>n_train<span class=\"token punctuation\">,</span> n_test<span class=\"token punctuation\">,</span> num_inputs<span class=\"token punctuation\">,</span> batch_size <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>true_w<span class=\"token punctuation\">,</span> true_b <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>ones<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.05</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>train_data <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>synthetic_data<span class=\"token punctuation\">(</span>true_w<span class=\"token punctuation\">,</span> true_b<span class=\"token punctuation\">,</span> n_train<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>train_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_array<span class=\"token punctuation\">(</span>train_data<span class=\"token punctuation\">,</span> batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>test_data <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>synthetic_data<span class=\"token punctuation\">(</span>true_w<span class=\"token punctuation\">,</span> true_b<span class=\"token punctuation\">,</span> n_test<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>test_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_array<span class=\"token punctuation\">(</span>test_data<span class=\"token punctuation\">,</span> batch_size<span class=\"token punctuation\">,</span> is_train<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">init_params</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    w <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>normal<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> size<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    b <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> requires_grad<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>w<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre></pre></td></tr><tr><td data-num=\"18\"></td><td><pre></pre></td></tr><tr><td data-num=\"19\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">l2_penalty</span><span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token triple-quoted-string string\">\"\"\"L2范数惩罚\"\"\"</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token keyword\">return</span> torch<span class=\"token punctuation\">.</span><span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">.</span><span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">2</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre></pre></td></tr><tr><td data-num=\"23\"></td><td><pre></pre></td></tr><tr><td data-num=\"24\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">train</span><span class=\"token punctuation\">(</span>lambd<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    w<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> init_params<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    net<span class=\"token punctuation\">,</span> loss <span class=\"token operator\">=</span> <span class=\"token keyword\">lambda</span> X<span class=\"token punctuation\">:</span> deep<span class=\"token punctuation\">.</span>linreg<span class=\"token punctuation\">(</span>X<span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> deep<span class=\"token punctuation\">.</span>squared_loss</pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    num_epochs<span class=\"token punctuation\">,</span> lr <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.003</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>    animator <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>Animator<span class=\"token punctuation\">(</span>xlabel<span class=\"token operator\">=</span><span class=\"token string\">'epochs'</span><span class=\"token punctuation\">,</span> ylabel<span class=\"token operator\">=</span><span class=\"token string\">'loss'</span><span class=\"token punctuation\">,</span> yscale<span class=\"token operator\">=</span><span class=\"token string\">'log'</span><span class=\"token punctuation\">,</span> xlim<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> num_epochs<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>                             legend<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">'train'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'test'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>    <span class=\"token keyword\">for</span> epoch <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_epochs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token keyword\">for</span> x<span class=\"token punctuation\">,</span> y <span class=\"token keyword\">in</span> train_iter<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>            l <span class=\"token operator\">=</span> loss<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> lambd <span class=\"token operator\">*</span> l2_penalty<span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>            l<span class=\"token punctuation\">.</span><span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>backward<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>            deep<span class=\"token punctuation\">.</span>sgd<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>w<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> lr<span class=\"token punctuation\">,</span> batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>epoch <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">5</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>            animator<span class=\"token punctuation\">.</span>add<span class=\"token punctuation\">(</span>epoch <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>deep<span class=\"token punctuation\">.</span>evaluate_loss<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> train_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>                                     deep<span class=\"token punctuation\">.</span>evaluate_loss<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'w的L2的范数是：'</span><span class=\"token punctuation\">,</span> torch<span class=\"token punctuation\">.</span>norm<span class=\"token punctuation\">(</span>w<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre></pre></td></tr><tr><td data-num=\"41\"></td><td><pre></pre></td></tr><tr><td data-num=\"42\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>\ttrain<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 忽略正则化直接训练</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>    train<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 使用权重衰减</span></pre></td></tr></table></figure><h3 id=\"权重衰减的简洁实现\"><a class=\"anchor\" href=\"#权重衰减的简洁实现\">#</a> 权重衰减的简洁实现</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">from</span> torch <span class=\"token keyword\">import</span> nn</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">from</span> util <span class=\"token keyword\">import</span> deep</pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>n_train<span class=\"token punctuation\">,</span> n_test<span class=\"token punctuation\">,</span> num_inputs<span class=\"token punctuation\">,</span> batch_size <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">200</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>true_w<span class=\"token punctuation\">,</span> true_b <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>ones<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.05</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>train_data <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>synthetic_data<span class=\"token punctuation\">(</span>true_w<span class=\"token punctuation\">,</span> true_b<span class=\"token punctuation\">,</span> n_train<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>train_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_array<span class=\"token punctuation\">(</span>train_data<span class=\"token punctuation\">,</span> batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>test_data <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>synthetic_data<span class=\"token punctuation\">(</span>true_w<span class=\"token punctuation\">,</span> true_b<span class=\"token punctuation\">,</span> n_test<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>test_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_array<span class=\"token punctuation\">(</span>test_data<span class=\"token punctuation\">,</span> batch_size<span class=\"token punctuation\">,</span> is_train<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre></pre></td></tr><tr><td data-num=\"13\"></td><td><pre></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">train_concise</span><span class=\"token punctuation\">(</span>wd<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    net <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Sequential<span class=\"token punctuation\">(</span>nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token keyword\">for</span> param <span class=\"token keyword\">in</span> net<span class=\"token punctuation\">.</span>parameters<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        param<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>normal_<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    loss <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>MSELoss<span class=\"token punctuation\">(</span>reduction<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    num_epochs<span class=\"token punctuation\">,</span> lr <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.003</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    trainer <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>optim<span class=\"token punctuation\">.</span>SGD<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span><span class=\"token string\">'params'</span><span class=\"token punctuation\">:</span> net<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">,</span> <span class=\"token string\">'weight_decay'</span><span class=\"token punctuation\">:</span> wd<span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>        <span class=\"token punctuation\">&#123;</span><span class=\"token string\">'params'</span><span class=\"token punctuation\">:</span> net<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>bias<span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> lr<span class=\"token operator\">=</span>lr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>    animator <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>Animator<span class=\"token punctuation\">(</span>xlabel<span class=\"token operator\">=</span><span class=\"token string\">'epochs'</span><span class=\"token punctuation\">,</span> ylabel<span class=\"token operator\">=</span><span class=\"token string\">'loss'</span><span class=\"token punctuation\">,</span> yscale<span class=\"token operator\">=</span><span class=\"token string\">'log'</span><span class=\"token punctuation\">,</span> xlim<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> num_epochs<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>                             legend<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">'train'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'test'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    <span class=\"token keyword\">for</span> epoch <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_epochs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>        <span class=\"token keyword\">for</span> x<span class=\"token punctuation\">,</span> y <span class=\"token keyword\">in</span> train_iter<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>            trainer<span class=\"token punctuation\">.</span>zero_grad<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>            l <span class=\"token operator\">=</span> loss<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>            l<span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>backward<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>            trainer<span class=\"token punctuation\">.</span>step<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>epoch <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">5</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>            animator<span class=\"token punctuation\">.</span>add<span class=\"token punctuation\">(</span>epoch <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>deep<span class=\"token punctuation\">.</span>evaluate_loss<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> train_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>                                     deep<span class=\"token punctuation\">.</span>evaluate_loss<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'w的L2的范数是：'</span><span class=\"token punctuation\">,</span> net<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">.</span>norm<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre></pre></td></tr><tr><td data-num=\"37\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>\ttrain_concise<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 忽略正则化直接训练</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>    train_concise<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 使用权重衰减</span></pre></td></tr></table></figure><h2 id=\"暂退法\"><a class=\"anchor\" href=\"#暂退法\">#</a> 暂退法</h2>\n<h3 id=\"暂退法的手动实现\"><a class=\"anchor\" href=\"#暂退法的手动实现\">#</a> 暂退法的手动实现</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> math</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> numpy <span class=\"token keyword\">as</span> np</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">from</span> torch <span class=\"token keyword\">import</span> nn</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">from</span> util <span class=\"token keyword\">import</span> deep</pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">dropout_layer</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> dropout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    <span class=\"token keyword\">assert</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> dropout <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token keyword\">if</span> dropout <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>        <span class=\"token keyword\">return</span> torch<span class=\"token punctuation\">.</span>zeros_like<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    <span class=\"token keyword\">if</span> dropout <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token keyword\">return</span> x</pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    mask <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>shape<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> dropout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">return</span> mask <span class=\"token operator\">*</span> x <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1.0</span> <span class=\"token operator\">-</span> dropout<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>num_inputs<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">,</span> num_hidden2 <span class=\"token operator\">=</span> <span class=\"token number\">784</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>dropout1<span class=\"token punctuation\">,</span> dropout2 <span class=\"token operator\">=</span> <span class=\"token number\">0.2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.5</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre></pre></td></tr><tr><td data-num=\"21\"></td><td><pre></pre></td></tr><tr><td data-num=\"22\"></td><td><pre><span class=\"token keyword\">class</span> <span class=\"token class-name\">Net</span><span class=\"token punctuation\">(</span>nn<span class=\"token punctuation\">.</span>Module<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_inputs<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">,</span> num_hidden2<span class=\"token punctuation\">,</span> is_training<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>        <span class=\"token builtin\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__init__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>        self<span class=\"token punctuation\">.</span>num_inputs <span class=\"token operator\">=</span> num_inputs</pre></td></tr><tr><td data-num=\"26\"></td><td><pre>        self<span class=\"token punctuation\">.</span>training <span class=\"token operator\">=</span> is_training</pre></td></tr><tr><td data-num=\"27\"></td><td><pre>        self<span class=\"token punctuation\">.</span>lin1 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>        self<span class=\"token punctuation\">.</span>lin2 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>num_hidden1<span class=\"token punctuation\">,</span> num_hidden2<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>        self<span class=\"token punctuation\">.</span>lin3 <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>num_hidden2<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>        self<span class=\"token punctuation\">.</span>relu <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>ReLU<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">forward</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>        h1 <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>relu<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>lin1<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>reshape<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>num_inputs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>training<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>            h1 <span class=\"token operator\">=</span> dropout_layer<span class=\"token punctuation\">(</span>h1<span class=\"token punctuation\">,</span> dropout1<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>        h2 <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>relu<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>lin2<span class=\"token punctuation\">(</span>h1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>training<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>            h2 <span class=\"token operator\">=</span> dropout_layer<span class=\"token punctuation\">(</span>h2<span class=\"token punctuation\">,</span> dropout2<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>        out <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>lin3<span class=\"token punctuation\">(</span>h2<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>        <span class=\"token keyword\">return</span> out</pre></td></tr><tr><td data-num=\"41\"></td><td><pre></pre></td></tr><tr><td data-num=\"42\"></td><td><pre></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>net <span class=\"token operator\">=</span> Net<span class=\"token punctuation\">(</span>num_inputs<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">,</span> num_hidden2<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>num_epochs<span class=\"token punctuation\">,</span> lr<span class=\"token punctuation\">,</span> batch_size <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>loss <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>CrossEntropyLoss<span class=\"token punctuation\">(</span>reduction<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>train_iter<span class=\"token punctuation\">,</span> test_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_data_mnist<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>trainer <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>optim<span class=\"token punctuation\">.</span>SGD<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">.</span>parameters<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> lr<span class=\"token operator\">=</span>lr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre></pre></td></tr><tr><td data-num=\"49\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>    deep<span class=\"token punctuation\">.</span>train_ch3<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> train_iter<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">,</span> num_epochs<span class=\"token punctuation\">,</span> trainer<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"暂退法的简洁实现\"><a class=\"anchor\" href=\"#暂退法的简洁实现\">#</a> 暂退法的简洁实现</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> torch</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">from</span> torch <span class=\"token keyword\">import</span> nn</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">from</span> util <span class=\"token keyword\">import</span> deep</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">dropout_layer</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> dropout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token keyword\">assert</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> dropout <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    <span class=\"token keyword\">if</span> dropout <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        <span class=\"token keyword\">return</span> torch<span class=\"token punctuation\">.</span>zeros_like<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token keyword\">if</span> dropout <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>        <span class=\"token keyword\">return</span> x</pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    mask <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>torch<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>shape<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> dropout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token keyword\">return</span> mask <span class=\"token operator\">*</span> x <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1.0</span> <span class=\"token operator\">-</span> dropout<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre></pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>num_inputs<span class=\"token punctuation\">,</span> num_outputs<span class=\"token punctuation\">,</span> num_hidden1<span class=\"token punctuation\">,</span> num_hidden2 <span class=\"token operator\">=</span> <span class=\"token number\">784</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>dropout1<span class=\"token punctuation\">,</span> dropout2 <span class=\"token operator\">=</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.2</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>net <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Sequential<span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Flatten<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span><span class=\"token number\">784</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>ReLU<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Dropout<span class=\"token punctuation\">(</span>dropout1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span><span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>ReLU<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Dropout<span class=\"token punctuation\">(</span>dropout2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span><span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre></pre></td></tr><tr><td data-num=\"30\"></td><td><pre></pre></td></tr><tr><td data-num=\"31\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">init_weight</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>    <span class=\"token keyword\">if</span> <span class=\"token builtin\">type</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>        nn<span class=\"token punctuation\">.</span>init<span class=\"token punctuation\">.</span>normal_<span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">,</span> std<span class=\"token operator\">=</span><span class=\"token number\">0.01</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre></pre></td></tr><tr><td data-num=\"35\"></td><td><pre></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>net<span class=\"token punctuation\">.</span><span class=\"token builtin\">apply</span><span class=\"token punctuation\">(</span>init_weight<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>num_epochs<span class=\"token punctuation\">,</span> lr<span class=\"token punctuation\">,</span> batch_size <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">256</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>loss <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>CrossEntropyLoss<span class=\"token punctuation\">(</span>reduction<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>train_iter<span class=\"token punctuation\">,</span> test_iter <span class=\"token operator\">=</span> deep<span class=\"token punctuation\">.</span>load_data_mnist<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>trainer <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>optim<span class=\"token punctuation\">.</span>SGD<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">.</span>parameters<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> lr<span class=\"token operator\">=</span>lr<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre></pre></td></tr><tr><td data-num=\"43\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>    deep<span class=\"token punctuation\">.</span>train_ch3<span class=\"token punctuation\">(</span>net<span class=\"token punctuation\">,</span> train_iter<span class=\"token punctuation\">,</span> test_iter<span class=\"token punctuation\">,</span> loss<span class=\"token punctuation\">,</span> num_epochs<span class=\"token punctuation\">,</span> trainer<span class=\"token punctuation\">)</span></pre></td></tr></table></figure>",
            "tags": [
                "Python",
                "python",
                "deep learning",
                "pytorch"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2024/06/04/matplotlib%E8%AE%B0%E5%BD%95/",
            "url": "https://blog.asxe.vip/2024/06/04/matplotlib%E8%AE%B0%E5%BD%95/",
            "title": "matplotlib记录",
            "date_published": "2024-06-04T14:04:54.000Z",
            "content_html": "<h2 id=\"pltgca\"><a class=\"anchor\" href=\"#pltgca\">#</a> plt.gca()</h2>\n<p>plt.gca () 函数，可用于获取当前图形的坐标轴（Axes）对象。可以对此对象进行更改或添加其他元素，例如标题、标签、网格等。<br />\n示例代码：</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>pyplot <span class=\"token keyword\">as</span> plt</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\"># 绘制图形</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>plt<span class=\"token punctuation\">.</span>plot<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token comment\"># 获取当前坐标轴对象并设置其属性</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>ax <span class=\"token operator\">=</span> plt<span class=\"token punctuation\">.</span>gca<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>ax<span class=\"token punctuation\">.</span>set_title<span class=\"token punctuation\">(</span><span class=\"token string\">\"test gca\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>ax<span class=\"token punctuation\">.</span>set_xlabel<span class=\"token punctuation\">(</span><span class=\"token string\">\"x\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>ax<span class=\"token punctuation\">.</span>set_ylabel<span class=\"token punctuation\">(</span><span class=\"token string\">\"y\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>plt<span class=\"token punctuation\">.</span>show<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"axescla\"><a class=\"anchor\" href=\"#axescla\">#</a> Axes.cla()</h2>\n<p>使用 ** Axes.cla () ** 函数用于清除当前轴，即删除轴上的所有图形、标注等内容，使轴恢复到初始状态。这样，在绘制新的图形时，不会受到之前图形的干扰。</p>\n<h2 id=\"pltrcparams\"><a class=\"anchor\" href=\"#pltrcparams\">#</a> plt.rcParams</h2>\n<p>此属性可以设置图像配置参数，以下是一些常用的 plt.rcParams 属性及其作用和用法：</p>\n<details class=\"primary\"><summary>图形和画布</summary><div>\n<ul>\n<li>figure.figsize: 设置图形的宽和高。示例: plt.rcParams ['figure.figsize'] = [10, 5]</li>\n<li>figure.dpi: 设置图形的分辨率。示例: plt.rcParams ['figure.dpi'] = 100</li>\n<li>figure.facecolor: 设置图形的背景颜色。示例: plt.rcParams ['figure.facecolor'] = 'w'</li>\n<li>figure.edgecolor: 设置图形边框的颜色。示例: plt.rcParams ['figure.edgecolor'] = 'k'</li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>轴</summary><div>\n<ul>\n<li>axes.linewidth: 设置坐标轴的线宽。示例: plt.rcParams ['axes.linewidth'] = 1.5</li>\n<li>axes.grid: 是否显示网格。示例: plt.rcParams ['axes.grid'] = True</li>\n<li>axes.titlesize: 设置坐标轴标题的字体大小。示例: plt.rcParams ['axes.titlesize'] = 'large'</li>\n<li>axes.labelsize: 设置坐标轴标签的字体大小。示例: plt.rcParams ['axes.labelsize'] = 'medium'</li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>网格</summary><div>\n<ul>\n<li>grid.color: 设置网格线的颜色。示例: plt.rcParams ['grid.color'] = 'grey'</li>\n<li>grid.linestyle: 设置网格线的样式。示例: plt.rcParams ['grid.linestyle'] = '--'</li>\n<li>grid.linewidth: 设置网格线的宽度。示例: plt.rcParams ['grid.linewidth'] = 0.5</li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>线条</summary><div>\n<ul>\n<li>lines.linewidth: 设置线条的宽度。示例: plt.rcParams ['lines.linewidth'] = 2.0</li>\n<li>lines.color: 设置线条的颜色。示例: plt.rcParams ['lines.color'] = 'blue'</li>\n<li>lines.linestyle: 设置线条的样式。示例: plt.rcParams ['lines.linestyle'] = '-'</li>\n<li>lines.marker: 设置线条的标记。示例: plt.rcParams ['lines.marker'] = 'o'</li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>字体</summary><div>\n<ul>\n<li>font.size: 设置字体大小。示例: plt.rcParams ['font.size'] = 12</li>\n<li>font.family: 设置字体系列。示例: plt.rcParams ['font.family'] = 'sans-serif'</li>\n<li>font.serif: 设置衬线字体。示例: plt.rcParams ['font.serif'] = ['Times New Roman']</li>\n<li>font.sans-serif: 设置无衬线字体。示例: plt.rcParams ['font.sans-serif'] = ['Arial']</li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>图例</summary><div>\n<ul>\n<li>legend.loc: 设置图例的位置。示例: plt.rcParams ['legend.loc'] = 'best'</li>\n<li>legend.fontsize: 设置图例的字体大小。示例: plt.rcParams ['legend.fontsize'] = 'large'</li>\n<li>legend.frameon: 是否绘制图例边框。示例: plt.rcParams ['legend.frameon'] = True</li>\n<li>legend.numpoints: 图例中标记点的数目。示例: plt.rcParams ['legend.numpoints'] = 1</li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>刻度</summary><div>\n<ul>\n<li>xtick.labelsize: 设置 x 轴刻度标签的字体大小。示例: plt.rcParams ['xtick.labelsize'] = 'medium'</li>\n<li>ytick.labelsize: 设置 y 轴刻度标签的字体大小。示例: plt.rcParams ['ytick.labelsize'] = 'medium'</li>\n<li>xtick.direction: 设置 x 轴刻度的方向。示例: plt.rcParams ['xtick.direction'] = 'in'</li>\n<li>ytick.direction: 设置 y 轴刻度的方向。示例: plt.rcParams ['ytick.direction'] = 'in'</li>\n</ul>\n</div></details>\n",
            "tags": [
                "Python",
                "python",
                "matplotlib"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/12/28/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8libeasyhttp%EF%BC%9F%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E6%95%99%E4%BC%9A%E4%BD%A0/",
            "url": "https://blog.asxe.vip/2023/12/28/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8libeasyhttp%EF%BC%9F%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E6%95%99%E4%BC%9A%E4%BD%A0/",
            "title": "如何使用libeasyhttp？一篇文章教会你",
            "date_published": "2023-12-28T11:14:05.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"获取源文件\"><a class=\"anchor\" href=\"#获取源文件\">#</a> 获取源文件</h2>\n<p>点击<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L2xpYmVhc3lodHRw\"> libeasyhttp</span> 下载</p>\n<h2 id=\"使用方法\"><a class=\"anchor\" href=\"#使用方法\">#</a> 使用方法</h2>\n<p>请求所返回类型均为 HTTP_RESPONSE 结构。其定义如下 &lt;br&gt;</p>\n<pre><code class=\"language-C++\">typedef struct HTTP_RESPONSE &#123;\nlong status; //请求状态码\nchar *text; //文本\ndouble total_time; //请求耗时\n&#125; HTTP_RESPONSE;\n</code></pre>\n<ol>\n<li>发送 get 请求，原型为:&lt;br&gt;HTTP_RESPONSE get (const char *url, HEADERS *headers);</li>\n</ol>\n<pre><code class=\"language-C++\">#include &quot;libeasyhttp/easy-http.h&quot;\n\nint main(void) &#123;\n    HEADERS *headerList = NULL;\n    \n    headerList = addHeader(headerList, &quot;Content-Type&quot;, &quot;text/html; charset=utf-8&quot;);\n    headerList = addHeader(headerList, &quot;User-Agent&quot;, &quot;ASXE&quot;);\n    \n    HTTP_RESPONSE httpResponse = get(&quot;https://www.asxe.vip/&quot;, headerList);\n    printf(&quot;%s&quot;, httpResponse.text);\n    printf(&quot;%ld&quot;, httpResponse.status);\n    printf(&quot;%f&quot;, httpResponse.total_time);\n    return 0;\n&#125;\n</code></pre>\n<ol start=\"2\">\n<li>发送 post 请求，原型为 &lt;br&gt;HTTP_RESPONSE post (const char *url, HEADERS *headers, POST_DATA *postData);</li>\n</ol>\n<pre><code class=\"language-C++\">#include &quot;libeasyhttp/easy-http.h&quot;\n\nint main(void) &#123;\n    HEADERS *headerList = NULL;\n    POST_DATA *postData = NULL;\n    \n    headerList = addHeader(headerList, &quot;User-Agent&quot;, &quot;ASXE&quot;);\n    \n    postData = addData(postData, &quot;q&quot;, &quot;测试&quot;);\n    \n    HTTP_RESPONSE httpResponse = post(&quot;http://127.0.0.1:1314/search/&quot;, headerList, postData);\n    printf(&quot;%s&quot;, httpResponse.text);\n    printf(&quot;%ld&quot;, httpResponse.status);\n    printf(&quot;%f&quot;, httpResponse.total_time);\n    return 0;\n&#125;\n</code></pre>\n",
            "tags": [
                "C/C++",
                "libeasyhttp"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/11/16/%E4%BB%BF%E5%8D%8E%E4%B8%BA%E5%95%86%E5%9F%8E%E4%B8%BB%E9%A1%B5/",
            "url": "https://blog.asxe.vip/2023/11/16/%E4%BB%BF%E5%8D%8E%E4%B8%BA%E5%95%86%E5%9F%8E%E4%B8%BB%E9%A1%B5/",
            "title": "仿华为商城主页",
            "date_published": "2023-11-16T10:13:42.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h1 id=\"项目地址\"><a class=\"anchor\" href=\"#项目地址\">#</a> 项目地址</h1>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L0h1YXdlaS1Ib21lcGFnZS1JbWl0YXRpb24=\">Huawei-Homepage-Imitation</span><br />\n<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L0h1YXdlaS1Ib21lcGFnZS1JbWl0YXRpb24=\">https://github.com/asxez/Huawei-Homepage-Imitation</span></p>\n<h1 id=\"为什么写这个项目\"><a class=\"anchor\" href=\"#为什么写这个项目\">#</a> 为什么写这个项目？</h1>\n<p>这个项目是我的<ins> web 前端开发</ins>课程大作业</p>\n<h1 id=\"声明\"><a class=\"anchor\" href=\"#声明\">#</a> 声明</h1>\n<p>本项目仅用于交流与学习，勿作其他任何形式用途</p>\n",
            "tags": [
                "Web",
                "web"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/10/29/css-Flex%E5%AE%B9%E5%99%A8%E8%AF%AD%E6%B3%95%E8%AE%B0/",
            "url": "https://blog.asxe.vip/2023/10/29/css-Flex%E5%AE%B9%E5%99%A8%E8%AF%AD%E6%B3%95%E8%AE%B0/",
            "title": "css Flex容器语法记",
            "date_published": "2023-10-29T08:35:56.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"正文\"><a class=\"anchor\" href=\"#正文\">#</a> 正文</h2>\n<p><ins>注：设为 Flex 布局以后，子元素的 float、clear 和 vertical-align 属性将失效。</ins></p>\n<h3 id=\"以下6个属性需设置在容器上\"><a class=\"anchor\" href=\"#以下6个属性需设置在容器上\">#</a> 以下 6 个属性需设置在容器上：</h3>\n<ul>\n<li>flex-direction</li>\n<li>flex-wrap</li>\n<li>flex-flow</li>\n<li>justify-content</li>\n<li>align-items</li>\n<li>align-content</li>\n</ul>\n<details class=\"primary\"><summary>flex-direction属性</summary><div>\n<p>flex-direction 属性决定主轴的方向（即项目的排列方向）。</p>\n<ul>\n<li>column-reverse：主轴为垂直方向，起点在下沿。</li>\n<li>column：主轴为垂直方向，起点在上沿。</li>\n<li>row（默认值）：主轴为水平方向，起点在左端。</li>\n<li>row-reverse：主轴为水平方向，起点在右端。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/1.png\" alt=\"1.png\" /></li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>flex-wrap属性</summary><div>\n<p>默认情况下项目都排在一条线（轴线）上。flex-wrap 属性定义若不是一条轴线，如何实现换行。</p>\n<ul>\n<li>nowrap（默认）：不换行。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/2.png\" alt=\"2.png\" /></li>\n<li>wrap：换行，第一行在上方。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/3.png\" alt=\"3.png\" /></li>\n<li>wrap-reverse：换行，第一行在下方。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/4.png\" alt=\"4.png\" /></li>\n</ul>\n</div></details>\n<p><ins>flex-flow 属性是 flex-direction 属性和 flex-wrap 属性的简写形式，默认值为 row nowrap。</ins></p>\n<details class=\"primary\"><summary>justify-content属性</summary><div>\n<p>justify-content 属性定义了项目在主轴上的对齐方式。</p>\n<ul>\n<li>flex-start（默认值）：左对齐</li>\n<li>flex-end：右对齐</li>\n<li>center： 居中</li>\n<li>space-between：两端对齐，项目之间的间隔都相等。</li>\n<li>space-around：每个项目两侧的间隔相等。所以，项目之间的间隔比项目与边框的间隔大一倍。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/5.png\" alt=\"5.png\" /></li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>align-items属性</summary><div>\n<p>align-items 属性定义项目在交叉轴上如何对齐。</p>\n<ul>\n<li>flex-start：交叉轴的起点对齐。</li>\n<li>flex-end：交叉轴的终点对齐。</li>\n<li>center：交叉轴的中点对齐。</li>\n<li>baseline: 项目的第一行文字的基线对齐。</li>\n<li>stretch（默认值）：如果项目未设置高度或设为 auto，将占满整个容器的高度。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/6.png\" alt=\"6.png\" /></li>\n</ul>\n</div></details>\n<details class=\"primary\"><summary>align-content属性</summary><div>\n<p>align-content 属性定义了多根轴线的对齐方式。如果项目只有一根轴线，该属性不起作用。</p>\n<ul>\n<li>flex-start：与交叉轴的起点对齐。</li>\n<li>flex-end：与交叉轴的终点对齐。</li>\n<li>center：与交叉轴的中点对齐。</li>\n<li>space-between：与交叉轴两端对齐，轴线之间的间隔平均分布。</li>\n<li>space-around：每根轴线两侧的间隔都相等。所以，轴线之间的间隔比轴线与边框的间隔大一倍。</li>\n<li>stretch（默认值）：轴线占满整个交叉轴。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/7.png\" alt=\"7.png\" /></li>\n</ul>\n</div></details>\n<h3 id=\"以下6个属性设置在项目上\"><a class=\"anchor\" href=\"#以下6个属性设置在项目上\">#</a> 以下 6 个属性设置在项目上。</h3>\n<ul>\n<li>order</li>\n<li>flex-grow</li>\n<li>flex-shrink</li>\n<li>flex-basis</li>\n<li>flex</li>\n<li>align-self</li>\n</ul>\n<details class=\"primary\"><summary>order属性</summary><div>\n<p>order 属性定义项目的排列顺序。数值越小，排列越靠前，默认为 0。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/8.png\" alt=\"8.png\" /></p>\n</div></details>\n<details class=\"primary\"><summary>flex-grow属性</summary><div>\n<p>flex-grow 属性定义项目的放大比例，默认为 0，即如果存在剩余空间，也不放大。<br />\n如果所有项目的 flex-grow 属性都为 1，则它们将等分剩余空间（如果有的话）。如果一个项目的 flex-grow 属性为 2，其他项目都为 1，则前者占据的剩余空间将比其他项多一倍。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/9.png\" alt=\"9.png\" /></p>\n</div></details>\n<details class=\"primary\"><summary>flex-shrink属性</summary><div>\n<p>flex-shrink 属性定义了项目的缩小比例，默认为 1，即如果空间不足，该项目将缩小。<br />\n如果所有项目的 flex-shrink 属性都为 1，当空间不足时，都将等比例缩小。如果一个项目的 flex-shrink 属性为 0，其他项目都为 1，则空间不足时，前者不缩小。<ins>(负值对该属性无效)</ins><br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/10.png\" alt=\"10.png\" /></p>\n</div></details>\n<details class=\"primary\"><summary>flex-basis属性</summary><div>\n<p>flex-basis 属性定义了在分配多余空间之前，项目占据的主轴空间（main size）。浏览器根据这个属性，计算主轴是否有多余空间。它的默认值为 auto，即项目的本来大小。<br />\n它可以设为跟 width 或 height 属性一样的值（比如 350px），则项目将占据固定空间。</p>\n</div></details>\n<details class=\"primary\"><summary>flex属性</summary><div>\n<p>flex 属性是 flex-grow, flex-shrink 和 flex-basis 的简写，默认值为 0 1 auto。后两个属性可选。<br />\n该属性有两个快捷值：auto (1 1 auto) 和 none (0 0 auto)。<br />\n建议优先使用这个属性，而不是单独写三个分离的属性，因为浏览器会推算相关值。</p>\n</div></details>\n<details class=\"primary\"><summary>align-self属性</summary><div>\n<p>align-self 属性允许单个项目有与其他项目不一样的对齐方式，可覆盖 align-items 属性。默认值为 auto，表示继承父元素的 align-items 属性，如果没有父元素，则等同于 stretch。<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/flex_normal_write/11.png\" alt=\"11.png\" /></p>\n</div></details>\n<p><ins>本文引自<span class=\"exturl\" data-url=\"aHR0cHM6Ly9ydWFueWlmZW5nLmNvbS9ibG9nLzIwMTUvMDcvZmxleC1ncmFtbWFyLmh0bWw=\">阮一峰 - Flex 布局教程：语法篇</span></ins></p>\n",
            "tags": [
                "Web",
                "web",
                "css",
                "flex"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/09/30/%E5%A4%A9%E7%9C%BC%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E-TY-Spider/",
            "url": "https://blog.asxe.vip/2023/09/30/%E5%A4%A9%E7%9C%BC%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E-TY-Spider/",
            "title": "天眼搜索引擎--TY-Spider",
            "date_published": "2023-09-30T06:53:58.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<div class=\"note info\">\n<p>本文最后一次更新时间：2023-11-25</p>\n</div>\n<h1 id=\"地址\"><a class=\"anchor\" href=\"#地址\">#</a> 地址</h1>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L1RZLVNwaWRlcg==\">天眼搜索引擎</span></p>\n<h1 id=\"天眼搜索引擎\"><a class=\"anchor\" href=\"#天眼搜索引擎\">#</a> 天眼搜索引擎</h1>\n<p>百度？谷歌？Bing？或者是其他的？我不知道你有没有思考过一个问题，那就是这些搜 索引擎有没有欺骗你？或许你的心中应该会有答案吧。至少我认为，它们都或多或少的 隐藏了什么。</p>\n<p>最后，我发明了它，<strong>TY Spider</strong>，相比这个名字，我更喜欢叫它天眼搜索引擎。</p>\n<p>天眼搜索引擎是一款轻量级的搜索引擎，你可以很轻松方便的部署在服务器上。</p>\n<h1 id=\"环境配置\"><a class=\"anchor\" href=\"#环境配置\">#</a> 环境配置</h1>\n<ul>\n<li>Python3.10+</li>\n<li>mongodb 数据库</li>\n</ul>\n<h1 id=\"部署\"><a class=\"anchor\" href=\"#部署\">#</a> 部署</h1>\n<ol>\n<li>安装依赖</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>pip <span class=\"token function\">install</span> <span class=\"token parameter variable\">-r</span> requirements.txt</pre></td></tr></table></figure><ol start=\"2\">\n<li>运行启动脚本</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>./run.cmd</pre></td></tr></table></figure><p>访问<strong><span class=\"exturl\" data-url=\"aHR0cDovLzEyNy4wLjAuMToxMzE0\"> http://127.0.0.1:1314</span></strong></p>\n<p>你也可以试着发送一个<strong> post</strong> 请求，像这样<strong><span class=\"exturl\" data-url=\"aHR0cDovLzEyNy4wLjAuMToxMzE0L3NlYXJjaD9xPXRlc3Q=\"> http://127.0.0.1:1314/search?q=test</span></strong>，一定要是<strong> post</strong> 请求噢！！！</p>\n",
            "tags": [
                "Python",
                "python"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/07/10/%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91sign%E5%8F%82%E6%95%B0%E9%80%BB%E8%BE%91/",
            "url": "https://blog.asxe.vip/2023/07/10/%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91sign%E5%8F%82%E6%95%B0%E9%80%BB%E8%BE%91/",
            "title": "百度翻译sign参数逻辑",
            "date_published": "2023-07-10T07:46:33.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"说明\"><a class=\"anchor\" href=\"#说明\">#</a> 说明</h2>\n<p>本文仅讲解百度翻译 sign 参数生成逻辑。</p>\n<h2 id=\"看过来\"><a class=\"anchor\" href=\"#看过来\">#</a> 看过来！</h2>\n<h3 id=\"js分析\"><a class=\"anchor\" href=\"#js分析\">#</a> js 分析</h3>\n<p>先找到 sign 生成的地方然后打上断点<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/baidu_sign/1.png\" alt=\"1.png\" /><br />\n 这个 e 参数就是你输入的文本！不信自己看<br />\n进入 b 方法，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/baidu_sign/2.png\" alt=\"2.png\" /><br />\n<span class=\"label info\"> 注：这个 js 其实是个 webpack，但是我们只需要扣一点逻辑就行了</span><br />\n把这个方法拿下来，然后命名为 sign 方法，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/baidu_sign/3.png\" alt=\"3.png\" /><br />\n 然后调用这个方法随便传个参数进去，看看会怎样<br />\n然后你就看到他报错了！<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/baidu_sign/4.png\" alt=\"4.png\" /><br />\n 报 r 未定义，那么我们就找 r，发现就在上方有个 r 的声明，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/baidu_sign/5.png\" alt=\"5.png\" /><br />\n<span class=\"label info\"> 注：这里是将 r 声明为 null，但是当你将 r 声明为 null 的时候你会发现是会报错的。</span><br />\n我们找到这段代码中用到了 r 的地方，打上断点，查看 r<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/baidu_sign/6.png\" alt=\"6.png\" /><br />\n 多次刷新调试，确定 r 不会变动，直接写死即可<br />\n最后补齐方法，完事！</p>\n<h3 id=\"完整代码\"><a class=\"anchor\" href=\"#完整代码\">#</a> 完整代码</h3>\n<figure class=\"highlight js\"><figcaption data-lang=\"JavaScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">var</span> r <span class=\"token operator\">=</span> <span class=\"token string\">\"320305.131321201\"</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">n</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">t<span class=\"token punctuation\">,</span> e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">+=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>        <span class=\"token keyword\">var</span> r <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>        r <span class=\"token operator\">=</span> <span class=\"token string\">\"a\"</span> <span class=\"token operator\">&lt;=</span> r <span class=\"token operator\">?</span> r<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">87</span> <span class=\"token operator\">:</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>            r <span class=\"token operator\">=</span> <span class=\"token string\">\"+\"</span> <span class=\"token operator\">===</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> t <span class=\"token operator\">>>></span> r <span class=\"token operator\">:</span> t <span class=\"token operator\">&lt;&lt;</span> r<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>            t <span class=\"token operator\">=</span> <span class=\"token string\">\"+\"</span> <span class=\"token operator\">===</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> t <span class=\"token operator\">+</span> r <span class=\"token operator\">&amp;</span> <span class=\"token number\">4294967295</span> <span class=\"token operator\">:</span> t <span class=\"token operator\">^</span> r</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token keyword\">return</span> t</pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">e</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">t<span class=\"token punctuation\">,</span> e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token operator\">==</span> e <span class=\"token operator\">||</span> e <span class=\"token operator\">></span> t<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>e <span class=\"token operator\">=</span> t<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> r <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Array</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">;</span> n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        r<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> t<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token keyword\">return</span> r</pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre></pre></td></tr><tr><td data-num=\"20\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">sign</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">t</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token keyword\">var</span> o<span class=\"token punctuation\">,</span> i <span class=\"token operator\">=</span> t<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">g</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token operator\">===</span> i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>        <span class=\"token keyword\">var</span> a <span class=\"token operator\">=</span> t<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>        a <span class=\"token operator\">></span> <span class=\"token number\">30</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>t <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">.</span><span class=\"token function\">substr</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">.</span><span class=\"token function\">substr</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">.</span><span class=\"token function\">substr</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> s <span class=\"token operator\">=</span> t<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> c <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> u <span class=\"token operator\">=</span> s<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">,</span> l <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> c <span class=\"token operator\">&lt;</span> u<span class=\"token punctuation\">;</span> c<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>            <span class=\"token string\">\"\"</span> <span class=\"token operator\">!==</span> s<span class=\"token punctuation\">[</span>c<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> l<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span>l<span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">t</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Array<span class=\"token punctuation\">.</span><span class=\"token function\">isArray</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>                    <span class=\"token keyword\">return</span> <span class=\"token function\">e</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">(</span>o <span class=\"token operator\">=</span> s<span class=\"token punctuation\">[</span>c<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">t</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"undefined\"</span> <span class=\"token operator\">!=</span> <span class=\"token keyword\">typeof</span> Symbol <span class=\"token operator\">&amp;&amp;</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">!=</span> t<span class=\"token punctuation\">[</span>Symbol<span class=\"token punctuation\">.</span>iterator<span class=\"token punctuation\">]</span> <span class=\"token operator\">||</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">!=</span> t<span class=\"token punctuation\">[</span><span class=\"token string\">\"@@iterator\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>                    <span class=\"token keyword\">return</span> Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">(</span>o<span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">t<span class=\"token punctuation\">,</span> n</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>                    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"string\"</span> <span class=\"token operator\">==</span> <span class=\"token keyword\">typeof</span> t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>                        <span class=\"token keyword\">return</span> <span class=\"token function\">e</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>                    <span class=\"token keyword\">var</span> r <span class=\"token operator\">=</span> <span class=\"token class-name\">Object</span><span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>                    <span class=\"token keyword\">return</span> <span class=\"token string\">\"Object\"</span> <span class=\"token operator\">===</span> r <span class=\"token operator\">&amp;&amp;</span> t<span class=\"token punctuation\">.</span>constructor <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>r <span class=\"token operator\">=</span> t<span class=\"token punctuation\">.</span>constructor<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>                        <span class=\"token keyword\">void</span> <span class=\"token number\">0</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>                <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">(</span>o<span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>                <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TypeError</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>            <span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>            c <span class=\"token operator\">!==</span> u <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">&amp;&amp;</span> l<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">[</span>c<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>        <span class=\"token keyword\">var</span> p <span class=\"token operator\">=</span> l<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>        p <span class=\"token operator\">></span> <span class=\"token number\">30</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>t <span class=\"token operator\">=</span> l<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> l<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>p <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>p <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> l<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> d <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">103</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">116</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">107</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> h <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\".\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> f <span class=\"token operator\">=</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> m <span class=\"token operator\">=</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> g <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> v <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> v <span class=\"token operator\">&lt;</span> t<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> v<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre>        <span class=\"token keyword\">var</span> _ <span class=\"token operator\">=</span> t<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>        _ <span class=\"token operator\">&lt;</span> <span class=\"token number\">128</span> <span class=\"token operator\">?</span> g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> _ <span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>_ <span class=\"token operator\">&lt;</span> <span class=\"token number\">2048</span> <span class=\"token operator\">?</span> g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> _ <span class=\"token operator\">>></span> <span class=\"token number\">6</span> <span class=\"token operator\">|</span> <span class=\"token number\">192</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token number\">55296</span> <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span><span class=\"token number\">64512</span> <span class=\"token operator\">&amp;</span> _<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> v <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">&lt;</span> t<span class=\"token punctuation\">.</span>length <span class=\"token operator\">&amp;&amp;</span> <span class=\"token number\">56320</span> <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span><span class=\"token number\">64512</span> <span class=\"token operator\">&amp;</span> t<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>v <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>_ <span class=\"token operator\">=</span> <span class=\"token number\">65536</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">1023</span> <span class=\"token operator\">&amp;</span> _<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1023</span> <span class=\"token operator\">&amp;</span> t<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span><span class=\"token operator\">++</span>v<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>            g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> _ <span class=\"token operator\">>></span> <span class=\"token number\">18</span> <span class=\"token operator\">|</span> <span class=\"token number\">240</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre>            g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> _ <span class=\"token operator\">>></span> <span class=\"token number\">12</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">63</span> <span class=\"token operator\">|</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> _ <span class=\"token operator\">>></span> <span class=\"token number\">12</span> <span class=\"token operator\">|</span> <span class=\"token number\">224</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre>            g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> _ <span class=\"token operator\">>></span> <span class=\"token number\">6</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">63</span> <span class=\"token operator\">|</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre>            g<span class=\"token punctuation\">[</span>y<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> _ <span class=\"token operator\">|</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> b <span class=\"token operator\">=</span> f<span class=\"token punctuation\">,</span> w <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">43</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">45</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">97</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">94</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">43</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">54</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> k <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">43</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">45</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">51</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">94</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">43</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">98</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">43</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">45</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">102</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> x <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> x <span class=\"token operator\">&lt;</span> g<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> x<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre>        b <span class=\"token operator\">=</span> <span class=\"token function\">n</span><span class=\"token punctuation\">(</span>b <span class=\"token operator\">+=</span> g<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre>    <span class=\"token keyword\">return</span> b <span class=\"token operator\">=</span> <span class=\"token function\">n</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre>    <span class=\"token punctuation\">(</span>b <span class=\"token operator\">^=</span> m<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>b <span class=\"token operator\">=</span> <span class=\"token number\">2147483648</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span><span class=\"token number\">2147483647</span> <span class=\"token operator\">&amp;</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"60\"></td><td><pre>        <span class=\"token string\">\"\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>b <span class=\"token operator\">%=</span> <span class=\"token number\">1e6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\".\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>b <span class=\"token operator\">^</span> f<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"62\"></td><td><pre></pre></td></tr><tr><td data-num=\"63\"></td><td><pre><span class=\"token comment\">//console.log(sign('test'))</span></pre></td></tr></table></figure>",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "js逆向"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/06/12/%E7%83%AF%E7%89%9B%E6%95%B0%E6%8D%AEjs%E9%80%86%E5%90%91/",
            "url": "https://blog.asxe.vip/2023/06/12/%E7%83%AF%E7%89%9B%E6%95%B0%E6%8D%AEjs%E9%80%86%E5%90%91/",
            "title": "烯牛数据js逆向",
            "date_published": "2023-06-12T07:40:55.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"准备\"><a class=\"anchor\" href=\"#准备\">#</a> 准备</h2>\n<p>闲来无事，发篇小帖！<br />\n废话不多说，今天的主角：<span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cueGluaXVkYXRhLmNvbS9pbmR1c3RyeS9uZXdlc3Q/ZnJvbT1kYXRh\">烯牛数据</span></p>\n<h2 id=\"正片\"><a class=\"anchor\" href=\"#正片\">#</a> 正片！</h2>\n<h3 id=\"js加密部分\"><a class=\"anchor\" href=\"#js加密部分\">#</a> js 加密部分</h3>\n<p>找到需要逆向的接口，即：<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/1.png\" alt=\"1.png\" /><br />\n 看看其负载和返回的数据：<br />\n负载<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/2.png\" alt=\"2.png\" /><br />\n 数据<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/3.png\" alt=\"3.png\" /><br />\n 可以看到，负载有两个加密的参数，返回的数据也是加密的，先搞负载！<br />\n跟到栈堆，搜索 sig，可以找到两个，都打上断点，刷新网页，然后便断在了一个点，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/4.png\" alt=\"4.png\" /><br />\n 观察这断代码，可以大致分析出，sig 就是 p，p 调用了一个<span class=\"label info\"> c.e</span> 的函数和 f，f 调用了<span class=\"label info\"> c.c</span> 和<span class=\"label info\"> c.d</span> 以及 l，那么就先拿下来：<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/5.png\" alt=\"5.png\" /><br />\n 现在分析其中的函数是什么，先搞<span class=\"label info\"> c.c</span>，跳转过去发现是一个叫<span class=\"label info\"> e1</span> 的函数<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/6.png\" alt=\"6.png\" /><br />\n 直接拿下来<br />\n<span class=\"label info\"> c.d</span> 也是一样的跳转到一个叫<span class=\"label info\"> e2</span> 的函数，直接拿下来，然后稍微改写下代码<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/7.png\" alt=\"7.png\" /><br />\n 然后搞<span class=\"label info\"> c.e</span>，跳转到一个叫<span class=\"label info\"> sig</span> 的函数，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/8.png\" alt=\"8.png\" /><br />\n 发现是一个 MD5 加密（<span class=\"label warning\">这个就是原版的 MD5，不要问我怎么知道，因为我试过了，所以这里就不分析是不是魔改 MD5 了，其实你跳转过去也会发现这个就是原版的</span>）<br />\n因此直接写个 MD5 实现<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/9.png\" alt=\"9.png\" /><br />\n 最后补补环境，缺啥补啥，然后你看看运行生成的结果和浏览器的结果，肯定是一样的！<br />\n完整代码如下</p>\n<figure class=\"highlight js\"><figcaption data-lang=\"JavaScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">const</span> crypto <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'crypto'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">var</span> _keyStr <span class=\"token operator\">=</span> <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token punctuation\">,</span> _p <span class=\"token operator\">=</span> <span class=\"token string\">\"W5D80NFZHAYB8EUI2T649RT2MNRMVE2O\"</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">md5</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">text</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token keyword\">return</span> crypto<span class=\"token punctuation\">.</span><span class=\"token function\">createHash</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"md5\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">digest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hex\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">sig</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token keyword\">return</span> <span class=\"token function\">md5</span><span class=\"token punctuation\">(</span>e <span class=\"token operator\">+</span> _p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">e1</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token operator\">==</span> e<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> t<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">,</span> r<span class=\"token punctuation\">,</span> o<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> u <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> s <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> s <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        o <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>t <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>s<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>            i <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">3</span> <span class=\"token operator\">&amp;</span> t<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>s<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>            a <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">15</span> <span class=\"token operator\">&amp;</span> n<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>r <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>s<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>            c <span class=\"token operator\">=</span> <span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> r<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>            <span class=\"token function\">isNaN</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> a <span class=\"token operator\">=</span> c <span class=\"token operator\">=</span> <span class=\"token number\">64</span> <span class=\"token operator\">:</span> <span class=\"token function\">isNaN</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>c <span class=\"token operator\">=</span> <span class=\"token number\">64</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>            u <span class=\"token operator\">=</span> u <span class=\"token operator\">+</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>o<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>    <span class=\"token keyword\">return</span> u</pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre></pre></td></tr><tr><td data-num=\"27\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">_u_e</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token operator\">==</span> e<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>    e <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">\\r\\n</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">g</span></span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> t <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token keyword\">var</span> r <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>        r <span class=\"token operator\">&lt;</span> <span class=\"token number\">128</span> <span class=\"token operator\">?</span> t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> r <span class=\"token operator\">></span> <span class=\"token number\">127</span> <span class=\"token operator\">&amp;&amp;</span> r <span class=\"token operator\">&lt;</span> <span class=\"token number\">2048</span> <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>r <span class=\"token operator\">>></span> <span class=\"token number\">6</span> <span class=\"token operator\">|</span> <span class=\"token number\">192</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>            t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> r <span class=\"token operator\">|</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>r <span class=\"token operator\">>></span> <span class=\"token number\">12</span> <span class=\"token operator\">|</span> <span class=\"token number\">224</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>            t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>r <span class=\"token operator\">>></span> <span class=\"token number\">6</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">63</span> <span class=\"token operator\">|</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>            t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> r <span class=\"token operator\">|</span> <span class=\"token number\">128</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>    <span class=\"token keyword\">return</span> t</pre></td></tr><tr><td data-num=\"39\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre></pre></td></tr><tr><td data-num=\"41\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">e2</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span>e <span class=\"token operator\">=</span> <span class=\"token function\">_u_e</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>        <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> t <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>        <span class=\"token keyword\">var</span> r <span class=\"token operator\">=</span> _p<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">%</span> _p<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>        t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span> <span class=\"token operator\">^</span> r<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre>    <span class=\"token keyword\">return</span> t</pre></td></tr><tr><td data-num=\"49\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre></pre></td></tr><tr><td data-num=\"51\"></td><td><pre><span class=\"token keyword\">var</span> n <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre>    <span class=\"token string-property property\">\"payload\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre>        <span class=\"token string-property property\">\"sort\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\">//1 为最近热门，2 为最近更新</span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre>        <span class=\"token string-property property\">\"start\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\">// 每次 + 20</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre>        <span class=\"token string-property property\">\"limit\"</span><span class=\"token operator\">:</span> <span class=\"token number\">20</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre><span class=\"token keyword\">var</span> s <span class=\"token operator\">=</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre><span class=\"token keyword\">var</span> l <span class=\"token operator\">=</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">parse</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"60\"></td><td><pre><span class=\"token keyword\">var</span> f <span class=\"token operator\">=</span> <span class=\"token function\">Object</span><span class=\"token punctuation\">(</span>e1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token function\">Object</span><span class=\"token punctuation\">(</span>e2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>l<span class=\"token punctuation\">.</span>payload<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre><span class=\"token keyword\">var</span> p <span class=\"token operator\">=</span> <span class=\"token function\">Object</span><span class=\"token punctuation\">(</span>sig<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>f<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"62\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>f<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"63\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"js解密部分\"><a class=\"anchor\" href=\"#js解密部分\">#</a> js 解密部分</h3>\n<p>现在搞返回的数据解密，先观察观察返回的数据，一个 code，一个 d，一个 v。如果是你，你要怎么搜索？该不会搜索 d 吧？那还不得亖啊，全篇都是 d，因此我们直接搜 code，因为这也是它返回的数据。<br />\n然后我们就发现刚刚加密的下面就有个 code，而且下面还跟着一个<span class=\"label warning\"> JSON.parse</span><br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/10.png\" alt=\"10.png\" /><br />\n 如果是你，你会不会看这个地方？<br />\n我们直接打上断点，刷新，然后看看这个 v 是个啥<br />\n断住后在控制台输入 v<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/11.png\" alt=\"11.png\" /><br />\n 这个 v 不就是我们要的明文数据吗？<br />\n直接开扣<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/12.png\" alt=\"12.png\" /><br />\n<span class=\"label danger\"> 注：l 就是返回数据里的 d，不信你自己看哈哈哈</span><br />\n然后扣出<span class=\"label info\"> c.a</span> 和<span class=\"label info\"> c.b</span><br />\n<span class=\"label info\">c.a</span> 就是<span class=\"label info\"> d1</span>，<span class=\"label info\">c.b</span> 就是<span class=\"label info\"> d2</span><br />\n 然后缺啥补啥，运行看看结果，没问题的！<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/xi_niu/13.png\" alt=\"13.png\" /><br />\n 完整代码</p>\n<figure class=\"highlight js\"><figcaption data-lang=\"JavaScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">var</span> l <span class=\"token operator\">=</span> <span class=\"token string\">\"这里放加密的结果\"</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">var</span> _keyStr <span class=\"token operator\">=</span> <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>    <span class=\"token punctuation\">,</span> _p <span class=\"token operator\">=</span> <span class=\"token string\">\"W5D80NFZHAYB8EUI2T649RT2MNRMVE2O\"</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">d1</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    <span class=\"token keyword\">var</span> t<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">,</span> r<span class=\"token punctuation\">,</span> o<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> c <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> u <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>e <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">[^A-Za-z0-9\\+\\/\\=]</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">g</span></span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> u <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        t <span class=\"token operator\">=</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>u<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>o <span class=\"token operator\">=</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>u<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>            n <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">15</span> <span class=\"token operator\">&amp;</span> o<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>u<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>            r <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">3</span> <span class=\"token operator\">&amp;</span> i<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">6</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">=</span> _keyStr<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">charAt</span><span class=\"token punctuation\">(</span>u<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>            c <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        <span class=\"token number\">64</span> <span class=\"token operator\">!=</span> i <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>c <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token number\">64</span> <span class=\"token operator\">!=</span> a <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>c <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token keyword\">return</span> c</pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">d2</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> t <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>        <span class=\"token keyword\">var</span> r <span class=\"token operator\">=</span> _p<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">%</span> _p<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>        t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span> <span class=\"token operator\">^</span> r<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token keyword\">return</span> t <span class=\"token operator\">=</span> <span class=\"token function\">_u_d</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre></pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token keyword\">function</span> <span class=\"token function\">_u_d</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> t <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> n <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> r <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> o <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> n <span class=\"token operator\">&lt;</span> e<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>        <span class=\"token punctuation\">(</span>r <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> <span class=\"token number\">128</span> <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>            n<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> r <span class=\"token operator\">></span> <span class=\"token number\">191</span> <span class=\"token operator\">&amp;&amp;</span> r <span class=\"token operator\">&lt;</span> <span class=\"token number\">224</span> <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>o <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>            t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">31</span> <span class=\"token operator\">&amp;</span> r<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">6</span> <span class=\"token operator\">|</span> <span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> o<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>            n <span class=\"token operator\">+=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>o <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>            i <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>            t <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">15</span> <span class=\"token operator\">&amp;</span> r<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">12</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span><span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> o<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">6</span> <span class=\"token operator\">|</span> <span class=\"token number\">63</span> <span class=\"token operator\">&amp;</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>            n <span class=\"token operator\">+=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>    <span class=\"token keyword\">return</span> t</pre></td></tr><tr><td data-num=\"35\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre></pre></td></tr><tr><td data-num=\"37\"></td><td><pre><span class=\"token keyword\">var</span> d <span class=\"token operator\">=</span> <span class=\"token function\">Object</span><span class=\"token punctuation\">(</span>d1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>l<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>    <span class=\"token punctuation\">,</span> v <span class=\"token operator\">=</span> <span class=\"token function\">Object</span><span class=\"token punctuation\">(</span>d2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>d<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span></pre></td></tr></table></figure>",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "爬虫",
                "js逆向"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/05/28/%E7%8C%BF%E4%BA%BA%E5%AD%A6%E7%AC%AC%E4%BA%8C%E5%B1%8A%E7%AC%AC%E4%B8%80%E9%A2%98-%E5%88%9D%E8%AF%86/",
            "url": "https://blog.asxe.vip/2023/05/28/%E7%8C%BF%E4%BA%BA%E5%AD%A6%E7%AC%AC%E4%BA%8C%E5%B1%8A%E7%AC%AC%E4%B8%80%E9%A2%98-%E5%88%9D%E8%AF%86/",
            "title": "猿人学第二届第一题-初识",
            "date_published": "2023-05-28T03:29:01.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"开篇\"><a class=\"anchor\" href=\"#开篇\">#</a> 开篇</h2>\n<p>猿人学第二届已于 2023 年 5 月 19 开始，目前赛事已结束，来看看题？</p>\n<h2 id=\"正文\"><a class=\"anchor\" href=\"#正文\">#</a> 正文</h2>\n<h3 id=\"加密分析\"><a class=\"anchor\" href=\"#加密分析\">#</a> 加密分析</h3>\n<p>F12 请求一下页面，找到 api，直接观察其负载，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/1.png\" alt=\"1.png\" /><br />\n 可以发现有三个参数，分别是 page（当前页数），token，now（或许是时间戳？）<br />\n废话不多说，直接看它的发起程序，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/2.png\" alt=\"2.png\" /><br />\n 第一个和第二个是 send 和 ajax，这里已经属于发送了，直接点第三个<br />\n可以清晰的看到这三个参数：<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/3.png\" alt=\"3.png\" /><br />\n 可以知道，page 是当前页数，now 是当前时间戳，token 则是进行了一个什么 MD5 加密<br />\n但是！这个 MD5 不是普通的 MD5，它是经过了魔改的，因此打上断点，转到其生成的地方看看<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/4.png\" alt=\"4.png\" /><br />\n 我们把这里面的所有代码复制拿出来<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/5.png\" alt=\"5.png\" /><br />\n 简单分析发现这是个类似<span class=\"label info\"> webpack</span> 的一段代码，是自执行的<br />\n那么我们就执行一下这段代码，看看会发生什么<br />\n结果报错了，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/6.png\" alt=\"6.png\" /><br />\n 我们转到报错位置<br />\n发现这是个 i 函数发起的报错，i 函数的上面则是一堆检测 h 值的东西，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/7.png\" alt=\"7.png\" /><br />\nide 显示这个 i 函数只有一个调用用法，那么去浏览器打上断点看看这个 i 返回的到底是个什么<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/8.png\" alt=\"8.png\" /><br />\n 进入控制台，输入 i () 看看 i 返回的什么<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/9.png\" alt=\"9.png\" /><br />\n 可以看到，i () 就是第一个 return 返回的值，那么我们便可以直接将 i 函数进行改写，并将上面的一个检测 h 值的删掉，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/10.png\" alt=\"10.png\" /><br />\n 然后继续执行，又报错<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/11.jpg\" alt=\"11.jpg\" /><br />\n 跳转查看，发现原来是 Ajax 啊，那直接把这段给删了，因为这里是属于发送了，我们用不着。<br />\n然后在上面打印一下这个 j，可以看到 j 已经生成了，但是，现在生成的并不是准确的（你自己拿个浏览器的时间戳固定后看看你的和浏览器生成的是否一样就知道了，这里不演示，只讲如何去掉环境检测）</p>\n<h3 id=\"去除检测\"><a class=\"anchor\" href=\"#去除检测\">#</a> 去除检测</h3>\n<p>一般常见的浏览器环境检测是：<span class=\"label info\">window,document,global,navigator,location 以及 node 环境检测</span><br />\n这里我们便一个一个找<br />\n先 window，这里有一处，还有个三元表达式，这种如何修改？直接浏览器打上断点，然后看第一个值是 true 还是 false，将第一个值修改后，pycharm 便会提示简化，简化即可。（这里<span class=\"label info\"> window 对象肯定是存在的</span>，直接改成 true 然后简化就行了）<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/12.png\" alt=\"12.png\" /><br />\n 修改后<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/13.png\" alt=\"13.png\" /><br />\n 然后 document，这里有一处<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/14.png\" alt=\"14.png\" /><br />\n 直接浏览器打上断点<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/15.png\" alt=\"15.png\" /><br />\n 简化修改后<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/16.png\" alt=\"16.png\" /><br />\n 其他的几个值也用这种方法操作，唯有一处我要提示一下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/17.png\" alt=\"17.png\" /><br />\n 这个地方简化后得到的是 self，而在浏览器中选中这一段显示的确实 window，原因是 node 环境中是不存在 self 的，浏览器环境中 self 就是 window 对象，因此直接改成 window 就行了，如下（记得在全局中添加 window = {}）<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/yuanrenxue_two_one/18.png\" alt=\"18.png\" /><br />\n 环境补完后，就可以生成正确的值了，下面是完整 js 代码</p>\n<h3 id=\"完整js代码\"><a class=\"anchor\" href=\"#完整js代码\">#</a> 完整 js 代码</h3>\n<p>代码过长，无法高亮显示，有问题请在评论区提出。</p>\n<pre><code class=\"language-JavaScript\">var asxe;\nwindow = &#123;&#125;;\n\n(function () &#123;\n    function a(b, c, d) &#123;\n        function f(j, k) &#123;\n            if (!c[j]) &#123;\n                if (!b[j]) &#123;\n                    var l = 'function' == typeof require &amp;&amp; require;\n                    if (!k &amp;&amp; l)\n                        return l(j, !0x0);\n                    if (g)\n                        return g(j, !0x0);\n                    var m = new Error('Cannot\\x20find\\x20module\\x20\\x27' + j + '\\x27');\n                    throw m['code'] = 'MODULE_NOT_FOUND',\n                        m;\n                &#125;\n                var q = c[j] = &#123;\n                    'exports': &#123;&#125;\n                &#125;;\n                b[j][0x0]['call'](q['exports'], function (s) &#123;\n                    var v = b[j][0x1][s];\n                    return f(v || s);\n                &#125;, q, q['exports'], a, b, c, d);\n            &#125;\n            return c[j]['exports'];\n        &#125;\n\n        for (var g = 'function' == typeof require &amp;&amp; require, h = 0x0; h &lt; d['length']; h++)\n            f(d[h]);\n        return f;\n    &#125;\n\n    return a;\n&#125;()(&#123;\n    0x1: [function (a, b, c) &#123;\n    &#125;\n        , &#123;&#125;],\n    0x2: [function (a, b, c) &#123;\n        call = function (d) &#123;\n            asxe = a; //这里设置全局变量为a函数，方便调用，因为要传入一个page!\n        &#125;\n            ,\n            call(0x1);\n    &#125;\n        , &#123;\n            'crypto-js': 0xc\n        &#125;],\n    0x3: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./enc-base64'), a('./md5'), a('./evpkdf'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './enc-base64', './md5', './evpkdf', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['BlockCipher']\n                    , h = e['algo']\n                    , i = []\n                    , j = []\n                    , k = []\n                    , l = []\n                    , m = []\n                    , n = []\n                    , o = []\n                    , p = []\n                    , q = []\n                    , r = [];\n                (function () &#123;\n                    var u = [];\n                    for (var v = 0x0; v &lt; 0x100; v++) &#123;\n                        v &lt; 0x80 ? u[v] = v &lt;&lt; 0x1 : u[v] = v &lt;&lt; 0x1 ^ 0x11b;\n                    &#125;\n                    var w = 0x0\n                        , y = 0x0;\n                    for (var v = 0x0; v &lt; 0x100; v++) &#123;\n                        var z = y ^ y &lt;&lt; 0x1 ^ y &lt;&lt; 0x2 ^ y &lt;&lt; 0x3 ^ y &lt;&lt; 0x4;\n                        z = z &gt;&gt;&gt; 0x8 ^ z &amp; 0xff ^ 0x63,\n                            i[w] = z,\n                            j[z] = w;\n                        var A = u[w]\n                            , B = u[A]\n                            , D = u[B]\n                            , E = u[z] * 0x101 ^ z * 0x1010100;\n                        k[w] = E &lt;&lt; 0x18 | E &gt;&gt;&gt; 0x8,\n                            l[w] = E &lt;&lt; 0x10 | E &gt;&gt;&gt; 0x10,\n                            m[w] = E &lt;&lt; 0x8 | E &gt;&gt;&gt; 0x18,\n                            n[w] = E;\n                        var E = D * 0x1010101 ^ B * 0x10001 ^ A * 0x101 ^ w * 0x1010100;\n                        o[z] = E &lt;&lt; 0x18 | E &gt;&gt;&gt; 0x8,\n                            p[z] = E &lt;&lt; 0x10 | E &gt;&gt;&gt; 0x10,\n                            q[z] = E &lt;&lt; 0x8 | E &gt;&gt;&gt; 0x18,\n                            r[z] = E,\n                            !w ? w = y = 0x1 : (w = A ^ u[u[u[D ^ A]]],\n                                y ^= u[u[y]]);\n                    &#125;\n                &#125;());\n                var s = [0x0, 0x1, 0x2, 0x4, 0x80, 0x1b, 0x36, 0x8, 0x10, 0x20, 0x40]\n                    , t = h['AES'] = g['extend'](&#123;\n                    '_doReset': function () &#123;\n                        var u;\n                        if (this['_nRounds'] &amp;&amp; this['_keyPriorReset'] === this['_key'])\n                            return;\n                        var v = this['_keyPriorReset'] = this['_key']\n                            , w = v['words']\n                            , x = v['sigBytes'] / 0x4\n                            , y = this['_nRounds'] = x + 0x6\n                            , z = (y + 0x1) * 0x4\n                            , A = this['_keySchedule'] = [];\n                        for (var B = 0x0; B &lt; z; B++) &#123;\n                            if (B &lt; x)\n                                A[B] = w[B];\n                            else &#123;\n                                u = A[B - 0x1];\n                                if (!(B % x))\n                                    u = u &lt;&lt; 0x8 | u &gt;&gt;&gt; 0x18,\n                                        u = i[u &gt;&gt;&gt; 0x18] &lt;&lt; 0x18 | i[u &gt;&gt;&gt; 0x10 &amp; 0xff] &lt;&lt; 0x10 | i[u &gt;&gt;&gt; 0x8 &amp; 0xff] &lt;&lt; 0x8 | i[u &amp; 0xff],\n                                        u ^= s[B / x | 0x0] &lt;&lt; 0x18;\n                                else\n                                    x &gt; 0x6 &amp;&amp; B % x == 0x4 &amp;&amp; (u = i[u &gt;&gt;&gt; 0x1a] &lt;&lt; 0x18 | i[u &gt;&gt;&gt; 0x10 &amp; 0xff] &lt;&lt; 0x10 | i[u &gt;&gt;&gt; 0x8 &amp; 0xff] &lt;&lt; 0x8 | i[u &amp; 0xff]);\n                                A[B] = A[B - x] ^ u;\n                            &#125;\n                        &#125;\n                        var D = this['_invKeySchedule'] = [];\n                        for (var E = 0x0; E &lt; z; E++) &#123;\n                            var B = z - E;\n                            if (E % 0x4)\n                                var u = A[B];\n                            else\n                                var u = A[B - 0x4];\n                            E &lt; 0x4 || B &lt;= 0x4 ? D[E] = u : D[E] = o[i[u &gt;&gt;&gt; 0x18]] ^ p[i[u &gt;&gt;&gt; 0x10 &amp; 0xff]] ^ q[i[u &gt;&gt;&gt; 0x8 &amp; 0xff]] ^ r[i[u &amp; 0xff]];\n                        &#125;\n                    &#125;,\n                    'encryptBlock': function (u, v) &#123;\n                        this['_doCryptBlock'](u, v, this['_keySchedule'], k, l, m, n, i);\n                    &#125;,\n                    'decryptBlock': function (u, v) &#123;\n                        var w = u[v + 0x1];\n                        u[v + 0x1] = u[v + 0x3],\n                            u[v + 0x3] = w,\n                            this['_doCryptBlock'](u, v, this['_invKeySchedule'], o, p, q, r, j);\n                        var w = u[v + 0x1];\n                        u[v + 0x1] = u[v + 0x3],\n                            u[v + 0x3] = w;\n                    &#125;,\n                    '_doCryptBlock': function (u, v, w, x, y, z, A, B) &#123;\n                        var D = this['_nRounds']\n                            , E = u[v] ^ w[0x0]\n                            , F = u[v + 0x1] ^ w[0x1]\n                            , G = u[v + 0x2] ^ w[0x2]\n                            , H = u[v + 0x3] ^ w[0x3]\n                            , I = 0x4;\n                        for (var J = 0x1; J &lt; D; J++) &#123;\n                            var K = x[E &gt;&gt;&gt; 0x18] ^ y[F &gt;&gt;&gt; 0x10 &amp; 0xff] ^ z[G &gt;&gt;&gt; 0x8 &amp; 0xff] ^ A[H &amp; 0xff] ^ w[I++]\n                                , L = x[F &gt;&gt;&gt; 0x18] ^ y[G &gt;&gt;&gt; 0x10 &amp; 0xff] ^ z[H &gt;&gt;&gt; 0x8 &amp; 0xff] ^ A[E &amp; 0xff] ^ w[I++]\n                                , N = x[G &gt;&gt;&gt; 0x18] ^ y[H &gt;&gt;&gt; 0x10 &amp; 0xff] ^ z[E &gt;&gt;&gt; 0x8 &amp; 0xff] ^ A[F &amp; 0xff] ^ w[I++]\n                                , O = x[H &gt;&gt;&gt; 0x18] ^ y[E &gt;&gt;&gt; 0x10 &amp; 0xff] ^ z[F &gt;&gt;&gt; 0x8 &amp; 0xff] ^ A[G &amp; 0xff] ^ w[I++];\n                            E = K,\n                                F = L,\n                                G = N,\n                                H = O;\n                        &#125;\n                        var K = (B[E &gt;&gt;&gt; 0x18] &lt;&lt; 0x18 | B[F &gt;&gt;&gt; 0x10 &amp; 0xff] &lt;&lt; 0x10 | B[G &gt;&gt;&gt; 0x8 &amp; 0xff] &lt;&lt; 0x8 | B[H &amp; 0xff]) ^ w[I++]\n                            ,\n                            L = (B[F &gt;&gt;&gt; 0x18] &lt;&lt; 0x18 | B[G &gt;&gt;&gt; 0x10 &amp; 0xff] &lt;&lt; 0x10 | B[H &gt;&gt;&gt; 0x8 &amp; 0xff] &lt;&lt; 0x8 | B[E &amp; 0xff]) ^ w[I++]\n                            ,\n                            N = (B[G &gt;&gt;&gt; 0x18] &lt;&lt; 0x18 | B[H &gt;&gt;&gt; 0x10 &amp; 0xff] &lt;&lt; 0x10 | B[E &gt;&gt;&gt; 0x8 &amp; 0xff] &lt;&lt; 0x8 | B[F &amp; 0xff]) ^ w[I++]\n                            ,\n                            O = (B[H &gt;&gt;&gt; 0x18] &lt;&lt; 0x18 | B[E &gt;&gt;&gt; 0x10 &amp; 0xff] &lt;&lt; 0x10 | B[F &gt;&gt;&gt; 0x8 &amp; 0xff] &lt;&lt; 0x8 | B[G &amp; 0xff]) ^ w[I++];\n                        u[v] = K,\n                            u[v + 0x1] = L,\n                            u[v + 0x2] = N,\n                            u[v + 0x3] = O;\n                    &#125;,\n                    'keySize': 0x100 / 0x20\n                &#125;);\n                e['AES'] = g['_createHelper'](t);\n            &#125;()),\n                d['AES'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5,\n            './enc-base64': 0x6,\n            './evpkdf': 0x9,\n            './md5': 0xe\n        &#125;],\n    0x4: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./evpkdf'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './evpkdf'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            d['lib']['Cipher'] || function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['Base']\n                    , i = g['WordArray']\n                    , j = g['BufferedBlockAlgorithm']\n                    , k = f['enc']\n                    , l = k['Utf8']\n                    , m = k['Base64']\n                    , n = f['algo']\n                    , o = n['EvpKDF']\n                    , p = g['Cipher'] = j['extend'](&#123;\n                    'cfg': h['extend'](),\n                    'createEncryptor': function (F, G) &#123;\n                        return this['create'](this['_ENC_XFORM_MODE'], F, G);\n                    &#125;,\n                    'createDecryptor': function (F, G) &#123;\n                        return this['create'](this['_DEC_XFORM_MODE'], F, G);\n                    &#125;,\n                    'init': function (F, G, H) &#123;\n                        this['cfg'] = this['cfg']['extend'](H),\n                            this['_xformMode'] = F,\n                            this['_key'] = G,\n                            this['reset']();\n                    &#125;,\n                    'reset': function () &#123;\n                        j['reset']['call'](this),\n                            this['_doReset']();\n                    &#125;,\n                    'process': function (F) &#123;\n                        return this['_append'](F),\n                            this['_process']();\n                    &#125;,\n                    'finalize': function (F) &#123;\n                        F &amp;&amp; this['_append'](F);\n                        var G = this['_doFinalize']();\n                        return G;\n                    &#125;,\n                    'keySize': 0x80 / 0x20,\n                    'ivSize': 0x80 / 0x20,\n                    '_ENC_XFORM_MODE': 0x1,\n                    '_DEC_XFORM_MODE': 0x2,\n                    '_createHelper': (function () &#123;\n                        function F(G) &#123;\n                            return typeof G == 'string' ? E : A;\n                        &#125;\n\n                        return function (G) &#123;\n                            return &#123;\n                                'encrypt': function (H, I, J) &#123;\n                                    return F(I)['encrypt'](G, H, I, J);\n                                &#125;,\n                                'decrypt': function (H, I, J) &#123;\n                                    return F(I)['decrypt'](G, H, I, J);\n                                &#125;\n                            &#125;;\n                        &#125;\n                            ;\n                    &#125;())\n                &#125;)\n                    , q = g['StreamCipher'] = p['extend'](&#123;\n                    '_doFinalize': function () &#123;\n                        var F = this['_process'](!!'flush');\n                        return F;\n                    &#125;,\n                    'blockSize': 0x1\n                &#125;)\n                    , r = f['mode'] = &#123;&#125;\n                    , s = g['BlockCipherMode'] = h['extend'](&#123;\n                    'createEncryptor': function (F, G) &#123;\n                        return this['Encryptor']['create'](F, G);\n                    &#125;,\n                    'createDecryptor': function (F, G) &#123;\n                        return this['Decryptor']['create'](F, G);\n                    &#125;,\n                    'init': function (F, G) &#123;\n                        this['_cipher'] = F,\n                            this['_iv'] = G;\n                    &#125;\n                &#125;)\n                    , t = r['CBC'] = (function () &#123;\n                    var F = s['extend']();\n                    F['Encryptor'] = F['extend'](&#123;\n                        'processBlock': function (H, I) &#123;\n                            var J = this['_cipher']\n                                , K = J['blockSize'];\n                            G['call'](this, H, I, K),\n                                J['encryptBlock'](H, I),\n                                this['_prevBlock'] = H['slice'](I, I + K);\n                        &#125;\n                    &#125;),\n                        F['Decryptor'] = F['extend'](&#123;\n                            'processBlock': function (H, I) &#123;\n                                var J = this['_cipher']\n                                    , K = J['blockSize']\n                                    , L = H['slice'](I, I + K);\n                                J['decryptBlock'](H, I),\n                                    G['call'](this, H, I, K),\n                                    this['_prevBlock'] = L;\n                            &#125;\n                        &#125;);\n\n                    function G(H, I, J) &#123;\n                        var K, L = this['_iv'];\n                        L ? (K = L,\n                            this['_iv'] = e) : K = this['_prevBlock'];\n                        for (var M = 0x0; M &lt; J; M++) &#123;\n                            H[I + M] ^= K[M];\n                        &#125;\n                    &#125;\n\n                    return F;\n                &#125;())\n                    , u = f['pad'] = &#123;&#125;\n                    , v = u['Pkcs7'] = &#123;\n                    'pad': function (F, G) &#123;\n                        var H = G * 0x4\n                            , I = H - F['sigBytes'] % H\n                            , J = I &lt;&lt; 0x18 | I &lt;&lt; 0x10 | I &lt;&lt; 0x8 | I\n                            , K = [];\n                        for (var L = 0x0; L &lt; I; L += 0x4) &#123;\n                            K['push'](J);\n                        &#125;\n                        var M = i['create'](K, I);\n                        F['concat'](M);\n                    &#125;,\n                    'unpad': function (F) &#123;\n                        var G = F['words'][F['sigBytes'] - 0x1 &gt;&gt;&gt; 0x2] &amp; 0xff;\n                        F['sigBytes'] -= G;\n                    &#125;\n                &#125;\n                    , w = g['BlockCipher'] = p['extend'](&#123;\n                    'cfg': p['cfg']['extend'](&#123;\n                        'mode': t,\n                        'padding': v\n                    &#125;),\n                    'reset': function () &#123;\n                        var F;\n                        p['reset']['call'](this);\n                        var G = this['cfg']\n                            , H = G['iv']\n                            , I = G['mode'];\n                        this['_xformMode'] == this['_ENC_XFORM_MODE'] ? F = I['createEncryptor'] : (F = I['createDecryptor'],\n                            this['_minBufferSize'] = 0x1),\n                            this['_mode'] &amp;&amp; this['_mode']['__creator'] == F ? this['_mode']['init'](this, H &amp;&amp; H['words']) : (this['_mode'] = F['call'](I, this, H &amp;&amp; H['words']),\n                                this['_mode']['__creator'] = F);\n                    &#125;,\n                    '_doProcessBlock': function (F, G) &#123;\n                        this['_mode']['processBlock'](F, G);\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var F, G = this['cfg']['padding'];\n                        return this['_xformMode'] == this['_ENC_XFORM_MODE'] ? (G['pad'](this['_data'], this['blockSize']),\n                            F = this['_process'](!!'flush')) : (F = this['_process'](!!'flush'),\n                            G['unpad'](F)),\n                            F;\n                    &#125;,\n                    'blockSize': 0x80 / 0x20\n                &#125;)\n                    , x = g['CipherParams'] = h['extend'](&#123;\n                    'init': function (F) &#123;\n                        this['mixIn'](F);\n                    &#125;,\n                    'toString': function (F) &#123;\n                        return (F || this['formatter'])['stringify'](this);\n                    &#125;\n                &#125;)\n                    , y = f['format'] = &#123;&#125;\n                    , z = y['OpenSSL'] = &#123;\n                    'stringify': function (F) &#123;\n                        var G, H = F['ciphertext'], I = F['salt'];\n                        return I ? G = i['create']([0x53616c74, 0x65645f5f])['concat'](I)['concat'](H) : G = H,\n                            G['toString'](m);\n                    &#125;,\n                    'parse': function (F) &#123;\n                        var G, H = m['parse'](F), I = H['words'];\n                        return I[0x0] == 0x53616c74 &amp;&amp; I[0x1] == 0x65645f5f &amp;&amp; (G = i['create'](I['slice'](0x2, 0x4)),\n                            I['splice'](0x0, 0x4),\n                            H['sigBytes'] -= 0x10),\n                            x['create'](&#123;\n                                'ciphertext': H,\n                                'salt': G\n                            &#125;);\n                    &#125;\n                &#125;\n                    , A = g['SerializableCipher'] = h['extend'](&#123;\n                    'cfg': h['extend'](&#123;\n                        'format': z\n                    &#125;),\n                    'encrypt': function (F, G, H, I) &#123;\n                        I = this['cfg']['extend'](I);\n                        var J = F['createEncryptor'](H, I)\n                            , K = J['finalize'](G)\n                            , L = J['cfg'];\n                        return x['create'](&#123;\n                            'ciphertext': K,\n                            'key': H,\n                            'iv': L['iv'],\n                            'algorithm': F,\n                            'mode': L['mode'],\n                            'padding': L['padding'],\n                            'blockSize': F['blockSize'],\n                            'formatter': I['format']\n                        &#125;);\n                    &#125;,\n                    'decrypt': function (F, G, H, I) &#123;\n                        I = this['cfg']['extend'](I),\n                            G = this['_parse'](G, I['format']);\n                        var J = F['createDecryptor'](H, I)['finalize'](G['ciphertext']);\n                        return J;\n                    &#125;,\n                    '_parse': function (F, G) &#123;\n                        return typeof F == 'string' ? G['parse'](F, this) : F;\n                    &#125;\n                &#125;)\n                    , B = f['kdf'] = &#123;&#125;\n                    , D = B['OpenSSL'] = &#123;\n                    'execute': function (F, G, H, I) &#123;\n                        !I &amp;&amp; (I = i['random'](0x40 / 0x8));\n                        var J = o['create'](&#123;\n                            'keySize': G + H\n                        &#125;)['compute'](F, I)\n                            , K = i['create'](J['words']['slice'](G), H * 0x4);\n                        return J['sigBytes'] = G * 0x4,\n                            x['create'](&#123;\n                                'key': J,\n                                'iv': K,\n                                'salt': I\n                            &#125;);\n                    &#125;\n                &#125;\n                    , E = g['PasswordBasedCipher'] = A['extend'](&#123;\n                    'cfg': A['cfg']['extend'](&#123;\n                        'kdf': D\n                    &#125;),\n                    'encrypt': function (F, G, H, I) &#123;\n                        I = this['cfg']['extend'](I);\n                        var J = I['kdf']['execute'](H, F['keySize'], F['ivSize']);\n                        I['iv'] = J['iv'];\n                        var K = A['encrypt']['call'](this, F, G, J['key'], I);\n                        return K['mixIn'](J),\n                            K;\n                    &#125;,\n                    'decrypt': function (F, G, H, I) &#123;\n                        I = this['cfg']['extend'](I),\n                            G = this['_parse'](G, I['format']);\n                        var J = I['kdf']['execute'](H, F['keySize'], F['ivSize'], G['salt']);\n                        I['iv'] = J['iv'];\n                        var K = A['decrypt']['call'](this, F, G, J['key'], I);\n                        return K;\n                    &#125;\n                &#125;);\n            &#125;();\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './evpkdf': 0x9\n        &#125;],\n    0x5: [function (a, b, c) &#123;\n        (function (d) &#123;\n            (function () &#123;\n                ;(function (e, f) &#123;\n                    if (typeof c === 'object')\n                        b['exports'] = c = f();\n                    else\n                        typeof define === 'function' &amp;&amp; define['amd'] ? define([], f) : e['CryptoJS'] = f();\n                &#125;(this, function () &#123;\n                    var e = e || function (f, g) &#123;\n                        var i = function () &#123;\n                            return 3145111887\n                        &#125;\n                            , j = Object['create'] || (function () &#123;\n                            function w() &#123;\n                            &#125;\n\n                            return function (x) &#123;\n                                var y;\n                                return w['prototype'] = x,\n                                    y = new w(),\n                                    w['prototype'] = null,\n                                    y;\n                            &#125;\n                                ;\n                        &#125;())\n                            , k = &#123;&#125;\n                            , l = k['lib'] = &#123;&#125;\n                            , m = l['Base'] = (function () &#123;\n                            return &#123;\n                                'extend': function (w) &#123;\n                                    var x = j(this);\n                                    return w &amp;&amp; x['mixIn'](w),\n                                    (!x['hasOwnProperty']('init') || this['init'] === x['init']) &amp;&amp; (x['init'] = function () &#123;\n                                            x['$super']['init']['apply'](this, arguments);\n                                        &#125;\n                                    ),\n                                        x['init']['prototype'] = x,\n                                        x['$super'] = this,\n                                        x;\n                                &#125;,\n                                'create': function () &#123;\n                                    var w = this['extend']();\n                                    return w['init']['apply'](w, arguments),\n                                        w;\n                                &#125;,\n                                'init': function () &#123;\n                                &#125;,\n                                'mixIn': function (w) &#123;\n                                    for (var x in w) &#123;\n                                        w['hasOwnProperty'](x) &amp;&amp; (this[x] = w[x]);\n                                    &#125;\n                                    w['hasOwnProperty']('toString') &amp;&amp; (this['toString'] = w['toString']);\n                                &#125;,\n                                'clone': function () &#123;\n                                    return this['init']['prototype']['extend'](this);\n                                &#125;\n                            &#125;;\n                        &#125;())\n                            , n = l['WordArray'] = m['extend'](&#123;\n                            'init': function (w, x) &#123;\n                                w = this['words'] = w || [],\n                                    x != g ? this['sigBytes'] = x : this['sigBytes'] = w['length'] * 0x4;\n                            &#125;,\n                            'toString': function (w) &#123;\n                                return (w || p)['stringify'](this);\n                            &#125;,\n                            'concat': function (w) &#123;\n                                var x = this['words']\n                                    , y = w['words']\n                                    , z = this['sigBytes']\n                                    , A = w['sigBytes'];\n                                this['clamp']();\n                                if (z % 0x4)\n                                    for (var B = 0x0; B &lt; A; B++) &#123;\n                                        var D = y[B &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - B % 0x4 * 0x8 &amp; 0xff;\n                                        x[z + B &gt;&gt;&gt; 0x2] |= D &lt;&lt; 0x18 - (z + B) % 0x4 * 0x8;\n                                    &#125;\n                                else\n                                    for (var E = 0x0; E &lt; A; E += 0x4) &#123;\n                                        x[z + E &gt;&gt;&gt; 0x2] = y[E &gt;&gt;&gt; 0x2];\n                                    &#125;\n                                return this['sigBytes'] += A,\n                                    this;\n                            &#125;,\n                            'clamp': function () &#123;\n                                var w = this['words']\n                                    , x = this['sigBytes'];\n                                w[x &gt;&gt;&gt; 0x2] &amp;= 0xffffffff &lt;&lt; 0x20 - x % 0x4 * 0x8,\n                                    w['length'] = f['ceil'](x / 0x4);\n                            &#125;,\n                            'clone': function () &#123;\n                                var w = m['clone']['call'](this);\n                                return w['words'] = this['words']['slice'](0x0),\n                                    w;\n                            &#125;,\n                            'random': function (w) &#123;\n                                var x = [];\n                                for (var y = 0x0; y &lt; w; y += 0x4) &#123;\n                                    x['push'](i());\n                                &#125;\n                                return new n['init'](x, w);\n                            &#125;\n                        &#125;)\n                            , o = k['enc'] = &#123;&#125;\n                            , p = o['Hex'] = &#123;\n                            'stringify': function (w) &#123;\n                                var x = w['words']\n                                    , y = w['sigBytes']\n                                    , z = [];\n                                for (var A = 0x0; A &lt; y; A++) &#123;\n                                    var B = x[A &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - A % 0x4 * 0x8 &amp; 0xff;\n                                    z['push']((B &gt;&gt;&gt; 0x4)['toString'](0x10)),\n                                        z['push']((B &amp; 0xf)['toString'](0x10));\n                                &#125;\n                                return z['join']('');\n                            &#125;,\n                            'parse': function (w) &#123;\n                                var x = w['length']\n                                    , y = [];\n                                for (var z = 0x0; z &lt; x; z += 0x2) &#123;\n                                    y[z &gt;&gt;&gt; 0x3] |= parseInt(w['substr'](z, 0x2), 0x10) &lt;&lt; 0x18 - z % 0x8 * 0x4;\n                                &#125;\n                                return new n['init'](y, x / 0x2);\n                            &#125;\n                        &#125;\n                            , q = o['Latin1'] = &#123;\n                            'stringify': function (w) &#123;\n                                var x = w['words']\n                                    , y = w['sigBytes']\n                                    , z = [];\n                                for (var A = 0x0; A &lt; y; A++) &#123;\n                                    var B = x[A &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - A % 0x4 * 0x8 &amp; 0xff;\n                                    z['push'](String['fromCharCode'](B));\n                                &#125;\n                                return z['join']('');\n                            &#125;,\n                            'parse': function (w) &#123;\n                                var x = w['length']\n                                    , y = [];\n                                for (var z = 0x0; z &lt; x; z++) &#123;\n                                    y[z &gt;&gt;&gt; 0x2] |= (w['charCodeAt'](z) &amp; 0xff) &lt;&lt; 0x18 - z % 0x4 * 0x8;\n                                &#125;\n                                return new n['init'](y, x);\n                            &#125;\n                        &#125;\n                            , r = o['Utf8'] = &#123;\n                            'stringify': function (w) &#123;\n                                try &#123;\n                                    return decodeURIComponent(escape(q['stringify'](w)));\n                                &#125; catch (x) &#123;\n                                    throw new Error('Malformed\\x20UTF-8\\x20data');\n                                &#125;\n                            &#125;,\n                            'parse': function (w) &#123;\n                                return q['parse'](unescape(encodeURIComponent(w)));\n                            &#125;\n                        &#125;\n                            , s = l['BufferedBlockAlgorithm'] = m['extend'](&#123;\n                            'reset': function () &#123;\n                                this['_data'] = new n['init'](),\n                                    this['_nDataBytes'] = 0x0;\n                            &#125;,\n                            '_append': function (w) &#123;\n                                typeof w == 'string' &amp;&amp; (w = r['parse'](w)),\n                                    this['_data']['concat'](w),\n                                    this['_nDataBytes'] += w['sigBytes'];\n                            &#125;,\n                            '_process': function (w) &#123;\n                                var x, y = this['_data'], z = y['words'], A = y['sigBytes'], B = this['blockSize'],\n                                    D = B * 0x4, E = A / D;\n                                w ? E = f['ceil'](E) : E = f['max']((E | 0x0) - this['_minBufferSize'], 0x0);\n                                var F = E * B\n                                    , G = f['min'](F * 0x4, A);\n                                if (F) &#123;\n                                    for (var H = 0x0; H &lt; F; H += B) &#123;\n                                        this['_doProcessBlock'](z, H);\n                                    &#125;\n                                    x = z['splice'](0x0, F),\n                                        y['sigBytes'] -= G;\n                                &#125;\n                                return new n['init'](x, G);\n                            &#125;,\n                            'clone': function () &#123;\n                                var w = m['clone']['call'](this);\n                                return w['_data'] = this['_data']['clone'](),\n                                    w;\n                            &#125;,\n                            '_minBufferSize': 0x0\n                        &#125;)\n                            , t = l['Hasher'] = s['extend'](&#123;\n                            'cfg': m['extend'](),\n                            'init': function (w) &#123;\n                                this['cfg'] = this['cfg']['extend'](w),\n                                    this['reset']();\n                            &#125;,\n                            'reset': function () &#123;\n                                s['reset']['call'](this),\n                                    this['_doReset']();\n                            &#125;,\n                            'update': function (w) &#123;\n                                return this['_append'](w),\n                                    this['_process'](),\n                                    this;\n                            &#125;,\n                            'finalize': function (w) &#123;\n                                w &amp;&amp; this['_append'](w);\n                                var x = this['_doFinalize']();\n                                return x;\n                            &#125;,\n                            'blockSize': 0x200 / 0x20,\n                            '_createHelper': function (w) &#123;\n                                return function (x, y) &#123;\n                                    return new w['init'](y)['finalize'](x);\n                                &#125;\n                                    ;\n                            &#125;,\n                            '_createHmacHelper': function (w) &#123;\n                                return function (x, y) &#123;\n                                    return new u['HMAC']['init'](w, y)['finalize'](x);\n                                &#125;\n                                    ;\n                            &#125;\n                        &#125;)\n                            , u = k['algo'] = &#123;&#125;;\n                        return k;\n                    &#125;(Math);\n                    return e;\n                &#125;));\n            &#125;\n                ['call'](this));\n        &#125;\n            ['call'](this, window));\n    &#125;\n        , &#123;\n            'crypto': 0x1\n        &#125;],\n    0x6: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = e['enc']\n                    , i = h['Base64'] = &#123;\n                    'stringify': function (k) &#123;\n                        var l = k['words']\n                            , m = k['sigBytes']\n                            , n = this['_map'];\n                        k['clamp']();\n                        var o = [];\n                        for (var p = 0x0; p &lt; m; p += 0x3) &#123;\n                            var q = l[p &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - p % 0x4 * 0x8 &amp; 0xff\n                                , r = l[p + 0x1 &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - (p + 0x1) % 0x4 * 0x8 &amp; 0xff\n                                , s = l[p + 0x2 &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - (p + 0x2) % 0x4 * 0x8 &amp; 0xff\n                                , t = q &lt;&lt; 0x10 | r &lt;&lt; 0x8 | s;\n                            for (var u = 0x0; u &lt; 0x4 &amp;&amp; p + u * 0.75 &lt; m; u++) &#123;\n                                o['push'](n['charAt'](t &gt;&gt;&gt; 0x6 * (0x3 - u) &amp; 0x3f));\n                            &#125;\n                        &#125;\n                        var v = n['charAt'](0x40);\n                        if (v)\n                            while (o['length'] % 0x4) &#123;\n                                o['push'](v);\n                            &#125;\n                        return o['join']('');\n                    &#125;,\n                    'parse': function (k) &#123;\n                        var l = k['length']\n                            , m = this['_map']\n                            , n = this['_reverseMap'];\n                        if (!n) &#123;\n                            n = this['_reverseMap'] = [];\n                            for (var o = 0x0; o &lt; m['length']; o++) &#123;\n                                n[m['charCodeAt'](o)] = o;\n                            &#125;\n                        &#125;\n                        var p = m['charAt'](0x40);\n                        if (p) &#123;\n                            var q = k['indexOf'](p);\n                            q !== -0x1 &amp;&amp; (l = q);\n                        &#125;\n                        return j(k, l, n);\n                    &#125;,\n                    '_map': (function () &#123;\n                        return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';\n                    &#125;())\n                &#125;;\n\n                function j(k, l, m) &#123;\n                    var n = []\n                        , o = 0x0;\n                    for (var p = 0x0; p &lt; l; p++) &#123;\n                        if (p % 0x4) &#123;\n                            var q = m[k['charCodeAt'](p - 0x1)] &lt;&lt; p % 0x4 * 0x2\n                                , r = m[k['charCodeAt'](p)] &gt;&gt;&gt; 0x6 - p % 0x4 * 0x2\n                                , s = q | r;\n                            n[o &gt;&gt;&gt; 0x2] |= s &lt;&lt; 0x18 - o % 0x4 * 0x8,\n                                o++;\n                        &#125;\n                    &#125;\n                    return g['create'](n, o);\n                &#125;\n            &#125;()),\n                d['enc']['Base64'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0x7: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = e['enc']\n                    , i = h['Base64url'] = &#123;\n                    'stringify': function (k, l = !![]) &#123;\n                        var m = k['words']\n                            , n = k['sigBytes']\n                            , o = l ? this['_safe_map'] : this['_map'];\n                        k['clamp']();\n                        var p = [];\n                        for (var q = 0x0; q &lt; n; q += 0x3) &#123;\n                            var r = m[q &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - q % 0x4 * 0x8 &amp; 0xff\n                                , s = m[q + 0x1 &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - (q + 0x1) % 0x4 * 0x8 &amp; 0xff\n                                , t = m[q + 0x2 &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - (q + 0x2) % 0x4 * 0x8 &amp; 0xff\n                                , u = r &lt;&lt; 0x10 | s &lt;&lt; 0x8 | t;\n                            for (var v = 0x0; v &lt; 0x4 &amp;&amp; q + v * 0.75 &lt; n; v++) &#123;\n                                p['push'](o['charAt'](u &gt;&gt;&gt; 0x6 * (0x3 - v) &amp; 0x3f));\n                            &#125;\n                        &#125;\n                        var w = o['charAt'](0x40);\n                        if (w)\n                            while (p['length'] % 0x4) &#123;\n                                p['push'](w);\n                            &#125;\n                        return p['join']('');\n                    &#125;,\n                    'parse': function (k, l = !![]) &#123;\n                        var m = k['length']\n                            , n = l ? this['_safe_map'] : this['_map']\n                            , o = this['_reverseMap'];\n                        if (!o) &#123;\n                            o = this['_reverseMap'] = [];\n                            for (var p = 0x0; p &lt; n['length']; p++) &#123;\n                                o[n['charCodeAt'](p)] = p;\n                            &#125;\n                        &#125;\n                        var q = n['charAt'](0x40);\n                        if (q) &#123;\n                            var r = k['indexOf'](q);\n                            r !== -0x1 &amp;&amp; (m = r);\n                        &#125;\n                        return j(k, m, o);\n                    &#125;,\n                    '_map': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n                    '_safe_map': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'\n                &#125;;\n\n                function j(k, l, m) &#123;\n                    var n = []\n                        , o = 0x0;\n                    for (var p = 0x0; p &lt; l; p++) &#123;\n                        if (p % 0x4) &#123;\n                            var q = m[k['charCodeAt'](p - 0x1)] &lt;&lt; p % 0x4 * 0x2\n                                , r = m[k['charCodeAt'](p)] &gt;&gt;&gt; 0x6 - p % 0x4 * 0x2\n                                , s = q | r;\n                            n[o &gt;&gt;&gt; 0x2] |= s &lt;&lt; 0x18 - o % 0x4 * 0x8,\n                                o++;\n                        &#125;\n                    &#125;\n                    return g['create'](n, o);\n                &#125;\n            &#125;()),\n                d['enc']['Base64url'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0x8: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = e['enc']\n                    , i = h['Utf16'] = h['Utf16BE'] = &#123;\n                    'stringify': function (k) &#123;\n                        var l = k['words']\n                            , m = k['sigBytes']\n                            , n = [];\n                        for (var o = 0x0; o &lt; m; o += 0x2) &#123;\n                            var p = l[o &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x10 - o % 0x4 * 0x8 &amp; 0xffff;\n                            n['push'](String['fromCharCode'](p));\n                        &#125;\n                        return n['join']('');\n                    &#125;,\n                    'parse': function (k) &#123;\n                        var l = k['length']\n                            , m = [];\n                        for (var n = 0x0; n &lt; l; n++) &#123;\n                            m[n &gt;&gt;&gt; 0x1] |= k['charCodeAt'](n) &lt;&lt; 0x10 - n % 0x2 * 0x10;\n                        &#125;\n                        return g['create'](m, l * 0x2);\n                    &#125;\n                &#125;;\n                h['Utf16LE'] = &#123;\n                    'stringify': function (k) &#123;\n                        var l = k['words']\n                            , m = k['sigBytes']\n                            , n = [];\n                        for (var o = 0x0; o &lt; m; o += 0x2) &#123;\n                            var p = j(l[o &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x10 - o % 0x4 * 0x8 &amp; 0xffff);\n                            n['push'](String['fromCharCode'](p));\n                        &#125;\n                        return n['join']('');\n                    &#125;,\n                    'parse': function (k) &#123;\n                        var l = k['length']\n                            , m = [];\n                        for (var n = 0x0; n &lt; l; n++) &#123;\n                            m[n &gt;&gt;&gt; 0x1] |= j(k['charCodeAt'](n) &lt;&lt; 0x10 - n % 0x2 * 0x10);\n                        &#125;\n                        return g['create'](m, l * 0x2);\n                    &#125;\n                &#125;;\n\n                function j(k) &#123;\n                    return k &lt;&lt; 0x8 &amp; 0xff00ff00 | k &gt;&gt;&gt; 0x8 &amp; 0xff00ff;\n                &#125;\n            &#125;()),\n                d['enc']['Utf16'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0x9: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./sha1'), a('./hmac'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './sha1', './hmac'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['Base']\n                    , h = f['WordArray']\n                    , i = e['algo']\n                    , j = i['MD5']\n                    , k = i['EvpKDF'] = g['extend'](&#123;\n                    'cfg': g['extend'](&#123;\n                        'keySize': 0x80 / 0x20,\n                        'hasher': j,\n                        'iterations': 0x1\n                    &#125;),\n                    'init': function (l) &#123;\n                        this['cfg'] = this['cfg']['extend'](l);\n                    &#125;,\n                    'compute': function (l, m) &#123;\n                        var n, o = this['cfg'], p = o['hasher']['create'](), q = h['create'](), r = q['words'],\n                            s = o['keySize'], t = o['iterations'];\n                        while (r['length'] &lt; s) &#123;\n                            n &amp;&amp; p['update'](n);\n                            n = p['update'](l)['finalize'](m),\n                                p['reset']();\n                            for (var u = 0x1; u &lt; t; u++) &#123;\n                                n = p['finalize'](n),\n                                    p['reset']();\n                            &#125;\n                            q['concat'](n);\n                        &#125;\n                        return q['sigBytes'] = s * 0x4,\n                            q;\n                    &#125;\n                &#125;);\n                e['EvpKDF'] = function (l, m, n) &#123;\n                    return k['create'](n)['compute'](l, m);\n                &#125;\n                ;\n            &#125;()),\n                d['EvpKDF'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './hmac': 0xb,\n            './sha1': 0x1e\n        &#125;],\n    0xa: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['CipherParams']\n                    , i = f['enc']\n                    , j = i['Hex']\n                    , k = f['format']\n                    , l = k['Hex'] = &#123;\n                    'stringify': function (m) &#123;\n                        return m['ciphertext']['toString'](j);\n                    &#125;,\n                    'parse': function (m) &#123;\n                        var n = j['parse'](m);\n                        return h['create'](&#123;\n                            'ciphertext': n\n                        &#125;);\n                    &#125;\n                &#125;;\n            &#125;(),\n                d['format']['Hex'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0xb: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['Base']\n                    , h = e['enc']\n                    , i = h['Utf8']\n                    , j = e['algo']\n                    , k = j['HMAC'] = g['extend'](&#123;\n                    'init': function (l, m) &#123;\n                        l = this['_hasher'] = new l['init']();\n                        typeof m == 'string' &amp;&amp; (m = i['parse'](m));\n                        var n = l['blockSize']\n                            , o = n * 0x4;\n                        m['sigBytes'] &gt; o &amp;&amp; (m = l['finalize'](m));\n                        m['clamp']();\n                        var p = this['_oKey'] = m['clone']()\n                            , q = this['_iKey'] = m['clone']()\n                            , r = p['words']\n                            , s = q['words'];\n                        for (var t = 0x0; t &lt; n; t++) &#123;\n                            r[t] ^= 0x5c5c5c5c,\n                                s[t] ^= 0x36363636;\n                        &#125;\n                        p['sigBytes'] = q['sigBytes'] = o,\n                            this['reset']();\n                    &#125;,\n                    'reset': function () &#123;\n                        var l = this['_hasher'];\n                        l['reset'](),\n                            l['update'](this['_iKey']);\n                    &#125;,\n                    'update': function (l) &#123;\n                        return this['_hasher']['update'](l),\n                            this;\n                    &#125;,\n                    'finalize': function (l) &#123;\n                        var m = this['_hasher']\n                            , n = m['finalize'](l);\n                        m['reset']();\n                        var o = m['finalize'](this['_oKey']['clone']()['concat'](n));\n                        return o;\n                    &#125;\n                &#125;);\n            &#125;());\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0xc: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./x64-core'), a('./lib-typedarrays'), a('./enc-utf16'), a('./enc-base64'), a('./enc-base64url'), a('./md5'), a('./sha1'), a('./sha256'), a('./sha224'), a('./sha512'), a('./sha384'), a('./sha3'), a('./ripemd160'), a('./hmac'), a('./pbkdf2'), a('./evpkdf'), a('./cipher-core'), a('./mode-cfb'), a('./mode-ctr'), a('./mode-ctr-gladman'), a('./mode-ofb'), a('./mode-ecb'), a('./pad-ansix923'), a('./pad-iso10126'), a('./pad-iso97971'), a('./pad-zeropadding'), a('./pad-nopadding'), a('./format-hex'), a('./aes'), a('./tripledes'), a('./rc4'), a('./rabbit'), a('./rabbit-legacy'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './x64-core', './lib-typedarrays', './enc-utf16', './enc-base64', './enc-base64url', './md5', './sha1', './sha256', './sha224', './sha512', './sha384', './sha3', './ripemd160', './hmac', './pbkdf2', './evpkdf', './cipher-core', './mode-cfb', './mode-ctr', './mode-ctr-gladman', './mode-ofb', './mode-ecb', './pad-ansix923', './pad-iso10126', './pad-iso97971', './pad-zeropadding', './pad-nopadding', './format-hex', './aes', './tripledes', './rc4', './rabbit', './rabbit-legacy'], e) : d['CryptoJS'] = e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d;\n        &#125;));\n    &#125;\n        , &#123;\n            './aes': 0x3,\n            './cipher-core': 0x4,\n            './core': 0x5,\n            './enc-base64': 0x6,\n            './enc-base64url': 0x7,\n            './enc-utf16': 0x8,\n            './evpkdf': 0x9,\n            './format-hex': 0xa,\n            './hmac': 0xb,\n            './lib-typedarrays': 0xd,\n            './md5': 0xe,\n            './mode-cfb': 0xf,\n            './mode-ctr': 0x11,\n            './mode-ctr-gladman': 0x10,\n            './mode-ecb': 0x12,\n            './mode-ofb': 0x13,\n            './pad-ansix923': 0x14,\n            './pad-iso10126': 0x15,\n            './pad-iso97971': 0x16,\n            './pad-nopadding': 0x17,\n            './pad-zeropadding': 0x18,\n            './pbkdf2': 0x19,\n            './rabbit': 0x1b,\n            './rabbit-legacy': 0x1a,\n            './rc4': 0x1c,\n            './ripemd160': 0x1d,\n            './sha1': 0x1e,\n            './sha224': 0x1f,\n            './sha256': 0x20,\n            './sha3': 0x21,\n            './sha384': 0x22,\n            './sha512': 0x23,\n            './tripledes': 0x24,\n            './x64-core': 0x25\n        &#125;],\n    0xd: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                if (typeof ArrayBuffer != 'function')\n                    return;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = g['init']\n                    , i = g['init'] = function (j) &#123;\n                        j instanceof ArrayBuffer &amp;&amp; (j = new Uint8Array(j));\n                        (j instanceof Int8Array || typeof Uint8ClampedArray !== 'undefined' &amp;&amp; j instanceof Uint8ClampedArray || j instanceof Int16Array || j instanceof Uint16Array || j instanceof Int32Array || j instanceof Uint32Array || j instanceof Float32Array || j instanceof Float64Array) &amp;&amp; (j = new Uint8Array(j['buffer'], j['byteOffset'], j['byteLength']));\n                        if (j instanceof Uint8Array) &#123;\n                            var k = j['byteLength']\n                                , l = [];\n                            for (var m = 0x0; m &lt; k; m++) &#123;\n                                l[m &gt;&gt;&gt; 0x2] |= j[m] &lt;&lt; 0x18 - m % 0x4 * 0x8;\n                            &#125;\n                            h['call'](this, l, k);\n                        &#125; else\n                            h['apply'](this, arguments);\n                    &#125;\n                ;\n                i['prototype'] = g;\n            &#125;()),\n                d['lib']['WordArray'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0xe: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['WordArray']\n                    , i = g['Hasher']\n                    , j = f['algo']\n                    , k = [];\n                (function () &#123;\n                    for (var q = 0x0; q &lt; 0x40; q++) &#123;\n                        k[q] = e['abs'](e['sin'](q + 0x1)) * 0x100000000 | 0x0;\n                    &#125;\n                &#125;());\n                var l = j['MD5'] = i['extend'](&#123;\n                    '_doReset': function () &#123;\n                        try &#123;\n                            RCON[0x0][0x0][0x0],\n                                this['_hash'] = new h['init']([0x67452002, 0xefcdab80, 0x98badcfe, 0x10325476]);\n                        &#125; catch (q) &#123;\n                            this['_hash'] = new h['init']([0x67452301, 0xefcdab80, 0x98badcfe, 0x10325476]);\n                        &#125;\n                    &#125;,\n                    '_doProcessBlock': function (q, r) &#123;\n                        for (var s = 0x0; s &lt; 0x10; s++) &#123;\n                            var t = r + s\n                                , u = q[t];\n                            q[t] = (u &lt;&lt; 0x8 | u &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (u &lt;&lt; 0x18 | u &gt;&gt;&gt; 0x8) &amp; 0xff00ff00;\n                        &#125;\n                        var v = this['_hash']['words']\n                            , w = q[r + 0x0]\n                            , x = q[r + 0x1]\n                            , y = q[r + 0x2]\n                            , z = q[r + 0x3]\n                            , A = q[r + 0x4]\n                            , B = q[r + 0x5]\n                            , D = q[r + 0x6]\n                            , E = q[r + 0x7]\n                            , F = q[r + 0x8]\n                            , G = q[r + 0x9]\n                            , I = q[r + 0xa]\n                            , J = q[r + 0xb]\n                            , K = q[r + 0xc]\n                            , L = q[r + 0xd]\n                            , N = q[r + 0xe]\n                            , O = q[r + 0xf]\n                            , P = v[0x0]\n                            , Q = v[0x1]\n                            , R = v[0x2]\n                            , S = v[0x3];\n                        P = m(P, Q, R, S, w, 0x7, k[0x0]),\n                            S = m(S, P, Q, R, x, 0xc, k[0x1]),\n                            R = m(R, S, P, Q, y, 0x11, k[0x2]),\n                            Q = m(Q, R, S, P, z, 0x16, k[0x3]),\n                            P = m(P, Q, R, S, A, 0x7, k[0x4]),\n                            S = m(S, P, Q, R, B, 0xc, k[0x5]),\n                            R = m(R, S, P, Q, D, 0x11, k[0x6]),\n                            Q = m(Q, R, S, P, E, 0x16, k[0x7]),\n                            P = m(P, Q, R, S, F, 0x7, k[0x8]),\n                            S = m(S, P, Q, R, G, 0xc, k[0x9]),\n                            R = m(R, S, P, Q, I, 0x11, k[0xa]),\n                            Q = m(Q, R, S, P, J, 0x16, k[0xb]),\n                            P = m(P, Q, R, S, K, 0x7, k[0xc]),\n                            S = m(S, P, Q, R, L, 0xc, k[0xd]),\n                            R = m(R, S, P, Q, N, 0x11, k[0xe]),\n                            Q = m(Q, R, S, P, O, 0x16, k[0xf]),\n                            P = n(P, Q, R, S, x, 0x5, k[0x10]),\n                            S = n(S, P, Q, R, D, 0x9, k[0x11]),\n                            R = n(R, S, P, Q, J, 0xe, k[0x12]),\n                            Q = n(Q, R, S, P, w, 0x14, k[0x13]),\n                            P = n(P, Q, R, S, B, 0x5, k[0x14]),\n                            S = n(S, P, Q, R, I, 0x9, k[0x15]),\n                            R = n(R, S, P, Q, O, 0xe, k[0x16]),\n                            Q = n(Q, R, S, P, A, 0x14, k[0x17]),\n                            P = n(P, Q, R, S, G, 0x5, k[0x18]),\n                            S = n(S, P, Q, R, N, 0x9, k[0x19]),\n                            R = n(R, S, P, Q, z, 0xe, k[0x1a]),\n                            Q = n(Q, R, S, P, F, 0x14, k[0x1b]),\n                            P = n(P, Q, R, S, L, 0x5, k[0x1c]),\n                            S = n(S, P, Q, R, y, 0x9, k[0x1d]),\n                            R = n(R, S, P, Q, E, 0xe, k[0x1e]),\n                            Q = n(Q, R, S, P, K, 0x14, k[0x1f]),\n                            P = o(P, Q, R, S, B, 0x4, k[0x20]),\n                            S = o(S, P, Q, R, F, 0xb, k[0x21]),\n                            R = o(R, S, P, Q, J, 0x10, k[0x22]),\n                            Q = o(Q, R, S, P, N, 0x17, k[0x23]),\n                            P = o(P, Q, R, S, x, 0x4, k[0x24]),\n                            S = o(S, P, Q, R, A, 0xb, k[0x25]),\n                            R = o(R, S, P, Q, E, 0x10, k[0x26]),\n                            Q = o(Q, R, S, P, I, 0x17, k[0x27]),\n                            P = o(P, Q, R, S, L, 0x4, k[0x28]),\n                            S = o(S, P, Q, R, w, 0xb, k[0x29]),\n                            R = o(R, S, P, Q, z, 0x10, k[0x2a]),\n                            Q = o(Q, R, S, P, D, 0x17, k[0x2b]),\n                            P = o(P, Q, R, S, G, 0x4, k[0x2c]),\n                            S = o(S, P, Q, R, K, 0xb, k[0x2d]),\n                            R = o(R, S, P, Q, O, 0x10, k[0x2e]),\n                            Q = o(Q, R, S, P, y, 0x17, k[0x2f]),\n                            P = p(P, Q, R, S, w, 0x6, k[0x30]),\n                            S = p(S, P, Q, R, E, 0xa, k[0x31]),\n                            R = p(R, S, P, Q, N, 0xf, k[0x32]),\n                            Q = p(Q, R, S, P, B, 0x15, k[0x33]),\n                            P = p(P, Q, R, S, K, 0x6, k[0x34]),\n                            S = p(S, P, Q, R, z, 0xa, k[0x35]),\n                            R = p(R, S, P, Q, I, 0xf, k[0x36]),\n                            Q = p(Q, R, S, P, x, 0x15, k[0x37]),\n                            P = p(P, Q, R, S, F, 0x6, k[0x38]),\n                            S = p(S, P, Q, R, O, 0xa, k[0x39]),\n                            R = p(R, S, P, Q, D, 0xf, k[0x3a]);\n                        Q = p(Q, R, S, P, L, 0x12, k[0x3b]);\n                        ;P = p(P, Q, R, S, A, 0x6, k[0x3c]),\n                            S = p(S, P, Q, R, J, 0xa, k[0x3d]),\n                            R = p(R, S, P, Q, y, 0xf, k[0x3e]),\n                            Q = p(Q, R, S, P, G, 0x15, k[0x3f]),\n                            v[0x0] = v[0x0] + P | 0x0,\n                            v[0x1] = v[0x1] + Q | 0x0,\n                            v[0x2] = v[0x2] + R | 0x0,\n                            v[0x3] = v[0x3] + S | 0x0;\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var q = this['_data']\n                            , r = q['words']\n                            , s = this['_nDataBytes'] * 0x8\n                            , t = q['sigBytes'] * 0x8;\n                        r[t &gt;&gt;&gt; 0x5] |= 0x80 &lt;&lt; 0x18 - t % 0x20;\n                        var u = e['floor'](s / 0x100000000)\n                            , v = s;\n                        r[(t + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xf] = (u &lt;&lt; 0x8 | u &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (u &lt;&lt; 0x18 | u &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                            r[(t + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xe] = (v &lt;&lt; 0x8 | v &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (v &lt;&lt; 0x18 | v &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                            q['sigBytes'] = (r['length'] + 0x1) * 0x4,\n                            this['_process']();\n                        var w = this['_hash']\n                            , x = w['words'];\n                        for (var y = 0x0; y &lt; 0x4; y++) &#123;\n                            var z = x[y];\n                            x[y] = (z &lt;&lt; 0x8 | z &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (z &lt;&lt; 0x18 | z &gt;&gt;&gt; 0x8) &amp; 0xff00ff00;\n                        &#125;\n                        return w;\n                    &#125;,\n                    'clone': function () &#123;\n                        var q = i['clone']['call'](this);\n                        return q['_hash'] = this['_hash']['clone'](),\n                            q;\n                    &#125;\n                &#125;);\n\n                function m(q, r, u, v, w, y, z) &#123;\n                    var A = q + (r &amp; u | ~r &amp; v) + w + z;\n                    return (A &lt;&lt; y | A &gt;&gt;&gt; 0x20 - y) + r;\n                &#125;\n\n                function n(q, r, u, v, w, y, z) &#123;\n                    var A = q + (r &amp; v | u &amp; ~v) + w + z;\n                    return (A &lt;&lt; y | A &gt;&gt;&gt; 0x20 - y) + r;\n                &#125;\n\n                function o(q, r, u, v, w, y, z) &#123;\n                    var A = q + (r ^ u ^ v) + w + z;\n                    return (A &lt;&lt; y | A &gt;&gt;&gt; 0x20 - y) + r;\n                &#125;\n\n                function p(q, r, u, v, w, y, z) &#123;\n                    var A = q + (u ^ (r | ~v)) + w + z;\n                    return (A &lt;&lt; y | A &gt;&gt;&gt; 0x20 - y) + r;\n                &#125;\n\n                f['MD5'] = i['_createHelper'](l),\n                    f['HmacMD5'] = i['_createHmacHelper'](l);\n            &#125;(Math),\n                d['MD5'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0xf: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['mode']['CFB'] = (function () &#123;\n                var e = d['lib']['BlockCipherMode']['extend']();\n                e['Encryptor'] = e['extend'](&#123;\n                    'processBlock': function (g, h) &#123;\n                        var i = this['_cipher']\n                            , j = i['blockSize'];\n                        f['call'](this, g, h, j, i),\n                            this['_prevBlock'] = g['slice'](h, h + j);\n                    &#125;\n                &#125;),\n                    e['Decryptor'] = e['extend'](&#123;\n                        'processBlock': function (g, h) &#123;\n                            var i = this['_cipher']\n                                , j = i['blockSize']\n                                , k = g['slice'](h, h + j);\n                            f['call'](this, g, h, j, i),\n                                this['_prevBlock'] = k;\n                        &#125;\n                    &#125;);\n\n                function f(g, h, j, k) &#123;\n                    var l, m = this['_iv'];\n                    m ? (l = m['slice'](0x0),\n                        this['_iv'] = undefined) : l = this['_prevBlock'];\n                    k['encryptBlock'](l, 0x0);\n                    for (var n = 0x0; n &lt; j; n++) &#123;\n                        g[h + n] ^= l[n];\n                    &#125;\n                &#125;\n\n                return e;\n            &#125;()),\n                d['mode']['CFB'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x10: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['mode']['CTRGladman'] = (function () &#123;\n                var e = d['lib']['BlockCipherMode']['extend']();\n\n                function f(i) &#123;\n                    if ((i &gt;&gt; 0x18 &amp; 0xff) === 0xff) &#123;\n                        var j = i &gt;&gt; 0x10 &amp; 0xff\n                            , k = i &gt;&gt; 0x8 &amp; 0xff\n                            , l = i &amp; 0xff;\n                        j === 0xff ? (j = 0x0,\n                            k === 0xff ? (k = 0x0,\n                                l === 0xff ? l = 0x0 : ++l) : ++k) : ++j,\n                            i = 0x0,\n                            i += j &lt;&lt; 0x10,\n                            i += k &lt;&lt; 0x8,\n                            i += l;\n                    &#125; else\n                        i += 0x1 &lt;&lt; 0x18;\n                    return i;\n                &#125;\n\n                function g(i) &#123;\n                    return (i[0x0] = f(i[0x0])) === 0x0 &amp;&amp; (i[0x1] = f(i[0x1])),\n                        i;\n                &#125;\n\n                var h = e['Encryptor'] = e['extend'](&#123;\n                    'processBlock': function (j, k) &#123;\n                        var l = this['_cipher']\n                            , m = l['blockSize']\n                            , n = this['_iv']\n                            , o = this['_counter'];\n                        n &amp;&amp; (o = this['_counter'] = n['slice'](0x0),\n                            this['_iv'] = undefined);\n                        g(o);\n                        var p = o['slice'](0x0);\n                        l['encryptBlock'](p, 0x0);\n                        for (var q = 0x0; q &lt; m; q++) &#123;\n                            j[k + q] ^= p[q];\n                        &#125;\n                    &#125;\n                &#125;);\n                return e['Decryptor'] = h,\n                    e;\n            &#125;()),\n                d['mode']['CTRGladman'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x11: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['mode']['CTR'] = (function () &#123;\n                var e = d['lib']['BlockCipherMode']['extend']()\n                    , f = e['Encryptor'] = e['extend'](&#123;\n                    'processBlock': function (g, h) &#123;\n                        var j = this['_cipher']\n                            , k = j['blockSize']\n                            , l = this['_iv']\n                            , m = this['_counter'];\n                        l &amp;&amp; (m = this['_counter'] = l['slice'](0x0),\n                            this['_iv'] = undefined);\n                        var n = m['slice'](0x0);\n                        j['encryptBlock'](n, 0x0),\n                            m[k - 0x1] = m[k - 0x1] + 0x1 | 0x0;\n                        for (var o = 0x0; o &lt; k; o++) &#123;\n                            g[h + o] ^= n[o];\n                        &#125;\n                    &#125;\n                &#125;);\n                return e['Decryptor'] = f,\n                    e;\n            &#125;()),\n                d['mode']['CTR'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x12: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['mode']['ECB'] = (function () &#123;\n                var e = d['lib']['BlockCipherMode']['extend']();\n                return e['Encryptor'] = e['extend'](&#123;\n                    'processBlock': function (f, g) &#123;\n                        this['_cipher']['encryptBlock'](f, g);\n                    &#125;\n                &#125;),\n                    e['Decryptor'] = e['extend'](&#123;\n                        'processBlock': function (f, g) &#123;\n                            this['_cipher']['decryptBlock'](f, g);\n                        &#125;\n                    &#125;),\n                    e;\n            &#125;()),\n                d['mode']['ECB'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x13: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['mode']['OFB'] = (function () &#123;\n                var e = d['lib']['BlockCipherMode']['extend']()\n                    , f = e['Encryptor'] = e['extend'](&#123;\n                    'processBlock': function (g, h) &#123;\n                        var j = this['_cipher']\n                            , k = j['blockSize']\n                            , l = this['_iv']\n                            , m = this['_keystream'];\n                        l &amp;&amp; (m = this['_keystream'] = l['slice'](0x0),\n                            this['_iv'] = undefined);\n                        j['encryptBlock'](m, 0x0);\n                        for (var n = 0x0; n &lt; k; n++) &#123;\n                            g[h + n] ^= m[n];\n                        &#125;\n                    &#125;\n                &#125;);\n                return e['Decryptor'] = f,\n                    e;\n            &#125;()),\n                d['mode']['OFB'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x14: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['pad']['AnsiX923'] = &#123;\n                'pad': function (e, f) &#123;\n                    var g = e['sigBytes']\n                        , h = f * 0x4\n                        , i = h - g % h\n                        , j = g + i - 0x1;\n                    e['clamp'](),\n                        e['words'][j &gt;&gt;&gt; 0x2] |= i &lt;&lt; 0x18 - j % 0x4 * 0x8,\n                        e['sigBytes'] += i;\n                &#125;,\n                'unpad': function (e) &#123;\n                    var f = e['words'][e['sigBytes'] - 0x1 &gt;&gt;&gt; 0x2] &amp; 0xff;\n                    e['sigBytes'] -= f;\n                &#125;\n            &#125;,\n                d['pad']['Ansix923'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x15: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['pad']['Iso10126'] = &#123;\n                'pad': function (e, f) &#123;\n                    var g = f * 0x4\n                        , h = g - e['sigBytes'] % g;\n                    e['concat'](d['lib']['WordArray']['random'](h - 0x1))['concat'](d['lib']['WordArray']['create']([h &lt;&lt; 0x18], 0x1));\n                &#125;,\n                'unpad': function (e) &#123;\n                    var f = e['words'][e['sigBytes'] - 0x1 &gt;&gt;&gt; 0x2] &amp; 0xff;\n                    e['sigBytes'] -= f;\n                &#125;\n            &#125;,\n                d['pad']['Iso10126'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x16: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['pad']['Iso97971'] = &#123;\n                'pad': function (e, f) &#123;\n                    e['concat'](d['lib']['WordArray']['create']([0x80000000], 0x1)),\n                        d['pad']['ZeroPadding']['pad'](e, f);\n                &#125;,\n                'unpad': function (e) &#123;\n                    d['pad']['ZeroPadding']['unpad'](e),\n                        e['sigBytes']--;\n                &#125;\n            &#125;,\n                d['pad']['Iso97971'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x17: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['pad']['NoPadding'] = &#123;\n                'pad': function () &#123;\n                &#125;,\n                'unpad': function () &#123;\n                &#125;\n            &#125;,\n                d['pad']['NoPadding'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x18: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return d['pad']['ZeroPadding'] = &#123;\n                'pad': function (e, f) &#123;\n                    var g = f * 0x4;\n                    e['clamp'](),\n                        e['sigBytes'] += g - (e['sigBytes'] % g || g);\n                &#125;,\n                'unpad': function (e) &#123;\n                    var f = e['words']\n                        , g = e['sigBytes'] - 0x1;\n                    for (var g = e['sigBytes'] - 0x1; g &gt;= 0x0; g--) &#123;\n                        if (f[g &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - g % 0x4 * 0x8 &amp; 0xff) &#123;\n                            e['sigBytes'] = g + 0x1;\n                            break;\n                        &#125;\n                    &#125;\n                &#125;\n            &#125;,\n                d['pad']['ZeroPadding'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5\n        &#125;],\n    0x19: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./sha1'), a('./hmac'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './sha1', './hmac'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['Base']\n                    , h = f['WordArray']\n                    , i = e['algo']\n                    , j = i['SHA1']\n                    , k = i['HMAC']\n                    , l = i['PBKDF2'] = g['extend'](&#123;\n                    'cfg': g['extend'](&#123;\n                        'keySize': 0x80 / 0x20,\n                        'hasher': j,\n                        'iterations': 0x1\n                    &#125;),\n                    'init': function (m) &#123;\n                        this['cfg'] = this['cfg']['extend'](m);\n                    &#125;,\n                    'compute': function (m, n) &#123;\n                        var o = this['cfg']\n                            , p = k['create'](o['hasher'], m)\n                            , q = h['create']()\n                            , r = h['create']([0x1])\n                            , s = q['words']\n                            , t = r['words']\n                            , u = o['keySize']\n                            , v = o['iterations'];\n                        while (s['length'] &lt; u) &#123;\n                            var w = p['update'](n)['finalize'](r);\n                            p['reset']();\n                            var x = w['words']\n                                , y = x['length']\n                                , z = w;\n                            for (var A = 0x1; A &lt; v; A++) &#123;\n                                z = p['finalize'](z),\n                                    p['reset']();\n                                var B = z['words'];\n                                for (var D = 0x0; D &lt; y; D++) &#123;\n                                    x[D] ^= B[D];\n                                &#125;\n                            &#125;\n                            q['concat'](w),\n                                t[0x0]++;\n                        &#125;\n                        return q['sigBytes'] = u * 0x4,\n                            q;\n                    &#125;\n                &#125;);\n                e['PBKDF2'] = function (m, n, o) &#123;\n                    return l['create'](o)['compute'](m, n);\n                &#125;\n                ;\n            &#125;()),\n                d['PBKDF2'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './hmac': 0xb,\n            './sha1': 0x1e\n        &#125;],\n    0x1a: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./enc-base64'), a('./md5'), a('./evpkdf'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './enc-base64', './md5', './evpkdf', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['StreamCipher']\n                    , h = e['algo']\n                    , i = []\n                    , j = []\n                    , k = []\n                    , l = h['RabbitLegacy'] = g['extend'](&#123;\n                    '_doReset': function () &#123;\n                        var n = this['_key']['words']\n                            , o = this['cfg']['iv']\n                            ,\n                            p = this['_X'] = [n[0x0], n[0x3] &lt;&lt; 0x10 | n[0x2] &gt;&gt;&gt; 0x10, n[0x1], n[0x0] &lt;&lt; 0x10 | n[0x3] &gt;&gt;&gt; 0x10, n[0x2], n[0x1] &lt;&lt; 0x10 | n[0x0] &gt;&gt;&gt; 0x10, n[0x3], n[0x2] &lt;&lt; 0x10 | n[0x1] &gt;&gt;&gt; 0x10]\n                            ,\n                            q = this['_C'] = [n[0x2] &lt;&lt; 0x10 | n[0x2] &gt;&gt;&gt; 0x10, n[0x0] &amp; 0xffff0000 | n[0x1] &amp; 0xffff, n[0x3] &lt;&lt; 0x10 | n[0x3] &gt;&gt;&gt; 0x10, n[0x1] &amp; 0xffff0000 | n[0x2] &amp; 0xffff, n[0x0] &lt;&lt; 0x10 | n[0x0] &gt;&gt;&gt; 0x10, n[0x2] &amp; 0xffff0000 | n[0x3] &amp; 0xffff, n[0x1] &lt;&lt; 0x10 | n[0x1] &gt;&gt;&gt; 0x10, n[0x3] &amp; 0xffff0000 | n[0x0] &amp; 0xffff];\n                        this['_b'] = 0x0;\n                        for (var r = 0x0; r &lt; 0x4; r++) &#123;\n                            m['call'](this);\n                        &#125;\n                        for (var r = 0x0; r &lt; 0x8; r++) &#123;\n                            q[r] ^= p[r + 0x4 &amp; 0x7];\n                        &#125;\n                        if (o) &#123;\n                            var s = o['words']\n                                , t = s[0x0]\n                                , u = s[0x1]\n                                , v = (t &lt;&lt; 0x8 | t &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (t &lt;&lt; 0x18 | t &gt;&gt;&gt; 0x8) &amp; 0xff00ff00\n                                , w = (u &lt;&lt; 0x8 | u &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (u &lt;&lt; 0x18 | u &gt;&gt;&gt; 0x8) &amp; 0xff00ff00\n                                , x = v &gt;&gt;&gt; 0x10 | w &amp; 0xffff0000\n                                , y = w &lt;&lt; 0x10 | v &amp; 0xffff;\n                            q[0x0] ^= v,\n                                q[0x1] ^= x,\n                                q[0x2] ^= w,\n                                q[0x3] ^= y,\n                                q[0x4] ^= v,\n                                q[0x5] ^= x,\n                                q[0x6] ^= w,\n                                q[0x7] ^= y;\n                            for (var r = 0x0; r &lt; 0x4; r++) &#123;\n                                m['call'](this);\n                            &#125;\n                        &#125;\n                    &#125;,\n                    '_doProcessBlock': function (n, o) &#123;\n                        var p = this['_X'];\n                        m['call'](this),\n                            i[0x0] = p[0x0] ^ p[0x5] &gt;&gt;&gt; 0x10 ^ p[0x3] &lt;&lt; 0x10,\n                            i[0x1] = p[0x2] ^ p[0x7] &gt;&gt;&gt; 0x10 ^ p[0x5] &lt;&lt; 0x10,\n                            i[0x2] = p[0x4] ^ p[0x1] &gt;&gt;&gt; 0x10 ^ p[0x7] &lt;&lt; 0x10,\n                            i[0x3] = p[0x6] ^ p[0x3] &gt;&gt;&gt; 0x10 ^ p[0x1] &lt;&lt; 0x10;\n                        for (var q = 0x0; q &lt; 0x4; q++) &#123;\n                            i[q] = (i[q] &lt;&lt; 0x8 | i[q] &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (i[q] &lt;&lt; 0x18 | i[q] &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                                n[o + q] ^= i[q];\n                        &#125;\n                    &#125;,\n                    'blockSize': 0x80 / 0x20,\n                    'ivSize': 0x40 / 0x20\n                &#125;);\n\n                function m() &#123;\n                    var n = this['_X']\n                        , o = this['_C'];\n                    for (var p = 0x0; p &lt; 0x8; p++) &#123;\n                        j[p] = o[p];\n                    &#125;\n                    o[0x0] = o[0x0] + 0x4d34d34d + this['_b'] | 0x0,\n                        o[0x1] = o[0x1] + 0xd34d34d3 + (o[0x0] &gt;&gt;&gt; 0x0 &lt; j[0x0] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x2] = o[0x2] + 0x34d34d34 + (o[0x1] &gt;&gt;&gt; 0x0 &lt; j[0x1] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x3] = o[0x3] + 0x4d34d34d + (o[0x2] &gt;&gt;&gt; 0x0 &lt; j[0x2] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x4] = o[0x4] + 0xd34d34d3 + (o[0x3] &gt;&gt;&gt; 0x0 &lt; j[0x3] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x5] = o[0x5] + 0x34d34d34 + (o[0x4] &gt;&gt;&gt; 0x0 &lt; j[0x4] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x6] = o[0x6] + 0x4d34d34d + (o[0x5] &gt;&gt;&gt; 0x0 &lt; j[0x5] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x7] = o[0x7] + 0xd34d34d3 + (o[0x6] &gt;&gt;&gt; 0x0 &lt; j[0x6] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        this['_b'] = o[0x7] &gt;&gt;&gt; 0x0 &lt; j[0x7] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0;\n                    for (var p = 0x0; p &lt; 0x8; p++) &#123;\n                        var q = n[p] + o[p]\n                            , r = q &amp; 0xffff\n                            , s = q &gt;&gt;&gt; 0x10\n                            , t = ((r * r &gt;&gt;&gt; 0x11) + r * s &gt;&gt;&gt; 0xf) + s * s\n                            , u = ((q &amp; 0xffff0000) * q | 0x0) + ((q &amp; 0xffff) * q | 0x0);\n                        k[p] = t ^ u;\n                    &#125;\n                    n[0x0] = k[0x0] + (k[0x7] &lt;&lt; 0x10 | k[0x7] &gt;&gt;&gt; 0x10) + (k[0x6] &lt;&lt; 0x10 | k[0x6] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x1] = k[0x1] + (k[0x0] &lt;&lt; 0x8 | k[0x0] &gt;&gt;&gt; 0x18) + k[0x7] | 0x0,\n                        n[0x2] = k[0x2] + (k[0x1] &lt;&lt; 0x10 | k[0x1] &gt;&gt;&gt; 0x10) + (k[0x0] &lt;&lt; 0x10 | k[0x0] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x3] = k[0x3] + (k[0x2] &lt;&lt; 0x8 | k[0x2] &gt;&gt;&gt; 0x18) + k[0x1] | 0x0,\n                        n[0x4] = k[0x4] + (k[0x3] &lt;&lt; 0x10 | k[0x3] &gt;&gt;&gt; 0x10) + (k[0x2] &lt;&lt; 0x10 | k[0x2] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x5] = k[0x5] + (k[0x4] &lt;&lt; 0x8 | k[0x4] &gt;&gt;&gt; 0x18) + k[0x3] | 0x0,\n                        n[0x6] = k[0x6] + (k[0x5] &lt;&lt; 0x10 | k[0x5] &gt;&gt;&gt; 0x10) + (k[0x4] &lt;&lt; 0x10 | k[0x4] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x7] = k[0x7] + (k[0x6] &lt;&lt; 0x8 | k[0x6] &gt;&gt;&gt; 0x18) + k[0x5] | 0x0;\n                &#125;\n\n                e['RabbitLegacy'] = g['_createHelper'](l);\n            &#125;()),\n                d['RabbitLegacy'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5,\n            './enc-base64': 0x6,\n            './evpkdf': 0x9,\n            './md5': 0xe\n        &#125;],\n    0x1b: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./enc-base64'), a('./md5'), a('./evpkdf'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './enc-base64', './md5', './evpkdf', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['StreamCipher']\n                    , h = e['algo']\n                    , i = []\n                    , j = []\n                    , k = []\n                    , l = h['Rabbit'] = g['extend'](&#123;\n                    '_doReset': function () &#123;\n                        var n = this['_key']['words']\n                            , o = this['cfg']['iv'];\n                        for (var p = 0x0; p &lt; 0x4; p++) &#123;\n                            n[p] = (n[p] &lt;&lt; 0x8 | n[p] &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (n[p] &lt;&lt; 0x18 | n[p] &gt;&gt;&gt; 0x8) &amp; 0xff00ff00;\n                        &#125;\n                        var q = this['_X'] = [n[0x0], n[0x3] &lt;&lt; 0x10 | n[0x2] &gt;&gt;&gt; 0x10, n[0x1], n[0x0] &lt;&lt; 0x10 | n[0x3] &gt;&gt;&gt; 0x10, n[0x2], n[0x1] &lt;&lt; 0x10 | n[0x0] &gt;&gt;&gt; 0x10, n[0x3], n[0x2] &lt;&lt; 0x10 | n[0x1] &gt;&gt;&gt; 0x10]\n                            ,\n                            r = this['_C'] = [n[0x2] &lt;&lt; 0x10 | n[0x2] &gt;&gt;&gt; 0x10, n[0x0] &amp; 0xffff0000 | n[0x1] &amp; 0xffff, n[0x3] &lt;&lt; 0x10 | n[0x3] &gt;&gt;&gt; 0x10, n[0x1] &amp; 0xffff0000 | n[0x2] &amp; 0xffff, n[0x0] &lt;&lt; 0x10 | n[0x0] &gt;&gt;&gt; 0x10, n[0x2] &amp; 0xffff0000 | n[0x3] &amp; 0xffff, n[0x1] &lt;&lt; 0x10 | n[0x1] &gt;&gt;&gt; 0x10, n[0x3] &amp; 0xffff0000 | n[0x0] &amp; 0xffff];\n                        this['_b'] = 0x0;\n                        for (var p = 0x0; p &lt; 0x4; p++) &#123;\n                            m['call'](this);\n                        &#125;\n                        for (var p = 0x0; p &lt; 0x8; p++) &#123;\n                            r[p] ^= q[p + 0x4 &amp; 0x7];\n                        &#125;\n                        if (o) &#123;\n                            var s = o['words']\n                                , t = s[0x0]\n                                , u = s[0x1]\n                                , v = (t &lt;&lt; 0x8 | t &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (t &lt;&lt; 0x18 | t &gt;&gt;&gt; 0x8) &amp; 0xff00ff00\n                                , w = (u &lt;&lt; 0x8 | u &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (u &lt;&lt; 0x18 | u &gt;&gt;&gt; 0x8) &amp; 0xff00ff00\n                                , x = v &gt;&gt;&gt; 0x10 | w &amp; 0xffff0000\n                                , y = w &lt;&lt; 0x10 | v &amp; 0xffff;\n                            r[0x0] ^= v,\n                                r[0x1] ^= x,\n                                r[0x2] ^= w,\n                                r[0x3] ^= y,\n                                r[0x4] ^= v,\n                                r[0x5] ^= x,\n                                r[0x6] ^= w,\n                                r[0x7] ^= y;\n                            for (var p = 0x0; p &lt; 0x4; p++) &#123;\n                                m['call'](this);\n                            &#125;\n                        &#125;\n                    &#125;,\n                    '_doProcessBlock': function (n, o) &#123;\n                        var p = this['_X'];\n                        m['call'](this),\n                            i[0x0] = p[0x0] ^ p[0x5] &gt;&gt;&gt; 0x10 ^ p[0x3] &lt;&lt; 0x10,\n                            i[0x1] = p[0x2] ^ p[0x7] &gt;&gt;&gt; 0x10 ^ p[0x5] &lt;&lt; 0x10,\n                            i[0x2] = p[0x4] ^ p[0x1] &gt;&gt;&gt; 0x10 ^ p[0x7] &lt;&lt; 0x10,\n                            i[0x3] = p[0x6] ^ p[0x3] &gt;&gt;&gt; 0x10 ^ p[0x1] &lt;&lt; 0x10;\n                        for (var q = 0x0; q &lt; 0x4; q++) &#123;\n                            i[q] = (i[q] &lt;&lt; 0x8 | i[q] &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (i[q] &lt;&lt; 0x18 | i[q] &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                                n[o + q] ^= i[q];\n                        &#125;\n                    &#125;,\n                    'blockSize': 0x80 / 0x20,\n                    'ivSize': 0x40 / 0x20\n                &#125;);\n\n                function m() &#123;\n                    var n = this['_X']\n                        , o = this['_C'];\n                    for (var p = 0x0; p &lt; 0x8; p++) &#123;\n                        j[p] = o[p];\n                    &#125;\n                    o[0x0] = o[0x0] + 0x4d34d34d + this['_b'] | 0x0,\n                        o[0x1] = o[0x1] + 0xd34d34d3 + (o[0x0] &gt;&gt;&gt; 0x0 &lt; j[0x0] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x2] = o[0x2] + 0x34d34d34 + (o[0x1] &gt;&gt;&gt; 0x0 &lt; j[0x1] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x3] = o[0x3] + 0x4d34d34d + (o[0x2] &gt;&gt;&gt; 0x0 &lt; j[0x2] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x4] = o[0x4] + 0xd34d34d3 + (o[0x3] &gt;&gt;&gt; 0x0 &lt; j[0x3] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x5] = o[0x5] + 0x34d34d34 + (o[0x4] &gt;&gt;&gt; 0x0 &lt; j[0x4] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x6] = o[0x6] + 0x4d34d34d + (o[0x5] &gt;&gt;&gt; 0x0 &lt; j[0x5] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        o[0x7] = o[0x7] + 0xd34d34d3 + (o[0x6] &gt;&gt;&gt; 0x0 &lt; j[0x6] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                        this['_b'] = o[0x7] &gt;&gt;&gt; 0x0 &lt; j[0x7] &gt;&gt;&gt; 0x0 ? 0x1 : 0x0;\n                    for (var p = 0x0; p &lt; 0x8; p++) &#123;\n                        var q = n[p] + o[p]\n                            , r = q &amp; 0xffff\n                            , s = q &gt;&gt;&gt; 0x10\n                            , t = ((r * r &gt;&gt;&gt; 0x11) + r * s &gt;&gt;&gt; 0xf) + s * s\n                            , u = ((q &amp; 0xffff0000) * q | 0x0) + ((q &amp; 0xffff) * q | 0x0);\n                        k[p] = t ^ u;\n                    &#125;\n                    n[0x0] = k[0x0] + (k[0x7] &lt;&lt; 0x10 | k[0x7] &gt;&gt;&gt; 0x10) + (k[0x6] &lt;&lt; 0x10 | k[0x6] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x1] = k[0x1] + (k[0x0] &lt;&lt; 0x8 | k[0x0] &gt;&gt;&gt; 0x18) + k[0x7] | 0x0,\n                        n[0x2] = k[0x2] + (k[0x1] &lt;&lt; 0x10 | k[0x1] &gt;&gt;&gt; 0x10) + (k[0x0] &lt;&lt; 0x10 | k[0x0] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x3] = k[0x3] + (k[0x2] &lt;&lt; 0x8 | k[0x2] &gt;&gt;&gt; 0x18) + k[0x1] | 0x0,\n                        n[0x4] = k[0x4] + (k[0x3] &lt;&lt; 0x10 | k[0x3] &gt;&gt;&gt; 0x10) + (k[0x2] &lt;&lt; 0x10 | k[0x2] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x5] = k[0x5] + (k[0x4] &lt;&lt; 0x8 | k[0x4] &gt;&gt;&gt; 0x18) + k[0x3] | 0x0,\n                        n[0x6] = k[0x6] + (k[0x5] &lt;&lt; 0x10 | k[0x5] &gt;&gt;&gt; 0x10) + (k[0x4] &lt;&lt; 0x10 | k[0x4] &gt;&gt;&gt; 0x10) | 0x0,\n                        n[0x7] = k[0x7] + (k[0x6] &lt;&lt; 0x8 | k[0x6] &gt;&gt;&gt; 0x18) + k[0x5] | 0x0;\n                &#125;\n\n                e['Rabbit'] = g['_createHelper'](l);\n            &#125;()),\n                d['Rabbit'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5,\n            './enc-base64': 0x6,\n            './evpkdf': 0x9,\n            './md5': 0xe\n        &#125;],\n    0x1c: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./enc-base64'), a('./md5'), a('./evpkdf'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './enc-base64', './md5', './evpkdf', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['StreamCipher']\n                    , h = e['algo']\n                    , i = h['RC4'] = g['extend'](&#123;\n                    '_doReset': function () &#123;\n                        var l = this['_key']\n                            , m = l['words']\n                            , n = l['sigBytes']\n                            , o = this['_S'] = [];\n                        for (var p = 0x0; p &lt; 0x100; p++) &#123;\n                            o[p] = p;\n                        &#125;\n                        for (var p = 0x0, q = 0x0; p &lt; 0x100; p++) &#123;\n                            var r = p % n\n                                , s = m[r &gt;&gt;&gt; 0x2] &gt;&gt;&gt; 0x18 - r % 0x4 * 0x8 &amp; 0xff;\n                            q = (q + o[p] + s) % 0x100;\n                            var u = o[p];\n                            o[p] = o[q],\n                                o[q] = u;\n                        &#125;\n                        this['_i'] = this['_j'] = 0x0;\n                    &#125;,\n                    '_doProcessBlock': function (l, m) &#123;\n                        l[m] ^= j['call'](this);\n                    &#125;,\n                    'keySize': 0x100 / 0x20,\n                    'ivSize': 0x0\n                &#125;);\n\n                function j() &#123;\n                    var l = this['_S']\n                        , m = this['_i']\n                        , o = this['_j']\n                        , p = 0x0;\n                    for (var q = 0x0; q &lt; 0x4; q++) &#123;\n                        m = (m + 0x1) % 0x100,\n                            o = (o + l[m]) % 0x100;\n                        var r = l[m];\n                        l[m] = l[o],\n                            l[o] = r,\n                            p |= l[(l[m] + l[o]) % 0x100] &lt;&lt; 0x18 - q * 0x8;\n                    &#125;\n                    return this['_i'] = m,\n                        this['_j'] = o,\n                        p;\n                &#125;\n\n                e['RC4'] = g['_createHelper'](i);\n                var k = h['RC4Drop'] = i['extend'](&#123;\n                    'cfg': i['cfg']['extend'](&#123;\n                        'drop': 0xc0\n                    &#125;),\n                    '_doReset': function () &#123;\n                        i['_doReset']['call'](this);\n                        for (var l = this['cfg']['drop']; l &gt; 0x0; l--) &#123;\n                            j['call'](this);\n                        &#125;\n                    &#125;\n                &#125;);\n                e['RC4Drop'] = g['_createHelper'](k);\n            &#125;()),\n                d['RC4'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5,\n            './enc-base64': 0x6,\n            './evpkdf': 0x9,\n            './md5': 0xe\n        &#125;],\n    0x1d: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['WordArray']\n                    , i = g['Hasher']\n                    , j = f['algo']\n                    ,\n                    k = h['create']([0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x7, 0x4, 0xd, 0x1, 0xa, 0x6, 0xf, 0x3, 0xc, 0x0, 0x9, 0x5, 0x2, 0xe, 0xb, 0x8, 0x3, 0xa, 0xe, 0x4, 0x9, 0xf, 0x8, 0x1, 0x2, 0x7, 0x0, 0x6, 0xd, 0xb, 0x5, 0xc, 0x1, 0x9, 0xb, 0xa, 0x0, 0x8, 0xc, 0x4, 0xd, 0x3, 0x7, 0xf, 0xe, 0x5, 0x6, 0x2, 0x4, 0x0, 0x5, 0x9, 0x7, 0xc, 0x2, 0xa, 0xe, 0x1, 0x3, 0x8, 0xb, 0x6, 0xf, 0xd])\n                    ,\n                    l = h['create']([0x5, 0xe, 0x7, 0x0, 0x9, 0x2, 0xb, 0x4, 0xd, 0x6, 0xf, 0x8, 0x1, 0xa, 0x3, 0xc, 0x6, 0xb, 0x3, 0x7, 0x0, 0xd, 0x5, 0xa, 0xe, 0xf, 0x8, 0xc, 0x4, 0x9, 0x1, 0x2, 0xf, 0x5, 0x1, 0x3, 0x7, 0xe, 0x6, 0x9, 0xb, 0x8, 0xc, 0x2, 0xa, 0x0, 0x4, 0xd, 0x8, 0x6, 0x4, 0x1, 0x3, 0xb, 0xf, 0x0, 0x5, 0xc, 0x2, 0xd, 0x9, 0x7, 0xa, 0xe, 0xc, 0xf, 0xa, 0x4, 0x1, 0x5, 0x8, 0x7, 0x6, 0x2, 0xd, 0xe, 0x0, 0x3, 0x9, 0xb])\n                    ,\n                    m = h['create']([0xb, 0xe, 0xf, 0xc, 0x5, 0x8, 0x7, 0x9, 0xb, 0xd, 0xe, 0xf, 0x6, 0x7, 0x9, 0x8, 0x7, 0x6, 0x8, 0xd, 0xb, 0x9, 0x7, 0xf, 0x7, 0xc, 0xf, 0x9, 0xb, 0x7, 0xd, 0xc, 0xb, 0xd, 0x6, 0x7, 0xe, 0x9, 0xd, 0xf, 0xe, 0x8, 0xd, 0x6, 0x5, 0xc, 0x7, 0x5, 0xb, 0xc, 0xe, 0xf, 0xe, 0xf, 0x9, 0x8, 0x9, 0xe, 0x5, 0x6, 0x8, 0x6, 0x5, 0xc, 0x9, 0xf, 0x5, 0xb, 0x6, 0x8, 0xd, 0xc, 0x5, 0xc, 0xd, 0xe, 0xb, 0x8, 0x5, 0x6])\n                    ,\n                    n = h['create']([0x8, 0x9, 0x9, 0xb, 0xd, 0xf, 0xf, 0x5, 0x7, 0x7, 0x8, 0xb, 0xe, 0xe, 0xc, 0x6, 0x9, 0xd, 0xf, 0x7, 0xc, 0x8, 0x9, 0xb, 0x7, 0x7, 0xc, 0x7, 0x6, 0xf, 0xd, 0xb, 0x9, 0x7, 0xf, 0xb, 0x8, 0x6, 0x6, 0xe, 0xc, 0xd, 0x5, 0xe, 0xd, 0xd, 0x7, 0x5, 0xf, 0x5, 0x8, 0xb, 0xe, 0xe, 0x6, 0xe, 0x6, 0x9, 0xc, 0x9, 0xc, 0x5, 0xf, 0x8, 0x8, 0x5, 0xc, 0x9, 0xc, 0x5, 0xe, 0x6, 0x8, 0xd, 0x6, 0x5, 0xf, 0xd, 0xb, 0xb])\n                    , o = h['create']([0x0, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e])\n                    , p = h['create']([0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x0])\n                    , q = j['RIPEMD160'] = i['extend'](&#123;\n                        '_doReset': function () &#123;\n                            this['_hash'] = h['create']([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]);\n                        &#125;,\n                        '_doProcessBlock': function (x, y) &#123;\n                            for (var z = 0x0; z &lt; 0x10; z++) &#123;\n                                var A = y + z\n                                    , B = x[A];\n                                x[A] = (B &lt;&lt; 0x8 | B &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (B &lt;&lt; 0x18 | B &gt;&gt;&gt; 0x8) &amp; 0xff00ff00;\n                            &#125;\n                            var D = this['_hash']['words'], E = o['words'], F = p['words'], G = k['words'], I = l['words'],\n                                J = m['words'], K = n['words'], L, N, O, P, Q, R, S, T, U, V;\n                            R = L = D[0x0],\n                                S = N = D[0x1],\n                                T = O = D[0x2],\n                                U = P = D[0x3],\n                                V = Q = D[0x4];\n                            var W;\n                            for (var z = 0x0; z &lt; 0x50; z += 0x1) &#123;\n                                W = L + x[y + G[z]] | 0x0;\n                                if (z &lt; 0x10)\n                                    W += r(N, O, P) + E[0x0];\n                                else &#123;\n                                    if (z &lt; 0x20)\n                                        W += s(N, O, P) + E[0x1];\n                                    else &#123;\n                                        if (z &lt; 0x30)\n                                            W += t(N, O, P) + E[0x2];\n                                        else\n                                            z &lt; 0x40 ? W += u(N, O, P) + E[0x3] : W += v(N, O, P) + E[0x4];\n                                    &#125;\n                                &#125;\n                                W = W | 0x0,\n                                    W = w(W, J[z]),\n                                    W = W + Q | 0x0,\n                                    L = Q,\n                                    Q = P,\n                                    P = w(O, 0xa),\n                                    O = N,\n                                    N = W,\n                                    W = R + x[y + I[z]] | 0x0;\n                                if (z &lt; 0x10)\n                                    W += v(S, T, U) + F[0x0];\n                                else &#123;\n                                    if (z &lt; 0x20)\n                                        W += u(S, T, U) + F[0x1];\n                                    else &#123;\n                                        if (z &lt; 0x30)\n                                            W += t(S, T, U) + F[0x2];\n                                        else\n                                            z &lt; 0x40 ? W += s(S, T, U) + F[0x3] : W += r(S, T, U) + F[0x4];\n                                    &#125;\n                                &#125;\n                                W = W | 0x0,\n                                    W = w(W, K[z]),\n                                    W = W + V | 0x0,\n                                    R = V,\n                                    V = U,\n                                    U = w(T, 0xa),\n                                    T = S,\n                                    S = W;\n                            &#125;\n                            W = D[0x1] + O + U | 0x0,\n                                D[0x1] = D[0x2] + P + V | 0x0,\n                                D[0x2] = D[0x3] + Q + R | 0x0,\n                                D[0x3] = D[0x4] + L + S | 0x0,\n                                D[0x4] = D[0x0] + N + T | 0x0,\n                                D[0x0] = W;\n                        &#125;,\n                        '_doFinalize': function () &#123;\n                            var x = this['_data']\n                                , y = x['words']\n                                , z = this['_nDataBytes'] * 0x8\n                                , A = x['sigBytes'] * 0x8;\n                            y[A &gt;&gt;&gt; 0x5] |= 0x80 &lt;&lt; 0x18 - A % 0x20,\n                                y[(A + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xe] = (z &lt;&lt; 0x8 | z &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (z &lt;&lt; 0x18 | z &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                                x['sigBytes'] = (y['length'] + 0x1) * 0x4,\n                                this['_process']();\n                            var B = this['_hash']\n                                , D = B['words'];\n                            for (var E = 0x0; E &lt; 0x5; E++) &#123;\n                                var F = D[E];\n                                D[E] = (F &lt;&lt; 0x8 | F &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (F &lt;&lt; 0x18 | F &gt;&gt;&gt; 0x8) &amp; 0xff00ff00;\n                            &#125;\n                            return B;\n                        &#125;,\n                        'clone': function () &#123;\n                            var x = i['clone']['call'](this);\n                            return x['_hash'] = this['_hash']['clone'](),\n                                x;\n                        &#125;\n                    &#125;);\n\n                function r(A, B, D) &#123;\n                    return A ^ B ^ D;\n                &#125;\n\n                function s(A, B, D) &#123;\n                    return A &amp; B | ~A &amp; D;\n                &#125;\n\n                function t(A, B, D) &#123;\n                    return (A | ~B) ^ D;\n                &#125;\n\n                function u(A, B, D) &#123;\n                    return A &amp; D | B &amp; ~D;\n                &#125;\n\n                function v(A, B, D) &#123;\n                    return A ^ (B | ~D);\n                &#125;\n\n                function w(y, z) &#123;\n                    return y &lt;&lt; z | y &gt;&gt;&gt; 0x20 - z;\n                &#125;\n\n                f['RIPEMD160'] = i['_createHelper'](q),\n                    f['HmacRIPEMD160'] = i['_createHmacHelper'](q);\n            &#125;(Math),\n                d['RIPEMD160'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0x1e: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = f['Hasher']\n                    , i = e['algo']\n                    , j = []\n                    , k = i['SHA1'] = h['extend'](&#123;\n                    '_doReset': function () &#123;\n                        this['_hash'] = new g['init']([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]);\n                    &#125;,\n                    '_doProcessBlock': function (l, m) &#123;\n                        var o = this['_hash']['words']\n                            , p = o[0x0]\n                            , q = o[0x1]\n                            , r = o[0x2]\n                            , s = o[0x3]\n                            , u = o[0x4];\n                        for (var v = 0x0; v &lt; 0x50; v++) &#123;\n                            if (v &lt; 0x10)\n                                j[v] = l[m + v] | 0x0;\n                            else &#123;\n                                var w = j[v - 0x3] ^ j[v - 0x8] ^ j[v - 0xe] ^ j[v - 0x10];\n                                j[v] = w &lt;&lt; 0x1 | w &gt;&gt;&gt; 0x1f;\n                            &#125;\n                            var x = (p &lt;&lt; 0x5 | p &gt;&gt;&gt; 0x1b) + u + j[v];\n                            if (v &lt; 0x14)\n                                x += (q &amp; r | ~q &amp; s) + 0x5a827999;\n                            else &#123;\n                                if (v &lt; 0x28)\n                                    x += (q ^ r ^ s) + 0x6ed9eba1;\n                                else\n                                    v &lt; 0x3c ? x += (q &amp; r | q &amp; s | r &amp; s) - 0x70e44324 : x += (q ^ r ^ s) - 0x359d3e2a;\n                            &#125;\n                            u = s,\n                                s = r,\n                                r = q &lt;&lt; 0x1e | q &gt;&gt;&gt; 0x2,\n                                q = p,\n                                p = x;\n                        &#125;\n                        o[0x0] = o[0x0] + p | 0x0,\n                            o[0x1] = o[0x1] + q | 0x0,\n                            o[0x2] = o[0x2] + r | 0x0,\n                            o[0x3] = o[0x3] + s | 0x0,\n                            o[0x4] = o[0x4] + u | 0x0;\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var l = this['_data']\n                            , m = l['words']\n                            , n = this['_nDataBytes'] * 0x8\n                            , o = l['sigBytes'] * 0x8;\n                        return m[o &gt;&gt;&gt; 0x5] |= 0x80 &lt;&lt; 0x18 - o % 0x20,\n                            m[(o + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xe] = Math['floor'](n / 0x100000000),\n                            m[(o + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xf] = n,\n                            l['sigBytes'] = m['length'] * 0x4,\n                            this['_process'](),\n                            this['_hash'];\n                    &#125;,\n                    'clone': function () &#123;\n                        var l = h['clone']['call'](this);\n                        return l['_hash'] = this['_hash']['clone'](),\n                            l;\n                    &#125;\n                &#125;);\n                e['SHA1'] = h['_createHelper'](k),\n                    e['HmacSHA1'] = h['_createHmacHelper'](k);\n            &#125;()),\n                d['SHA1'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0x1f: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./sha256'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './sha256'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = e['algo']\n                    , i = h['SHA256']\n                    , j = h['SHA224'] = i['extend'](&#123;\n                    '_doReset': function () &#123;\n                        this['_hash'] = new g['init']([0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]);\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var k = i['_doFinalize']['call'](this);\n                        return k['sigBytes'] -= 0x4,\n                            k;\n                    &#125;\n                &#125;);\n                e['SHA224'] = i['_createHelper'](j),\n                    e['HmacSHA224'] = i['_createHmacHelper'](j);\n            &#125;()),\n                d['SHA224'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './sha256': 0x20\n        &#125;],\n    0x20: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['WordArray']\n                    , i = g['Hasher']\n                    , j = f['algo']\n                    , k = []\n                    , l = [];\n                (function () &#123;\n                    function o(s) &#123;\n                        var t = e['sqrt'](s);\n                        for (var u = 0x2; u &lt;= t; u++) &#123;\n                            if (!(s % u))\n                                return ![];\n                        &#125;\n                        return !![];\n                    &#125;\n\n                    function p(s) &#123;\n                        return (s - (s | 0x0)) * 0x100000000 | 0x0;\n                    &#125;\n\n                    var q = 0x2\n                        , r = 0x0;\n                    while (r &lt; 0x40) &#123;\n                        o(q) &amp;&amp; (r &lt; 0x8 &amp;&amp; (k[r] = p(e['pow'](q, 0x1 / 0x2))),\n                            l[r] = p(e['pow'](q, 0x1 / 0x3)),\n                            r++),\n                            q++;\n                    &#125;\n                &#125;());\n                var m = []\n                    , n = j['SHA256'] = i['extend'](&#123;\n                    '_doReset': function () &#123;\n                        this['_hash'] = new h['init'](k['slice'](0x0));\n                    &#125;,\n                    '_doProcessBlock': function (o, p) &#123;\n                        var q = this['_hash']['words']\n                            , r = q[0x0]\n                            , s = q[0x1]\n                            , t = q[0x2]\n                            , u = q[0x3]\n                            , v = q[0x4]\n                            , w = q[0x5]\n                            , x = q[0x6]\n                            , y = q[0x7];\n                        for (var z = 0x0; z &lt; 0x40; z++) &#123;\n                            if (z &lt; 0x10)\n                                m[z] = o[p + z] | 0x0;\n                            else &#123;\n                                var A = m[z - 0xf]\n                                    , B = (A &lt;&lt; 0x19 | A &gt;&gt;&gt; 0x7) ^ (A &lt;&lt; 0xe | A &gt;&gt;&gt; 0x12) ^ A &gt;&gt;&gt; 0x3\n                                    , D = m[z - 0x2]\n                                    , E = (D &lt;&lt; 0xf | D &gt;&gt;&gt; 0x11) ^ (D &lt;&lt; 0xd | D &gt;&gt;&gt; 0x13) ^ D &gt;&gt;&gt; 0xa;\n                                m[z] = B + m[z - 0x7] + E + m[z - 0x10];\n                            &#125;\n                            var F = v &amp; w ^ ~v &amp; x\n                                , G = r &amp; s ^ r &amp; t ^ s &amp; t\n                                , I = (r &lt;&lt; 0x1e | r &gt;&gt;&gt; 0x2) ^ (r &lt;&lt; 0x13 | r &gt;&gt;&gt; 0xd) ^ (r &lt;&lt; 0xa | r &gt;&gt;&gt; 0x16)\n                                , J = (v &lt;&lt; 0x1a | v &gt;&gt;&gt; 0x6) ^ (v &lt;&lt; 0x15 | v &gt;&gt;&gt; 0xb) ^ (v &lt;&lt; 0x7 | v &gt;&gt;&gt; 0x19)\n                                , L = y + J + F + l[z] + m[z]\n                                , N = I + G;\n                            y = x,\n                                x = w,\n                                w = v,\n                                v = u + L | 0x0,\n                                u = t,\n                                t = s,\n                                s = r,\n                                r = L + N | 0x0;\n                        &#125;\n                        q[0x0] = q[0x0] + r | 0x0,\n                            q[0x1] = q[0x1] + s | 0x0,\n                            q[0x2] = q[0x2] + t | 0x0,\n                            q[0x3] = q[0x3] + u | 0x0,\n                            q[0x4] = q[0x4] + v | 0x0,\n                            q[0x5] = q[0x5] + w | 0x0,\n                            q[0x6] = q[0x6] + x | 0x0,\n                            q[0x7] = q[0x7] + y | 0x0;\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var o = this['_data']\n                            , p = o['words']\n                            , q = this['_nDataBytes'] * 0x8\n                            , r = o['sigBytes'] * 0x8;\n                        return p[r &gt;&gt;&gt; 0x5] |= 0x80 &lt;&lt; 0x18 - r % 0x20,\n                            p[(r + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xe] = e['floor'](q / 0x100000000),\n                            p[(r + 0x40 &gt;&gt;&gt; 0x9 &lt;&lt; 0x4) + 0xf] = q,\n                            o['sigBytes'] = p['length'] * 0x4,\n                            this['_process'](),\n                            this['_hash'];\n                    &#125;,\n                    'clone': function () &#123;\n                        var o = i['clone']['call'](this);\n                        return o['_hash'] = this['_hash']['clone'](),\n                            o;\n                    &#125;\n                &#125;);\n                f['SHA256'] = i['_createHelper'](n),\n                    f['HmacSHA256'] = i['_createHmacHelper'](n);\n            &#125;(Math),\n                d['SHA256'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;],\n    0x21: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./x64-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './x64-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['WordArray']\n                    , i = g['Hasher']\n                    , j = f['x64']\n                    , k = j['Word']\n                    , l = f['algo']\n                    , m = []\n                    , n = []\n                    , o = [];\n                (function () &#123;\n                    var r = 0x1\n                        , s = 0x0;\n                    for (var u = 0x0; u &lt; 0x18; u++) &#123;\n                        m[r + 0x5 * s] = (u + 0x1) * (u + 0x2) / 0x2 % 0x40;\n                        var v = s % 0x5\n                            , w = (0x2 * r + 0x3 * s) % 0x5;\n                        r = v,\n                            s = w;\n                    &#125;\n                    for (var r = 0x0; r &lt; 0x5; r++) &#123;\n                        for (var s = 0x0; s &lt; 0x5; s++) &#123;\n                            n[r + 0x5 * s] = s + (0x2 * r + 0x3 * s) % 0x5 * 0x5;\n                        &#125;\n                    &#125;\n                    var z = 0x1;\n                    for (var A = 0x0; A &lt; 0x18; A++) &#123;\n                        var B = 0x0\n                            , D = 0x0;\n                        for (var E = 0x0; E &lt; 0x7; E++) &#123;\n                            if (z &amp; 0x1) &#123;\n                                var F = (0x1 &lt;&lt; E) - 0x1;\n                                F &lt; 0x20 ? D ^= 0x1 &lt;&lt; F : B ^= 0x1 &lt;&lt; F - 0x20;\n                            &#125;\n                            z &amp; 0x80 ? z = z &lt;&lt; 0x1 ^ 0x71 : z &lt;&lt;= 0x1;\n                        &#125;\n                        o[A] = k['create'](B, D);\n                    &#125;\n                &#125;());\n                var p = [];\n                (function () &#123;\n                    for (var r = 0x0; r &lt; 0x19; r++) &#123;\n                        p[r] = k['create']();\n                    &#125;\n                &#125;());\n                var q = l['SHA3'] = i['extend'](&#123;\n                    'cfg': i['cfg']['extend'](&#123;\n                        'outputLength': 0x200\n                    &#125;),\n                    '_doReset': function () &#123;\n                        var r = this['_state'] = [];\n                        for (var s = 0x0; s &lt; 0x19; s++) &#123;\n                            r[s] = new k['init']();\n                        &#125;\n                        this['blockSize'] = (0x640 - 0x2 * this['cfg']['outputLength']) / 0x20;\n                    &#125;,\n                    '_doProcessBlock': function (r, s) &#123;\n                        var t = this['_state']\n                            , u = this['blockSize'] / 0x2;\n                        for (var v = 0x0; v &lt; u; v++) &#123;\n                            var w = r[s + 0x2 * v]\n                                , z = r[s + 0x2 * v + 0x1];\n                            w = (w &lt;&lt; 0x8 | w &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (w &lt;&lt; 0x18 | w &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                                z = (z &lt;&lt; 0x8 | z &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (z &lt;&lt; 0x18 | z &gt;&gt;&gt; 0x8) &amp; 0xff00ff00;\n                            var A = t[v];\n                            A['high'] ^= z,\n                                A['low'] ^= w;\n                        &#125;\n                        for (var B = 0x0; B &lt; 0x18; B++) &#123;\n                            for (var D = 0x0; D &lt; 0x5; D++) &#123;\n                                var E = 0x0\n                                    , F = 0x0;\n                                for (var G = 0x0; G &lt; 0x5; G++) &#123;\n                                    var A = t[D + 0x5 * G];\n                                    E ^= A['high'],\n                                        F ^= A['low'];\n                                &#125;\n                                var H = p[D];\n                                H['high'] = E,\n                                    H['low'] = F;\n                            &#125;\n                            for (var D = 0x0; D &lt; 0x5; D++) &#123;\n                                var I = p[(D + 0x4) % 0x5]\n                                    , J = p[(D + 0x1) % 0x5]\n                                    , K = J['high']\n                                    , L = J['low']\n                                    , E = I['high'] ^ (K &lt;&lt; 0x1 | L &gt;&gt;&gt; 0x1f)\n                                    , F = I['low'] ^ (L &lt;&lt; 0x1 | K &gt;&gt;&gt; 0x1f);\n                                for (var G = 0x0; G &lt; 0x5; G++) &#123;\n                                    var A = t[D + 0x5 * G];\n                                    A['high'] ^= E,\n                                        A['low'] ^= F;\n                                &#125;\n                            &#125;\n                            for (var N = 0x1; N &lt; 0x19; N++) &#123;\n                                var E, F, A = t[N], O = A['high'], P = A['low'], Q = m[N];\n                                Q &lt; 0x20 ? (E = O &lt;&lt; Q | P &gt;&gt;&gt; 0x20 - Q,\n                                    F = P &lt;&lt; Q | O &gt;&gt;&gt; 0x20 - Q) : (E = P &lt;&lt; Q - 0x20 | O &gt;&gt;&gt; 0x40 - Q,\n                                    F = O &lt;&lt; Q - 0x20 | P &gt;&gt;&gt; 0x40 - Q);\n                                var R = p[n[N]];\n                                R['high'] = E,\n                                    R['low'] = F;\n                            &#125;\n                            var S = p[0x0]\n                                , U = t[0x0];\n                            S['high'] = U['high'],\n                                S['low'] = U['low'];\n                            for (var D = 0x0; D &lt; 0x5; D++) &#123;\n                                for (var G = 0x0; G &lt; 0x5; G++) &#123;\n                                    var N = D + 0x5 * G\n                                        , A = t[N]\n                                        , V = p[N]\n                                        , W = p[(D + 0x1) % 0x5 + 0x5 * G]\n                                        , X = p[(D + 0x2) % 0x5 + 0x5 * G];\n                                    A['high'] = V['high'] ^ ~W['high'] &amp; X['high'],\n                                        A['low'] = V['low'] ^ ~W['low'] &amp; X['low'];\n                                &#125;\n                            &#125;\n                            var A = t[0x0]\n                                , Y = o[B];\n                            A['high'] ^= Y['high'],\n                                A['low'] ^= Y['low'];\n                        &#125;\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var r = this['_data']\n                            , s = r['words']\n                            , t = this['_nDataBytes'] * 0x8\n                            , u = r['sigBytes'] * 0x8\n                            , v = this['blockSize'] * 0x20;\n                        s[u &gt;&gt;&gt; 0x5] |= 0x1 &lt;&lt; 0x18 - u % 0x20,\n                            s[(e['ceil']((u + 0x1) / v) * v &gt;&gt;&gt; 0x5) - 0x1] |= 0x80,\n                            r['sigBytes'] = s['length'] * 0x4,\n                            this['_process']();\n                        var w = this['_state']\n                            , x = this['cfg']['outputLength'] / 0x8\n                            , y = x / 0x8\n                            , z = [];\n                        for (var A = 0x0; A &lt; y; A++) &#123;\n                            var B = w[A]\n                                , D = B['high']\n                                , E = B['low'];\n                            D = (D &lt;&lt; 0x8 | D &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (D &lt;&lt; 0x18 | D &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                                E = (E &lt;&lt; 0x8 | E &gt;&gt;&gt; 0x18) &amp; 0xff00ff | (E &lt;&lt; 0x18 | E &gt;&gt;&gt; 0x8) &amp; 0xff00ff00,\n                                z['push'](E),\n                                z['push'](D);\n                        &#125;\n                        return new h['init'](z, x);\n                    &#125;,\n                    'clone': function () &#123;\n                        var r = i['clone']['call'](this)\n                            , s = r['_state'] = this['_state']['slice'](0x0);\n                        for (var t = 0x0; t &lt; 0x19; t++) &#123;\n                            s[t] = s[t]['clone']();\n                        &#125;\n                        return r;\n                    &#125;\n                &#125;);\n                f['SHA3'] = i['_createHelper'](q),\n                    f['HmacSHA3'] = i['_createHmacHelper'](q);\n            &#125;(Math),\n                d['SHA3'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './x64-core': 0x25\n        &#125;],\n    0x22: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./x64-core'), a('./sha512'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './x64-core', './sha512'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['x64']\n                    , g = f['Word']\n                    , h = f['WordArray']\n                    , i = e['algo']\n                    , j = i['SHA512']\n                    , k = i['SHA384'] = j['extend'](&#123;\n                    '_doReset': function () &#123;\n                        this['_hash'] = new h['init']([new g['init'](0xcbbb9d5d, 0xc1059ed8), new g['init'](0x629a292a, 0x367cd507), new g['init'](0x9159015a, 0x3070dd17), new g['init'](0x152fecd8, 0xf70e5939), new g['init'](0x67332667, 0xffc00b31), new g['init'](0x8eb44a87, 0x68581511), new g['init'](0xdb0c2e0d, 0x64f98fa7), new g['init'](0x47b5481d, 0xbefa4fa4)]);\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var l = j['_doFinalize']['call'](this);\n                        return l['sigBytes'] -= 0x10,\n                            l;\n                    &#125;\n                &#125;);\n                e['SHA384'] = j['_createHelper'](k),\n                    e['HmacSHA384'] = j['_createHmacHelper'](k);\n            &#125;()),\n                d['SHA384'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './sha512': 0x23,\n            './x64-core': 0x25\n        &#125;],\n    0x23: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./x64-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './x64-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['Hasher']\n                    , h = e['x64']\n                    , i = h['Word']\n                    , j = h['WordArray']\n                    , k = e['algo'];\n\n                function l() &#123;\n                    return i['create']['apply'](i, arguments);\n                &#125;\n\n                var m = [l(0x428a2f98, 0xd728ae22), l(0x71374491, 0x23ef65cd), l(0xb5c0fbcf, 0xec4d3b2f), l(0xe9b5dba5, 0x8189dbbc), l(0x3956c25b, 0xf348b538), l(0x59f111f1, 0xb605d019), l(0x923f82a4, 0xaf194f9b), l(0xab1c5ed5, 0xda6d8118), l(0xd807aa98, 0xa3030242), l(0x12835b01, 0x45706fbe), l(0x243185be, 0x4ee4b28c), l(0x550c7dc3, 0xd5ffb4e2), l(0x72be5d74, 0xf27b896f), l(0x80deb1fe, 0x3b1696b1), l(0x9bdc06a7, 0x25c71235), l(0xc19bf174, 0xcf692694), l(0xe49b69c1, 0x9ef14ad2), l(0xefbe4786, 0x384f25e3), l(0xfc19dc6, 0x8b8cd5b5), l(0x240ca1cc, 0x77ac9c65), l(0x2de92c6f, 0x592b0275), l(0x4a7484aa, 0x6ea6e483), l(0x5cb0a9dc, 0xbd41fbd4), l(0x76f988da, 0x831153b5), l(0x983e5152, 0xee66dfab), l(0xa831c66d, 0x2db43210), l(0xb00327c8, 0x98fb213f), l(0xbf597fc7, 0xbeef0ee4), l(0xc6e00bf3, 0x3da88fc2), l(0xd5a79147, 0x930aa725), l(0x6ca6351, 0xe003826f), l(0x14292967, 0xa0e6e70), l(0x27b70a85, 0x46d22ffc), l(0x2e1b2138, 0x5c26c926), l(0x4d2c6dfc, 0x5ac42aed), l(0x53380d13, 0x9d95b3df), l(0x650a7354, 0x8baf63de), l(0x766a0abb, 0x3c77b2a8), l(0x81c2c92e, 0x47edaee6), l(0x92722c85, 0x1482353b), l(0xa2bfe8a1, 0x4cf10364), l(0xa81a664b, 0xbc423001), l(0xc24b8b70, 0xd0f89791), l(0xc76c51a3, 0x654be30), l(0xd192e819, 0xd6ef5218), l(0xd6990624, 0x5565a910), l(0xf40e3585, 0x5771202a), l(0x106aa070, 0x32bbd1b8), l(0x19a4c116, 0xb8d2d0c8), l(0x1e376c08, 0x5141ab53), l(0x2748774c, 0xdf8eeb99), l(0x34b0bcb5, 0xe19b48a8), l(0x391c0cb3, 0xc5c95a63), l(0x4ed8aa4a, 0xe3418acb), l(0x5b9cca4f, 0x7763e373), l(0x682e6ff3, 0xd6b2b8a3), l(0x748f82ee, 0x5defb2fc), l(0x78a5636f, 0x43172f60), l(0x84c87814, 0xa1f0ab72), l(0x8cc70208, 0x1a6439ec), l(0x90befffa, 0x23631e28), l(0xa4506ceb, 0xde82bde9), l(0xbef9a3f7, 0xb2c67915), l(0xc67178f2, 0xe372532b), l(0xca273ece, 0xea26619c), l(0xd186b8c7, 0x21c0c207), l(0xeada7dd6, 0xcde0eb1e), l(0xf57d4f7f, 0xee6ed178), l(0x6f067aa, 0x72176fba), l(0xa637dc5, 0xa2c898a6), l(0x113f9804, 0xbef90dae), l(0x1b710b35, 0x131c471b), l(0x28db77f5, 0x23047d84), l(0x32caab7b, 0x40c72493), l(0x3c9ebe0a, 0x15c9bebc), l(0x431d67c4, 0x9c100d4c), l(0x4cc5d4be, 0xcb3e42b6), l(0x597f299c, 0xfc657e2a), l(0x5fcb6fab, 0x3ad6faec), l(0x6c44198c, 0x4a475817)]\n                    , n = [];\n                (function () &#123;\n                    for (var p = 0x0; p &lt; 0x50; p++) &#123;\n                        n[p] = l();\n                    &#125;\n                &#125;());\n                var o = k['SHA512'] = g['extend'](&#123;\n                    '_doReset': function () &#123;\n                        this['_hash'] = new j['init']([new i['init'](0x6a09e667, 0xf3bcc908), new i['init'](0xbb67ae85, 0x84caa73b), new i['init'](0x3c6ef372, 0xfe94f82b), new i['init'](0xa54ff53a, 0x5f1d36f1), new i['init'](0x510e527f, 0xade682d1), new i['init'](0x9b05688c, 0x2b3e6c1f), new i['init'](0x1f83d9ab, 0xfb41bd6b), new i['init'](0x5be0cd19, 0x137e2179)]);\n                    &#125;,\n                    '_doProcessBlock': function (p, q) &#123;\n                        var r = this['_hash']['words']\n                            , s = r[0x0]\n                            , t = r[0x1]\n                            , u = r[0x2]\n                            , v = r[0x3]\n                            , w = r[0x4]\n                            , x = r[0x5]\n                            , y = r[0x6]\n                            , z = r[0x7]\n                            , A = s['high']\n                            , B = s['low']\n                            , D = t['high']\n                            , E = t['low']\n                            , F = u['high']\n                            , G = u['low']\n                            , I = v['high']\n                            , J = v['low']\n                            , L = w['high']\n                            , N = w['low']\n                            , O = x['high']\n                            , P = x['low']\n                            , Q = y['high']\n                            , R = y['low']\n                            , S = z['high']\n                            , T = z['low']\n                            , U = A\n                            , V = B\n                            , X = D\n                            , Y = E\n                            , Z = F\n                            , a0 = G\n                            , a1 = I\n                            , a2 = J\n                            , a3 = L\n                            , a4 = N\n                            , a5 = O\n                            , a6 = P\n                            , a7 = Q\n                            , a8 = R\n                            , a9 = S\n                            , aa = T;\n                        for (var ab = 0x0; ab &lt; 0x50; ab++) &#123;\n                            var ac, ad, ae = n[ab];\n                            if (ab &lt; 0x10)\n                                ad = ae['high'] = p[q + ab * 0x2] | 0x0,\n                                    ac = ae['low'] = p[q + ab * 0x2 + 0x1] | 0x0;\n                            else &#123;\n                                var af = n[ab - 0xf]\n                                    , ag = af['high']\n                                    , ai = af['low']\n                                    , aj = (ag &gt;&gt;&gt; 0x1 | ai &lt;&lt; 0x1f) ^ (ag &gt;&gt;&gt; 0x8 | ai &lt;&lt; 0x18) ^ ag &gt;&gt;&gt; 0x7\n                                    ,\n                                    ak = (ai &gt;&gt;&gt; 0x1 | ag &lt;&lt; 0x1f) ^ (ai &gt;&gt;&gt; 0x8 | ag &lt;&lt; 0x18) ^ (ai &gt;&gt;&gt; 0x7 | ag &lt;&lt; 0x19)\n                                    , am = n[ab - 0x2]\n                                    , an = am['high']\n                                    , ao = am['low']\n                                    , ap = (an &gt;&gt;&gt; 0x13 | ao &lt;&lt; 0xd) ^ (an &lt;&lt; 0x3 | ao &gt;&gt;&gt; 0x1d) ^ an &gt;&gt;&gt; 0x6\n                                    ,\n                                    aq = (ao &gt;&gt;&gt; 0x13 | an &lt;&lt; 0xd) ^ (ao &lt;&lt; 0x3 | an &gt;&gt;&gt; 0x1d) ^ (ao &gt;&gt;&gt; 0x6 | an &lt;&lt; 0x1a)\n                                    , ar = n[ab - 0x7]\n                                    , as = ar['high']\n                                    , at = ar['low']\n                                    , au = n[ab - 0x10]\n                                    , av = au['high']\n                                    , aw = au['low'];\n                                ac = ak + at,\n                                    ad = aj + as + (ac &gt;&gt;&gt; 0x0 &lt; ak &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                                    ac = ac + aq,\n                                    ad = ad + ap + (ac &gt;&gt;&gt; 0x0 &lt; aq &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                                    ac = ac + aw,\n                                    ad = ad + av + (ac &gt;&gt;&gt; 0x0 &lt; aw &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                                    ae['high'] = ad,\n                                    ae['low'] = ac;\n                            &#125;\n                            var ax = a3 &amp; a5 ^ ~a3 &amp; a7\n                                , ay = a4 &amp; a6 ^ ~a4 &amp; a8\n                                , az = U &amp; X ^ U &amp; Z ^ X &amp; Z\n                                , aA = V &amp; Y ^ V &amp; a0 ^ Y &amp; a0\n                                , aB = (U &gt;&gt;&gt; 0x1c | V &lt;&lt; 0x4) ^ (U &lt;&lt; 0x1e | V &gt;&gt;&gt; 0x2) ^ (U &lt;&lt; 0x19 | V &gt;&gt;&gt; 0x7)\n                                , aC = (V &gt;&gt;&gt; 0x1c | U &lt;&lt; 0x4) ^ (V &lt;&lt; 0x1e | U &gt;&gt;&gt; 0x2) ^ (V &lt;&lt; 0x19 | U &gt;&gt;&gt; 0x7)\n                                , aD = (a3 &gt;&gt;&gt; 0xe | a4 &lt;&lt; 0x12) ^ (a3 &gt;&gt;&gt; 0x12 | a4 &lt;&lt; 0xe) ^ (a3 &lt;&lt; 0x17 | a4 &gt;&gt;&gt; 0x9)\n                                , aE = (a4 &gt;&gt;&gt; 0xe | a3 &lt;&lt; 0x12) ^ (a4 &gt;&gt;&gt; 0x12 | a3 &lt;&lt; 0xe) ^ (a4 &lt;&lt; 0x17 | a3 &gt;&gt;&gt; 0x9)\n                                , aF = m[ab]\n                                , aG = aF['high']\n                                , aH = aF['low']\n                                , aI = aa + aE\n                                , aJ = a9 + aD + (aI &gt;&gt;&gt; 0x0 &lt; aa &gt;&gt;&gt; 0x0 ? 0x1 : 0x0)\n                                , aI = aI + ay\n                                , aJ = aJ + ax + (aI &gt;&gt;&gt; 0x0 &lt; ay &gt;&gt;&gt; 0x0 ? 0x1 : 0x0)\n                                , aI = aI + aH\n                                , aJ = aJ + aG + (aI &gt;&gt;&gt; 0x0 &lt; aH &gt;&gt;&gt; 0x0 ? 0x1 : 0x0)\n                                , aI = aI + ac\n                                , aJ = aJ + ad + (aI &gt;&gt;&gt; 0x0 &lt; ac &gt;&gt;&gt; 0x0 ? 0x1 : 0x0)\n                                , aK = aC + aA\n                                , aL = aB + az + (aK &gt;&gt;&gt; 0x0 &lt; aC &gt;&gt;&gt; 0x0 ? 0x1 : 0x0);\n                            a9 = a7,\n                                aa = a8,\n                                a7 = a5,\n                                a8 = a6,\n                                a5 = a3,\n                                a6 = a4,\n                                a4 = a2 + aI | 0x0,\n                                a3 = a1 + aJ + (a4 &gt;&gt;&gt; 0x0 &lt; a2 &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0,\n                                a1 = Z,\n                                a2 = a0,\n                                Z = X,\n                                a0 = Y,\n                                X = U,\n                                Y = V,\n                                V = aI + aK | 0x0,\n                                U = aJ + aL + (V &gt;&gt;&gt; 0x0 &lt; aI &gt;&gt;&gt; 0x0 ? 0x1 : 0x0) | 0x0;\n                        &#125;\n                        B = s['low'] = B + V,\n                            s['high'] = A + U + (B &gt;&gt;&gt; 0x0 &lt; V &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            E = t['low'] = E + Y,\n                            t['high'] = D + X + (E &gt;&gt;&gt; 0x0 &lt; Y &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            G = u['low'] = G + a0,\n                            u['high'] = F + Z + (G &gt;&gt;&gt; 0x0 &lt; a0 &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            J = v['low'] = J + a2,\n                            v['high'] = I + a1 + (J &gt;&gt;&gt; 0x0 &lt; a2 &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            N = w['low'] = N + a4,\n                            w['high'] = L + a3 + (N &gt;&gt;&gt; 0x0 &lt; a4 &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            P = x['low'] = P + a6,\n                            x['high'] = O + a5 + (P &gt;&gt;&gt; 0x0 &lt; a6 &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            R = y['low'] = R + a8,\n                            y['high'] = Q + a7 + (R &gt;&gt;&gt; 0x0 &lt; a8 &gt;&gt;&gt; 0x0 ? 0x1 : 0x0),\n                            T = z['low'] = T + aa,\n                            z['high'] = S + a9 + (T &gt;&gt;&gt; 0x0 &lt; aa &gt;&gt;&gt; 0x0 ? 0x1 : 0x0);\n                    &#125;,\n                    '_doFinalize': function () &#123;\n                        var p = this['_data']\n                            , q = p['words']\n                            , r = this['_nDataBytes'] * 0x8\n                            , s = p['sigBytes'] * 0x8;\n                        q[s &gt;&gt;&gt; 0x5] |= 0x80 &lt;&lt; 0x18 - s % 0x20,\n                            q[(s + 0x80 &gt;&gt;&gt; 0xa &lt;&lt; 0x5) + 0x1e] = Math['floor'](r / 0x100000000),\n                            q[(s + 0x80 &gt;&gt;&gt; 0xa &lt;&lt; 0x5) + 0x1f] = r,\n                            p['sigBytes'] = q['length'] * 0x4,\n                            this['_process']();\n                        var t = this['_hash']['toX32']();\n                        return t;\n                    &#125;,\n                    'clone': function () &#123;\n                        var p = g['clone']['call'](this);\n                        return p['_hash'] = this['_hash']['clone'](),\n                            p;\n                    &#125;,\n                    'blockSize': 0x400 / 0x20\n                &#125;);\n                e['SHA512'] = g['_createHelper'](o),\n                    e['HmacSHA512'] = g['_createHmacHelper'](o);\n            &#125;()),\n                d['SHA512'];\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5,\n            './x64-core': 0x25\n        &#125;],\n    0x24: [function (a, b, c) &#123;\n        ;(function (d, e, f) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'), a('./enc-base64'), a('./md5'), a('./evpkdf'), a('./cipher-core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core', './enc-base64', './md5', './evpkdf', './cipher-core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return (function () &#123;\n                var e = d\n                    , f = e['lib']\n                    , g = f['WordArray']\n                    , h = f['BlockCipher']\n                    , i = e['algo']\n                    ,\n                    j = [0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x9, 0x1, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0xa, 0x2, 0x3b, 0x33, 0x2b, 0x23, 0x1b, 0x13, 0xb, 0x3, 0x3c, 0x34, 0x2c, 0x24, 0x3f, 0x37, 0x2f, 0x27, 0x1f, 0x17, 0xf, 0x7, 0x3e, 0x36, 0x2e, 0x26, 0x1e, 0x16, 0xe, 0x6, 0x3d, 0x35, 0x2d, 0x25, 0x1d, 0x15, 0xd, 0x5, 0x1c, 0x14, 0xc, 0x4]\n                    ,\n                    k = [0xe, 0x11, 0xb, 0x18, 0x1, 0x5, 0x3, 0x1c, 0xf, 0x6, 0x15, 0xa, 0x17, 0x13, 0xc, 0x4, 0x1a, 0x8, 0x10, 0x7, 0x1b, 0x14, 0xd, 0x2, 0x29, 0x34, 0x1f, 0x25, 0x2f, 0x37, 0x1e, 0x28, 0x33, 0x2d, 0x21, 0x30, 0x2c, 0x31, 0x27, 0x38, 0x22, 0x35, 0x2e, 0x2a, 0x32, 0x24, 0x1d, 0x20]\n                    , l = [0x1, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0xf, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1b, 0x1c]\n                    , m = [&#123;\n                        0x0: 0x808200,\n                        0x10000000: 0x8000,\n                        0x20000000: 0x808002,\n                        0x30000000: 0x2,\n                        0x40000000: 0x200,\n                        0x50000000: 0x808202,\n                        0x60000000: 0x800202,\n                        0x70000000: 0x800000,\n                        0x80000000: 0x202,\n                        0x90000000: 0x800200,\n                        0xa0000000: 0x8200,\n                        0xb0000000: 0x808000,\n                        0xc0000000: 0x8002,\n                        0xd0000000: 0x800002,\n                        0xe0000000: 0x0,\n                        0xf0000000: 0x8202,\n                        0x8000000: 0x0,\n                        0x18000000: 0x808202,\n                        0x28000000: 0x8202,\n                        0x38000000: 0x8000,\n                        0x48000000: 0x808200,\n                        0x58000000: 0x200,\n                        0x68000000: 0x808002,\n                        0x78000000: 0x2,\n                        0x88000000: 0x800200,\n                        0x98000000: 0x8200,\n                        0xa8000000: 0x808000,\n                        0xb8000000: 0x800202,\n                        0xc8000000: 0x800002,\n                        0xd8000000: 0x8002,\n                        0xe8000000: 0x202,\n                        0xf8000000: 0x800000,\n                        0x1: 0x8000,\n                        0x10000001: 0x2,\n                        0x20000001: 0x808200,\n                        0x30000001: 0x800000,\n                        0x40000001: 0x808002,\n                        0x50000001: 0x8200,\n                        0x60000001: 0x200,\n                        0x70000001: 0x800202,\n                        0x80000001: 0x808202,\n                        0x90000001: 0x808000,\n                        0xa0000001: 0x800002,\n                        0xb0000001: 0x8202,\n                        0xc0000001: 0x202,\n                        0xd0000001: 0x800200,\n                        0xe0000001: 0x8002,\n                        0xf0000001: 0x0,\n                        0x8000001: 0x808202,\n                        0x18000001: 0x808000,\n                        0x28000001: 0x800000,\n                        0x38000001: 0x200,\n                        0x48000001: 0x8000,\n                        0x58000001: 0x800002,\n                        0x68000001: 0x2,\n                        0x78000001: 0x8202,\n                        0x88000001: 0x8002,\n                        0x98000001: 0x800202,\n                        0xa8000001: 0x202,\n                        0xb8000001: 0x808200,\n                        0xc8000001: 0x800200,\n                        0xd8000001: 0x0,\n                        0xe8000001: 0x8200,\n                        0xf8000001: 0x808002\n                    &#125;, &#123;\n                        0x0: 0x40084010,\n                        0x1000000: 0x4000,\n                        0x2000000: 0x80000,\n                        0x3000000: 0x40080010,\n                        0x4000000: 0x40000010,\n                        0x5000000: 0x40084000,\n                        0x6000000: 0x40004000,\n                        0x7000000: 0x10,\n                        0x8000000: 0x84000,\n                        0x9000000: 0x40004010,\n                        0xa000000: 0x40000000,\n                        0xb000000: 0x84010,\n                        0xc000000: 0x80010,\n                        0xd000000: 0x0,\n                        0xe000000: 0x4010,\n                        0xf000000: 0x40080000,\n                        0x800000: 0x40004000,\n                        0x1800000: 0x84010,\n                        0x2800000: 0x10,\n                        0x3800000: 0x40004010,\n                        0x4800000: 0x40084010,\n                        0x5800000: 0x40000000,\n                        0x6800000: 0x80000,\n                        0x7800000: 0x40080010,\n                        0x8800000: 0x80010,\n                        0x9800000: 0x0,\n                        0xa800000: 0x4000,\n                        0xb800000: 0x40080000,\n                        0xc800000: 0x40000010,\n                        0xd800000: 0x84000,\n                        0xe800000: 0x40084000,\n                        0xf800000: 0x4010,\n                        0x10000000: 0x0,\n                        0x11000000: 0x40080010,\n                        0x12000000: 0x40004010,\n                        0x13000000: 0x40084000,\n                        0x14000000: 0x40080000,\n                        0x15000000: 0x10,\n                        0x16000000: 0x84010,\n                        0x17000000: 0x4000,\n                        0x18000000: 0x4010,\n                        0x19000000: 0x80000,\n                        0x1a000000: 0x80010,\n                        0x1b000000: 0x40000010,\n                        0x1c000000: 0x84000,\n                        0x1d000000: 0x40004000,\n                        0x1e000000: 0x40000000,\n                        0x1f000000: 0x40084010,\n                        0x10800000: 0x84010,\n                        0x11800000: 0x80000,\n                        0x12800000: 0x40080000,\n                        0x13800000: 0x4000,\n                        0x14800000: 0x40004000,\n                        0x15800000: 0x40084010,\n                        0x16800000: 0x10,\n                        0x17800000: 0x40000000,\n                        0x18800000: 0x40084000,\n                        0x19800000: 0x40000010,\n                        0x1a800000: 0x40004010,\n                        0x1b800000: 0x80010,\n                        0x1c800000: 0x0,\n                        0x1d800000: 0x4010,\n                        0x1e800000: 0x40080010,\n                        0x1f800000: 0x84000\n                    &#125;, &#123;\n                        0x0: 0x104,\n                        0x100000: 0x0,\n                        0x200000: 0x4000100,\n                        0x300000: 0x10104,\n                        0x400000: 0x10004,\n                        0x500000: 0x4000004,\n                        0x600000: 0x4010104,\n                        0x700000: 0x4010000,\n                        0x800000: 0x4000000,\n                        0x900000: 0x4010100,\n                        0xa00000: 0x10100,\n                        0xb00000: 0x4010004,\n                        0xc00000: 0x4000104,\n                        0xd00000: 0x10000,\n                        0xe00000: 0x4,\n                        0xf00000: 0x100,\n                        0x80000: 0x4010100,\n                        0x180000: 0x4010004,\n                        0x280000: 0x0,\n                        0x380000: 0x4000100,\n                        0x480000: 0x4000004,\n                        0x580000: 0x10000,\n                        0x680000: 0x10004,\n                        0x780000: 0x104,\n                        0x880000: 0x4,\n                        0x980000: 0x100,\n                        0xa80000: 0x4010000,\n                        0xb80000: 0x10104,\n                        0xc80000: 0x10100,\n                        0xd80000: 0x4000104,\n                        0xe80000: 0x4010104,\n                        0xf80000: 0x4000000,\n                        0x1000000: 0x4010100,\n                        0x1100000: 0x10004,\n                        0x1200000: 0x10000,\n                        0x1300000: 0x4000100,\n                        0x1400000: 0x100,\n                        0x1500000: 0x4010104,\n                        0x1600000: 0x4000004,\n                        0x1700000: 0x0,\n                        0x1800000: 0x4000104,\n                        0x1900000: 0x4000000,\n                        0x1a00000: 0x4,\n                        0x1b00000: 0x10100,\n                        0x1c00000: 0x4010000,\n                        0x1d00000: 0x104,\n                        0x1e00000: 0x10104,\n                        0x1f00000: 0x4010004,\n                        0x1080000: 0x4000000,\n                        0x1180000: 0x104,\n                        0x1280000: 0x4010100,\n                        0x1380000: 0x0,\n                        0x1480000: 0x10004,\n                        0x1580000: 0x4000100,\n                        0x1680000: 0x100,\n                        0x1780000: 0x4010004,\n                        0x1880000: 0x10000,\n                        0x1980000: 0x4010104,\n                        0x1a80000: 0x10104,\n                        0x1b80000: 0x4000004,\n                        0x1c80000: 0x4000104,\n                        0x1d80000: 0x4010000,\n                        0x1e80000: 0x4,\n                        0x1f80000: 0x10100\n                    &#125;, &#123;\n                        0x0: 0x80401000,\n                        0x10000: 0x80001040,\n                        0x20000: 0x401040,\n                        0x30000: 0x80400000,\n                        0x40000: 0x0,\n                        0x50000: 0x401000,\n                        0x60000: 0x80000040,\n                        0x70000: 0x400040,\n                        0x80000: 0x80000000,\n                        0x90000: 0x400000,\n                        0xa0000: 0x40,\n                        0xb0000: 0x80001000,\n                        0xc0000: 0x80400040,\n                        0xd0000: 0x1040,\n                        0xe0000: 0x1000,\n                        0xf0000: 0x80401040,\n                        0x8000: 0x80001040,\n                        0x18000: 0x40,\n                        0x28000: 0x80400040,\n                        0x38000: 0x80001000,\n                        0x48000: 0x401000,\n                        0x58000: 0x80401040,\n                        0x68000: 0x0,\n                        0x78000: 0x80400000,\n                        0x88000: 0x1000,\n                        0x98000: 0x80401000,\n                        0xa8000: 0x400000,\n                        0xb8000: 0x1040,\n                        0xc8000: 0x80000000,\n                        0xd8000: 0x400040,\n                        0xe8000: 0x401040,\n                        0xf8000: 0x80000040,\n                        0x100000: 0x400040,\n                        0x110000: 0x401000,\n                        0x120000: 0x80000040,\n                        0x130000: 0x0,\n                        0x140000: 0x1040,\n                        0x150000: 0x80400040,\n                        0x160000: 0x80401000,\n                        0x170000: 0x80001040,\n                        0x180000: 0x80401040,\n                        0x190000: 0x80000000,\n                        0x1a0000: 0x80400000,\n                        0x1b0000: 0x401040,\n                        0x1c0000: 0x80001000,\n                        0x1d0000: 0x400000,\n                        0x1e0000: 0x40,\n                        0x1f0000: 0x1000,\n                        0x108000: 0x80400000,\n                        0x118000: 0x80401040,\n                        0x128000: 0x0,\n                        0x138000: 0x401000,\n                        0x148000: 0x400040,\n                        0x158000: 0x80000000,\n                        0x168000: 0x80001040,\n                        0x178000: 0x40,\n                        0x188000: 0x80000040,\n                        0x198000: 0x1000,\n                        0x1a8000: 0x80001000,\n                        0x1b8000: 0x80400040,\n                        0x1c8000: 0x1040,\n                        0x1d8000: 0x80401000,\n                        0x1e8000: 0x400000,\n                        0x1f8000: 0x401040\n                    &#125;, &#123;\n                        0x0: 0x80,\n                        0x1000: 0x1040000,\n                        0x2000: 0x40000,\n                        0x3000: 0x20000000,\n                        0x4000: 0x20040080,\n                        0x5000: 0x1000080,\n                        0x6000: 0x21000080,\n                        0x7000: 0x40080,\n                        0x8000: 0x1000000,\n                        0x9000: 0x20040000,\n                        0xa000: 0x20000080,\n                        0xb000: 0x21040080,\n                        0xc000: 0x21040000,\n                        0xd000: 0x0,\n                        0xe000: 0x1040080,\n                        0xf000: 0x21000000,\n                        0x800: 0x1040080,\n                        0x1800: 0x21000080,\n                        0x2800: 0x80,\n                        0x3800: 0x1040000,\n                        0x4800: 0x40000,\n                        0x5800: 0x20040080,\n                        0x6800: 0x21040000,\n                        0x7800: 0x20000000,\n                        0x8800: 0x20040000,\n                        0x9800: 0x0,\n                        0xa800: 0x21040080,\n                        0xb800: 0x1000080,\n                        0xc800: 0x20000080,\n                        0xd800: 0x21000000,\n                        0xe800: 0x1000000,\n                        0xf800: 0x40080,\n                        0x10000: 0x40000,\n                        0x11000: 0x80,\n                        0x12000: 0x20000000,\n                        0x13000: 0x21000080,\n                        0x14000: 0x1000080,\n                        0x15000: 0x21040000,\n                        0x16000: 0x20040080,\n                        0x17000: 0x1000000,\n                        0x18000: 0x21040080,\n                        0x19000: 0x21000000,\n                        0x1a000: 0x1040000,\n                        0x1b000: 0x20040000,\n                        0x1c000: 0x40080,\n                        0x1d000: 0x20000080,\n                        0x1e000: 0x0,\n                        0x1f000: 0x1040080,\n                        0x10800: 0x21000080,\n                        0x11800: 0x1000000,\n                        0x12800: 0x1040000,\n                        0x13800: 0x20040080,\n                        0x14800: 0x20000000,\n                        0x15800: 0x1040080,\n                        0x16800: 0x80,\n                        0x17800: 0x21040000,\n                        0x18800: 0x40080,\n                        0x19800: 0x21040080,\n                        0x1a800: 0x0,\n                        0x1b800: 0x21000000,\n                        0x1c800: 0x1000080,\n                        0x1d800: 0x40000,\n                        0x1e800: 0x20040000,\n                        0x1f800: 0x20000080\n                    &#125;, &#123;\n                        0x0: 0x10000008,\n                        0x100: 0x2000,\n                        0x200: 0x10200000,\n                        0x300: 0x10202008,\n                        0x400: 0x10002000,\n                        0x500: 0x200000,\n                        0x600: 0x200008,\n                        0x700: 0x10000000,\n                        0x800: 0x0,\n                        0x900: 0x10002008,\n                        0xa00: 0x202000,\n                        0xb00: 0x8,\n                        0xc00: 0x10200008,\n                        0xd00: 0x202008,\n                        0xe00: 0x2008,\n                        0xf00: 0x10202000,\n                        0x80: 0x10200000,\n                        0x180: 0x10202008,\n                        0x280: 0x8,\n                        0x380: 0x200000,\n                        0x480: 0x202008,\n                        0x580: 0x10000008,\n                        0x680: 0x10002000,\n                        0x780: 0x2008,\n                        0x880: 0x200008,\n                        0x980: 0x2000,\n                        0xa80: 0x10002008,\n                        0xb80: 0x10200008,\n                        0xc80: 0x0,\n                        0xd80: 0x10202000,\n                        0xe80: 0x202000,\n                        0xf80: 0x10000000,\n                        0x1000: 0x10002000,\n                        0x1100: 0x10200008,\n                        0x1200: 0x10202008,\n                        0x1300: 0x2008,\n                        0x1400: 0x200000,\n                        0x1500: 0x10000000,\n                        0x1600: 0x10000008,\n                        0x1700: 0x202000,\n                        0x1800: 0x202008,\n                        0x1900: 0x0,\n                        0x1a00: 0x8,\n                        0x1b00: 0x10200000,\n                        0x1c00: 0x2000,\n                        0x1d00: 0x10002008,\n                        0x1e00: 0x10202000,\n                        0x1f00: 0x200008,\n                        0x1080: 0x8,\n                        0x1180: 0x202000,\n                        0x1280: 0x200000,\n                        0x1380: 0x10000008,\n                        0x1480: 0x10002000,\n                        0x1580: 0x2008,\n                        0x1680: 0x10202008,\n                        0x1780: 0x10200000,\n                        0x1880: 0x10202000,\n                        0x1980: 0x10200008,\n                        0x1a80: 0x2000,\n                        0x1b80: 0x202008,\n                        0x1c80: 0x200008,\n                        0x1d80: 0x0,\n                        0x1e80: 0x10000000,\n                        0x1f80: 0x10002008\n                    &#125;, &#123;\n                        0x0: 0x100000,\n                        0x10: 0x2000401,\n                        0x20: 0x400,\n                        0x30: 0x100401,\n                        0x40: 0x2100401,\n                        0x50: 0x0,\n                        0x60: 0x1,\n                        0x70: 0x2100001,\n                        0x80: 0x2000400,\n                        0x90: 0x100001,\n                        0xa0: 0x2000001,\n                        0xb0: 0x2100400,\n                        0xc0: 0x2100000,\n                        0xd0: 0x401,\n                        0xe0: 0x100400,\n                        0xf0: 0x2000000,\n                        0x8: 0x2100001,\n                        0x18: 0x0,\n                        0x28: 0x2000401,\n                        0x38: 0x2100400,\n                        0x48: 0x100000,\n                        0x58: 0x2000001,\n                        0x68: 0x2000000,\n                        0x78: 0x401,\n                        0x88: 0x100401,\n                        0x98: 0x2000400,\n                        0xa8: 0x2100000,\n                        0xb8: 0x100001,\n                        0xc8: 0x400,\n                        0xd8: 0x2100401,\n                        0xe8: 0x1,\n                        0xf8: 0x100400,\n                        0x100: 0x2000000,\n                        0x110: 0x100000,\n                        0x120: 0x2000401,\n                        0x130: 0x2100001,\n                        0x140: 0x100001,\n                        0x150: 0x2000400,\n                        0x160: 0x2100400,\n                        0x170: 0x100401,\n                        0x180: 0x401,\n                        0x190: 0x2100401,\n                        0x1a0: 0x100400,\n                        0x1b0: 0x1,\n                        0x1c0: 0x0,\n                        0x1d0: 0x2100000,\n                        0x1e0: 0x2000001,\n                        0x1f0: 0x400,\n                        0x108: 0x100400,\n                        0x118: 0x2000401,\n                        0x128: 0x2100001,\n                        0x138: 0x1,\n                        0x148: 0x2000000,\n                        0x158: 0x100000,\n                        0x168: 0x401,\n                        0x178: 0x2100400,\n                        0x188: 0x2000001,\n                        0x198: 0x2100000,\n                        0x1a8: 0x0,\n                        0x1b8: 0x2100401,\n                        0x1c8: 0x100401,\n                        0x1d8: 0x400,\n                        0x1e8: 0x2000400,\n                        0x1f8: 0x100001\n                    &#125;, &#123;\n                        0x0: 0x8000820,\n                        0x1: 0x20000,\n                        0x2: 0x8000000,\n                        0x3: 0x20,\n                        0x4: 0x20020,\n                        0x5: 0x8020820,\n                        0x6: 0x8020800,\n                        0x7: 0x800,\n                        0x8: 0x8020000,\n                        0x9: 0x8000800,\n                        0xa: 0x20800,\n                        0xb: 0x8020020,\n                        0xc: 0x820,\n                        0xd: 0x0,\n                        0xe: 0x8000020,\n                        0xf: 0x20820,\n                        0x80000000: 0x800,\n                        0x80000001: 0x8020820,\n                        0x80000002: 0x8000820,\n                        0x80000003: 0x8000000,\n                        0x80000004: 0x8020000,\n                        0x80000005: 0x20800,\n                        0x80000006: 0x20820,\n                        0x80000007: 0x20,\n                        0x80000008: 0x8000020,\n                        0x80000009: 0x820,\n                        0x8000000a: 0x20020,\n                        0x8000000b: 0x8020800,\n                        0x8000000c: 0x0,\n                        0x8000000d: 0x8020020,\n                        0x8000000e: 0x8000800,\n                        0x8000000f: 0x20000,\n                        0x10: 0x20820,\n                        0x11: 0x8020800,\n                        0x12: 0x20,\n                        0x13: 0x800,\n                        0x14: 0x8000800,\n                        0x15: 0x8000020,\n                        0x16: 0x8020020,\n                        0x17: 0x20000,\n                        0x18: 0x0,\n                        0x19: 0x20020,\n                        0x1a: 0x8020000,\n                        0x1b: 0x8000820,\n                        0x1c: 0x8020820,\n                        0x1d: 0x20800,\n                        0x1e: 0x820,\n                        0x1f: 0x8000000,\n                        0x80000010: 0x20000,\n                        0x80000011: 0x800,\n                        0x80000012: 0x8020020,\n                        0x80000013: 0x20820,\n                        0x80000014: 0x20,\n                        0x80000015: 0x8020000,\n                        0x80000016: 0x8000000,\n                        0x80000017: 0x8000820,\n                        0x80000018: 0x8020820,\n                        0x80000019: 0x8000020,\n                        0x8000001a: 0x8000800,\n                        0x8000001b: 0x0,\n                        0x8000001c: 0x20800,\n                        0x8000001d: 0x820,\n                        0x8000001e: 0x20020,\n                        0x8000001f: 0x8020800\n                    &#125;]\n                    , n = [0xf8000001, 0x1f800000, 0x1f80000, 0x1f8000, 0x1f800, 0x1f80, 0x1f8, 0x8000001f]\n                    , o = i['DES'] = h['extend'](&#123;\n                        '_doReset': function () &#123;\n                            var s = this['_key']\n                                , t = s['words']\n                                , u = [];\n                            for (var v = 0x0; v &lt; 0x38; v++) &#123;\n                                var w = j[v] - 0x1;\n                                u[v] = t[w &gt;&gt;&gt; 0x5] &gt;&gt;&gt; 0x1f - w % 0x20 &amp; 0x1;\n                            &#125;\n                            var x = this['_subKeys'] = [];\n                            for (var y = 0x0; y &lt; 0x10; y++) &#123;\n                                var z = x[y] = []\n                                    , A = l[y];\n                                for (var v = 0x0; v &lt; 0x18; v++) &#123;\n                                    z[v / 0x6 | 0x0] |= u[(k[v] - 0x1 + A) % 0x1c] &lt;&lt; 0x1f - v % 0x6,\n                                        z[0x4 + (v / 0x6 | 0x0)] |= u[0x1c + (k[v + 0x18] - 0x1 + A) % 0x1c] &lt;&lt; 0x1f - v % 0x6;\n                                &#125;\n                                z[0x0] = z[0x0] &lt;&lt; 0x1 | z[0x0] &gt;&gt;&gt; 0x1f;\n                                for (var v = 0x1; v &lt; 0x7; v++) &#123;\n                                    z[v] = z[v] &gt;&gt;&gt; (v - 0x1) * 0x4 + 0x3;\n                                &#125;\n                                z[0x7] = z[0x7] &lt;&lt; 0x5 | z[0x7] &gt;&gt;&gt; 0x1b;\n                            &#125;\n                            var B = this['_invSubKeys'] = [];\n                            for (var v = 0x0; v &lt; 0x10; v++) &#123;\n                                B[v] = x[0xf - v];\n                            &#125;\n                        &#125;,\n                        'encryptBlock': function (s, t) &#123;\n                            this['_doCryptBlock'](s, t, this['_subKeys']);\n                        &#125;,\n                        'decryptBlock': function (s, t) &#123;\n                            this['_doCryptBlock'](s, t, this['_invSubKeys']);\n                        &#125;,\n                        '_doCryptBlock': function (s, u, v) &#123;\n                            this['_lBlock'] = s[u],\n                                this['_rBlock'] = s[u + 0x1],\n                                p['call'](this, 0x4, 0xf0f0f0f),\n                                p['call'](this, 0x10, 0xffff),\n                                q['call'](this, 0x2, 0x33333333),\n                                q['call'](this, 0x8, 0xff00ff),\n                                p['call'](this, 0x1, 0x55555555);\n                            for (var w = 0x0; w &lt; 0x10; w++) &#123;\n                                var x = v[w]\n                                    , y = this['_lBlock']\n                                    , z = this['_rBlock']\n                                    , A = 0x0;\n                                for (var B = 0x0; B &lt; 0x8; B++) &#123;\n                                    A |= m[B][((z ^ x[B]) &amp; n[B]) &gt;&gt;&gt; 0x0];\n                                &#125;\n                                this['_lBlock'] = z,\n                                    this['_rBlock'] = y ^ A;\n                            &#125;\n                            var D = this['_lBlock'];\n                            this['_lBlock'] = this['_rBlock'],\n                                this['_rBlock'] = D,\n                                p['call'](this, 0x1, 0x55555555),\n                                q['call'](this, 0x8, 0xff00ff),\n                                q['call'](this, 0x2, 0x33333333),\n                                p['call'](this, 0x10, 0xffff),\n                                p['call'](this, 0x4, 0xf0f0f0f),\n                                s[u] = this['_lBlock'],\n                                s[u + 0x1] = this['_rBlock'];\n                        &#125;,\n                        'keySize': 0x40 / 0x20,\n                        'ivSize': 0x40 / 0x20,\n                        'blockSize': 0x40 / 0x20\n                    &#125;);\n\n                function p(s, u) &#123;\n                    var v = (this['_lBlock'] &gt;&gt;&gt; s ^ this['_rBlock']) &amp; u;\n                    this['_rBlock'] ^= v,\n                        this['_lBlock'] ^= v &lt;&lt; s;\n                &#125;\n\n                function q(s, u) &#123;\n                    var v = (this['_rBlock'] &gt;&gt;&gt; s ^ this['_lBlock']) &amp; u;\n                    this['_lBlock'] ^= v,\n                        this['_rBlock'] ^= v &lt;&lt; s;\n                &#125;\n\n                e['DES'] = h['_createHelper'](o);\n                var r = i['TripleDES'] = h['extend'](&#123;\n                    '_doReset': function () &#123;\n                        var s = this['_key']\n                            , t = s['words'];\n                        if (t['length'] !== 0x2 &amp;&amp; t['length'] !== 0x4 &amp;&amp; t['length'] &lt; 0x6)\n                            throw new Error('Invalid\\x20key\\x20length\\x20-\\x203DES\\x20requires\\x20the\\x20key\\x20length\\x20to\\x20be\\x2064,\\x20128,\\x20192\\x20or\\x20&gt;192.');\n                        var u = t['slice'](0x0, 0x2)\n                            , v = t['length'] &lt; 0x4 ? t['slice'](0x0, 0x2) : t['slice'](0x2, 0x4)\n                            , w = t['length'] &lt; 0x6 ? t['slice'](0x0, 0x2) : t['slice'](0x4, 0x6);\n                        this['_des1'] = o['createEncryptor'](g['create'](u)),\n                            this['_des2'] = o['createEncryptor'](g['create'](v)),\n                            this['_des3'] = o['createEncryptor'](g['create'](w));\n                    &#125;,\n                    'encryptBlock': function (s, t) &#123;\n                        this['_des1']['encryptBlock'](s, t),\n                            this['_des2']['decryptBlock'](s, t),\n                            this['_des3']['encryptBlock'](s, t);\n                    &#125;,\n                    'decryptBlock': function (s, t) &#123;\n                        this['_des3']['decryptBlock'](s, t),\n                            this['_des2']['encryptBlock'](s, t),\n                            this['_des1']['decryptBlock'](s, t);\n                    &#125;,\n                    'keySize': 0xc0 / 0x20,\n                    'ivSize': 0x40 / 0x20,\n                    'blockSize': 0x40 / 0x20\n                &#125;);\n                e['TripleDES'] = h['_createHelper'](r);\n            &#125;()),\n                d['TripleDES'];\n        &#125;));\n    &#125;\n        , &#123;\n            './cipher-core': 0x4,\n            './core': 0x5,\n            './enc-base64': 0x6,\n            './evpkdf': 0x9,\n            './md5': 0xe\n        &#125;],\n    0x25: [function (a, b, c) &#123;\n        ;(function (d, e) &#123;\n            if (typeof c === 'object')\n                b['exports'] = c = e(a('./core'));\n            else\n                typeof define === 'function' &amp;&amp; define['amd'] ? define(['./core'], e) : e(d['CryptoJS']);\n        &#125;(this, function (d) &#123;\n            return function (e) &#123;\n                var f = d\n                    , g = f['lib']\n                    , h = g['Base']\n                    , i = g['WordArray']\n                    , j = f['x64'] = &#123;&#125;\n                    , k = j['Word'] = h['extend'](&#123;\n                    'init': function (m, n) &#123;\n                        this['high'] = m,\n                            this['low'] = n;\n                    &#125;\n                &#125;)\n                    , l = j['WordArray'] = h['extend'](&#123;\n                    'init': function (m, n) &#123;\n                        m = this['words'] = m || [],\n                            n != e ? this['sigBytes'] = n : this['sigBytes'] = m['length'] * 0x8;\n                    &#125;,\n                    'toX32': function () &#123;\n                        var m = this['words']\n                            , n = m['length']\n                            , o = [];\n                        for (var p = 0x0; p &lt; n; p++) &#123;\n                            var q = m[p];\n                            o['push'](q['high']),\n                                o['push'](q['low']);\n                        &#125;\n                        return i['create'](o, this['sigBytes']);\n                    &#125;,\n                    'clone': function () &#123;\n                        var m = h['clone']['call'](this)\n                            , n = m['words'] = this['words']['slice'](0x0)\n                            , o = n['length'];\n                        for (var p = 0x0; p &lt; o; p++) &#123;\n                            n[p] = n[p]['clone']();\n                        &#125;\n                        return m;\n                    &#125;\n                &#125;);\n            &#125;(),\n                d;\n        &#125;));\n    &#125;\n        , &#123;\n            './core': 0x5\n        &#125;]\n&#125;, &#123;&#125;, [0x2]));\n\nfunction get_token(page) &#123;\n    var e = Date['now']()\n        , f = asxe('crypto-js')\n        , g = '666yuanrenxue66'\n        , h = f['AES']['encrypt'](e + String(page), g, &#123;\n        'mode': f['mode']['ECB'],\n        'padding': f['pad']['Pkcs7']\n    &#125;)\n        , i = '/api/match2023/1'\n        , j = &#123;\n        'page': String(page),\n        'token': f['MD5'](h['toString']())['toString'](),\n        'now': e\n    &#125;;\n    return j\n&#125;\n</code></pre>\n",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "爬虫",
                "js逆向"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/05/05/ImageMagic%E7%9A%84API%E6%96%87%E6%A1%A3(%E4%B8%AD%E8%8B%B1%E6%96%87%E7%89%88)/",
            "url": "https://blog.asxe.vip/2023/05/05/ImageMagic%E7%9A%84API%E6%96%87%E6%A1%A3(%E4%B8%AD%E8%8B%B1%E6%96%87%E7%89%88)/",
            "title": "ImageMagic库API文档(中英文版)",
            "date_published": "2023-05-05T10:58:58.000Z",
            "content_html": "<div class=\"tab\" data-id=\"id1\" data-title=\"中文文档\">\n<h1 id=\"欢迎\"><a class=\"anchor\" href=\"#欢迎\">#</a> 欢迎！</h1>\n<p>如果说你看到了这里，那么有两种可能，要么是为 ImageMagic 而来，要么就是闲逛，不过，这里都欢迎你的到来！</p>\n<h1 id=\"获取imagemagic\"><a class=\"anchor\" href=\"#获取imagemagic\">#</a> 获取 ImageMagic</h1>\n<ol>\n<li>使用 pip 下载：</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>pip <span class=\"token function\">install</span> ImageMagic</pre></td></tr></table></figure><ol start=\"2\">\n<li>从源进行构建：<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L0ltYWdlTWFnaWM=\">源</span></li>\n</ol>\n<h1 id=\"docs\"><a class=\"anchor\" href=\"#docs\">#</a> DOCS</h1>\n<p>感谢使用 ImageMagic，这是 Python 的第三方库 ImageMagic 的临时文档，请查阅。若在使用过程中有什么问题或是你觉得可以改进的地方，请联系我！</p>\n<h2 id=\"image模块\"><a class=\"anchor\" href=\"#image模块\">#</a> Image 模块</h2>\n<h3 id=\"word_to_image\"><a class=\"anchor\" href=\"#word_to_image\">#</a> word_to_image()</h3>\n<p>将文本转换成图片</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>word_to_image<span class=\"token punctuation\">(</span><span class=\"token string\">'这里是你要转成图片的文本'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/1.png'</span><span class=\"token punctuation\">,</span>fontPath<span class=\"token operator\">=</span><span class=\"token string\">'F:/ttf/字语时光体.ttf'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"voice_to_word\"><a class=\"anchor\" href=\"#voice_to_word\">#</a> voice_to_word()</h3>\n<p>识别音频里的内容，使用讯飞的语音转写，你需要去<span class=\"exturl\" data-url=\"aHR0cHM6Ly9jb25zb2xlLnhmeXVuLmNuL3NlcnZpY2VzL2xmYXNy\">点击这里</span>获取你的 appid 以及 key，支持格式为 WAV, FLAC, OPUS, M4A, MP3</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>appid <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>key <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>filepath <span class=\"token operator\">=</span> <span class=\"token string\">\"F:/mp3/test.mp3\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>audio <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>Audio<span class=\"token punctuation\">(</span>appid<span class=\"token punctuation\">,</span>key<span class=\"token punctuation\">,</span>filepath<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>text <span class=\"token operator\">=</span> audio<span class=\"token punctuation\">.</span>voice_to_word<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"audio_to_image\"><a class=\"anchor\" href=\"#audio_to_image\">#</a> audio_to_image()</h3>\n<p>将音频内容转为图片，同样，你需要去<span class=\"exturl\" data-url=\"aHR0cHM6Ly9jb25zb2xlLnhmeXVuLmNuL3NlcnZpY2VzL2xmYXNy\">点击这里</span>获取你的 appid 以及 key，支持格式为 WAV, FLAC, OPUS, M4A, MP3</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>appid <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>key <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>filepath <span class=\"token operator\">=</span> <span class=\"token string\">\"F:/mp3/test.mp3\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>Image<span class=\"token punctuation\">.</span>audio_to_image<span class=\"token punctuation\">(</span>appid<span class=\"token punctuation\">,</span>key<span class=\"token punctuation\">,</span>filepath<span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">#最后一个参数是图片保存地址</span></pre></td></tr></table></figure><h3 id=\"categorize_image\"><a class=\"anchor\" href=\"#categorize_image\">#</a> categorize_image()</h3>\n<p>分类文件夹里的图片，格式包括 jpg, jpeg, png, webp, bmp, tif, tiff, gif, svg, wmf，会在此文件夹下生成以已有文件的后缀为名的新文件夹，并将同类文件复制到里面</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>categorize_image<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/images'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">#这里输入你的文件夹路径</span></pre></td></tr></table></figure><h3 id=\"convert\"><a class=\"anchor\" href=\"#convert\">#</a> convert()</h3>\n<p>转换图片格式</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>convert<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'webp'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/test.webp'</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">#第一个参数是原文件路径，第二个是转换的格式，第三个是保存路径</span></pre></td></tr></table></figure><h3 id=\"equal_scale_image\"><a class=\"anchor\" href=\"#equal_scale_image\">#</a> equal_scale_image()</h3>\n<p>将图片等比例缩小或者放大</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>equal_scale_image<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/save.png'</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">#最后一个参数是变化倍数</span></pre></td></tr></table></figure><h3 id=\"customize_image\"><a class=\"anchor\" href=\"#customize_image\">#</a> customize_image()</h3>\n<p>自定义修改图片分辨率，若是不输入第三和四个参数，那么将会使用原参数</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>customize_image<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/save.png'</span><span class=\"token punctuation\">,</span><span class=\"token number\">1960</span><span class=\"token punctuation\">,</span><span class=\"token number\">1080</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"lbp_image_hash\"><a class=\"anchor\" href=\"#lbp_image_hash\">#</a> lbp_image_hash()</h3>\n<p>哈希局部二值算法计算图片哈希值</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>lbp_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"p_image_hash\"><a class=\"anchor\" href=\"#p_image_hash\">#</a> p_image_hash()</h3>\n<p>感知哈希算法计算图片哈希值</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>p_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"pca_image_hash\"><a class=\"anchor\" href=\"#pca_image_hash\">#</a> pca_image_hash()</h3>\n<p>主成分分析算法计算图片哈希值</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>pca_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"fft_image_hash\"><a class=\"anchor\" href=\"#fft_image_hash\">#</a> fft_image_hash()</h3>\n<p>傅里叶变换算法计算哈希值</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>fft_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"average_image_hash\"><a class=\"anchor\" href=\"#average_image_hash\">#</a> average_image_hash()</h3>\n<p>哈希平均算法计算图片哈希值</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>average_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"remove_same_images\"><a class=\"anchor\" href=\"#remove_same_images\">#</a> remove_same_images()</h3>\n<p>删除某目录下相同的图片且每张图片保留一张。<br />\n具体实现：通过计算图片的哈希值，相同图片则会被删除。</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>remove_same_images<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"aocr模块\"><a class=\"anchor\" href=\"#aocr模块\">#</a> Aocr 模块</h2>\n<p>使用本模块请前往<span class=\"exturl\" data-url=\"aHR0cHM6Ly90ZXNzZXJhY3Qtb2NyLmdpdGh1Yi5pby90ZXNzZG9jL0luc3RhbGxhdGlvbi5odG1s\">点击这里</span>下载 OCR 引擎</p>\n<h3 id=\"image_to_text\"><a class=\"anchor\" href=\"#image_to_text\">#</a> image_to_text()</h3>\n<p>识别图像中的文本，参数 filePath：图片路径，lang：图片里的语言，默认中文，可以多语言，例：'chi_sim+eng',timeout: 识别超时时间，默认 0，即无</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>text <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>image_to_text<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"image_to_pdf\"><a class=\"anchor\" href=\"#image_to_pdf\">#</a> image_to_pdf()</h3>\n<p>将图片转为可搜索的 pdf 文件</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Aocr<span class=\"token punctuation\">.</span>image_to_pdf<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/pdf/test.pdf'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"image_to_hocr\"><a class=\"anchor\" href=\"#image_to_hocr\">#</a> image_to_hocr()</h3>\n<p>将图片转为 HOCR</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>hocr <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>image_to_hocr<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test,png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"image_to_altoxml\"><a class=\"anchor\" href=\"#image_to_altoxml\">#</a> image_to_AltoXml()</h3>\n<p>将图片转为 AltXml</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>xml <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>image_to_AltoXml<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"get_image_data\"><a class=\"anchor\" href=\"#get_image_data\">#</a> get_image_data()</h3>\n<p>获取图片详细的数据，包括框、置信度、行号和页码。需要 tesseract 版本 3.05+</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>data <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>get_image_data<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"get_image_osd\"><a class=\"anchor\" href=\"#get_image_osd\">#</a> get_image_osd()</h3>\n<p>获取有关方向和脚本检测的信息</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>osd <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>get_image_osd<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"get_image_boxs\"><a class=\"anchor\" href=\"#get_image_boxs\">#</a> get_image_boxs()</h3>\n<p>获取图片边界框的估计值</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>boxs <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>get_image_boxs<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"check_languages\"><a class=\"anchor\" href=\"#check_languages\">#</a> check_languages()</h3>\n<p>获取已安装的语言包</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>lang <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>check_languages<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>lang<span class=\"token punctuation\">)</span></pre></td></tr></table></figure></div>\n<div class=\"tab\" data-id=\"id1\" data-title=\"English Docs\">\n<h1 id=\"welcome-to-you\"><a class=\"anchor\" href=\"#welcome-to-you\">#</a> Welcome to you !</h1>\n<p>If you see it, there are two possibilities, either for ImageMagic or just hanging out, but you're welcome here!</p>\n<h1 id=\"where-to-get-it\"><a class=\"anchor\" href=\"#where-to-get-it\">#</a> Where to get it ?</h1>\n<ol>\n<li>Download using pip:</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>pip <span class=\"token function\">install</span> ImageMagic</pre></td></tr></table></figure><ol start=\"2\">\n<li>Build from source:<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L0ltYWdlTWFnaWM=\">source</span></li>\n</ol>\n<h1 id=\"docs-2\"><a class=\"anchor\" href=\"#docs-2\">#</a> DOCS</h1>\n<p>Thanks for using ImageMagic, which is temporary documentation for Python's third-party library ImageMagic, check it out. If there are any problems during use or what you think can be improved, please contact me!</p>\n<h2 id=\"image-module\"><a class=\"anchor\" href=\"#image-module\">#</a> Image module</h2>\n<h3 id=\"word_to_image-2\"><a class=\"anchor\" href=\"#word_to_image-2\">#</a> word_to_image()</h3>\n<p>Convert text to images</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>word_to_image<span class=\"token punctuation\">(</span><span class=\"token string\">\"Here's the text you want to turn into an image.\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/1.png'</span><span class=\"token punctuation\">,</span>fontPath<span class=\"token operator\">=</span><span class=\"token string\">'F:/ttf/test.ttf'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"voice_to_word-2\"><a class=\"anchor\" href=\"#voice_to_word-2\">#</a> voice_to_word()</h3>\n<p>To identify the content in the audio and use iFLYTEK's voice transcription, you need to go to [click here] (<span class=\"exturl\" data-url=\"aHR0cHM6Ly9jb25zb2xlLnhmeXVuLmNuL3NlcnZpY2VzL2xmYXNy\">https://console.xfyun.cn/services/lfasr</span>) to get your appid and key, which are supported in WAV, FLAC, OPUS, M4A, MP3.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>appid <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>key <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>filepath <span class=\"token operator\">=</span> <span class=\"token string\">\"F:/mp3/test.mp3\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>audio <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>Audio<span class=\"token punctuation\">(</span>appid<span class=\"token punctuation\">,</span>key<span class=\"token punctuation\">,</span>filepath<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>text <span class=\"token operator\">=</span> audio<span class=\"token punctuation\">.</span>voice_to_word<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"audio_to_image-2\"><a class=\"anchor\" href=\"#audio_to_image-2\">#</a> audio_to_image()</h3>\n<p>To convert audio content to images, you need to go to [click here] (<span class=\"exturl\" data-url=\"aHR0cHM6Ly9jb25zb2xlLnhmeXVuLmNuL3NlcnZpY2VzL2xmYXNy\">https://console.xfyun.cn/services/lfasr</span>) to get your appid and key, which are supported in WAV, FLAC, OPUS, M4A, MP3.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>appid <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>key <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>filepath <span class=\"token operator\">=</span> <span class=\"token string\">\"F:/mp3/test.mp3\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>Image<span class=\"token punctuation\">.</span>audio_to_image<span class=\"token punctuation\">(</span>appid<span class=\"token punctuation\">,</span>key<span class=\"token punctuation\">,</span>filepath<span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">#The last parameter is the address where the image is saved.</span></pre></td></tr></table></figure><h3 id=\"categorize_image-2\"><a class=\"anchor\" href=\"#categorize_image-2\">#</a> categorize_image()</h3>\n<p>The images in the category folder, including jpg, jpeg, png, webp, bmp, tif, tiff, gif, svg, wmf, will generate a new folder named with the suffix of the existing file under this folder, and copy the same kind of files into it.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>categorize_image<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/images'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">#Enter your folder path here</span></pre></td></tr></table></figure><h3 id=\"convert-2\"><a class=\"anchor\" href=\"#convert-2\">#</a> convert()</h3>\n<p>Convert image format.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>convert<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'webp'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/test.webp'</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">#The first parameter is the path to the original file, the second is the converted format, and the third is the saved path.</span></pre></td></tr></table></figure><h3 id=\"equal_scale_image-2\"><a class=\"anchor\" href=\"#equal_scale_image-2\">#</a> equal_scale_image()</h3>\n<p>Reduce or enlarge the image at equal scale.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>equal_scale_image<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/save.png'</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">#The last parameter is the multiplier.</span></pre></td></tr></table></figure><h3 id=\"customize_image-2\"><a class=\"anchor\" href=\"#customize_image-2\">#</a> customize_image()</h3>\n<p>Customize the image resolution, if you do not enter the third and fourth parameters, the original parameters will be used.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>customize_image<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/image/save.png'</span><span class=\"token punctuation\">,</span><span class=\"token number\">1960</span><span class=\"token punctuation\">,</span><span class=\"token number\">1080</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"lbp_image_hash-2\"><a class=\"anchor\" href=\"#lbp_image_hash-2\">#</a> lbp_image_hash()</h3>\n<p>The hash local binary algorithm calculates the image hash value.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>lbp_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"p_image_hash-2\"><a class=\"anchor\" href=\"#p_image_hash-2\">#</a> p_image_hash()</h3>\n<p>The hash awareness algorithm calculates the image hash value.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>p_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"pca_image_hash-2\"><a class=\"anchor\" href=\"#pca_image_hash-2\">#</a> pca_image_hash()</h3>\n<p>The principal component analysis algorithm calculates the image hash value.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>pca_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"fft_image_hash-2\"><a class=\"anchor\" href=\"#fft_image_hash-2\">#</a> fft_image_hash()</h3>\n<p>The Fourier transform algorithm computes the hash value.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>fft_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"average_image_hash-2\"><a class=\"anchor\" href=\"#average_image_hash-2\">#</a> average_image_hash()</h3>\n<p>The hash averaging algorithm calculates the image hash value.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> Image<span class=\"token punctuation\">.</span>average_image_hash<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"remove_same_images-2\"><a class=\"anchor\" href=\"#remove_same_images-2\">#</a> remove_same_images()</h3>\n<p>Delete the same images in a directory and keep one image per image.<br />\nImplementation: By calculating the hash value of the image, the same image will be deleted.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Image</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Image<span class=\"token punctuation\">.</span>remove_same_images<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"aocr-module\"><a class=\"anchor\" href=\"#aocr-module\">#</a> Aocr module</h2>\n<p>To use this module, go to [click here] (<span class=\"exturl\" data-url=\"aHR0cHM6Ly90ZXNzZXJhY3Qtb2NyLmdpdGh1Yi5pby90ZXNzZG9jL0luc3RhbGxhdGlvbi5odG1s\">https://tesseract-ocr.github.io/tessdoc/Installation.html</span>) to download the OCR engine.</p>\n<h3 id=\"image_to_text-2\"><a class=\"anchor\" href=\"#image_to_text-2\">#</a> image_to_text()</h3>\n<p>Identify text in an image, parameters filePath: image path, lang: language in the image, default Chinese, can be multilingual, for example: 'chi_sim+eng', timeout: recognition timeout, default 0, that is, none.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>text <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>image_to_text<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"image_to_pdf-2\"><a class=\"anchor\" href=\"#image_to_pdf-2\">#</a> image_to_pdf()</h3>\n<p>Turn images into searchable PDF files.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>Aocr<span class=\"token punctuation\">.</span>image_to_pdf<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">,</span><span class=\"token string\">'F:/pdf/test.pdf'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"image_to_hocr-2\"><a class=\"anchor\" href=\"#image_to_hocr-2\">#</a> image_to_hocr()</h3>\n<p>Turn the picture into HOCR.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>hocr <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>image_to_hocr<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test,png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"image_to_altoxml-2\"><a class=\"anchor\" href=\"#image_to_altoxml-2\">#</a> image_to_AltoXml()</h3>\n<p>Convert the image to AltXml.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>xml <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>image_to_AltoXml<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"get_image_data-2\"><a class=\"anchor\" href=\"#get_image_data-2\">#</a> get_image_data()</h3>\n<p>Get detailed data for an image, including boxes, confidence, line numbers, and page numbers. Requires tesseract version 3.05+.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>data <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>get_image_data<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"get_image_osd-2\"><a class=\"anchor\" href=\"#get_image_osd-2\">#</a> get_image_osd()</h3>\n<p>Get information about orientation and script detection.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>osd <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>get_image_osd<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"get_image_boxs-2\"><a class=\"anchor\" href=\"#get_image_boxs-2\">#</a> get_image_boxs()</h3>\n<p>Gets an estimate of the picture bounding box.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>boxs <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>get_image_boxs<span class=\"token punctuation\">(</span><span class=\"token string\">'F:/image/test.png'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h3 id=\"check_languages-2\"><a class=\"anchor\" href=\"#check_languages-2\">#</a> check_languages()</h3>\n<p>Gets the installed language packs.</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">from</span> ImageMagic <span class=\"token keyword\">import</span> Aocr</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>lang <span class=\"token operator\">=</span> Aocr<span class=\"token punctuation\">.</span>check_languages<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>lang<span class=\"token punctuation\">)</span></pre></td></tr></table></figure></div>\n",
            "tags": [
                "Python",
                "ImageMagic",
                "API文档",
                "ImageMagic"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/05/01/%E9%93%9C%E9%92%9F%E7%88%AC%E8%99%AB/",
            "url": "https://blog.asxe.vip/2023/05/01/%E9%93%9C%E9%92%9F%E7%88%AC%E8%99%AB/",
            "title": "铜钟爬虫",
            "date_published": "2023-05-01T09:46:20.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<p>因为某些原因，不再使用原标题</p>\n<h1 id=\"开始\"><a class=\"anchor\" href=\"#开始\">#</a> 开始</h1>\n<ol>\n<li><span class=\"exturl\" data-url=\"aHR0cHM6Ly90b256aG9uLmNvbS8=\">铜钟</span><br />\n<span class=\"label warnning\">仅限交流与学习，勿作非法用途</span><br />\n<span class=\"label warnning\">版权所有，转载请注明出处，本页如有违规，请联系删除</span></li>\n</ol>\n<h1 id=\"正文\"><a class=\"anchor\" href=\"#正文\">#</a> 正文</h1>\n<p>不懂的地方请在评论区留言</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> requests</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> json</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>res <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>  <span class=\"token comment\">#模块级定义，因为下面用了全局变量</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">class</span> <span class=\"token class-name\">TongZhong</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        self<span class=\"token punctuation\">.</span>api <span class=\"token operator\">=</span> <span class=\"token string\">'https://tonzhon.com/api/playlists/63749694e6e9cbb9d6f1b10b'</span>  <span class=\"token comment\">#这是歌单的 API 地址，注意，不是歌单的地址，而是歌单的 API 地址，两者有区分</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>        self<span class=\"token punctuation\">.</span>qq <span class=\"token operator\">=</span> <span class=\"token string\">'https://music-api.tonzhon.com/song_source/qq/&#123;song_id&#125;'</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>        self<span class=\"token punctuation\">.</span>kuwo <span class=\"token operator\">=</span> <span class=\"token string\">'https://music-api.tonzhon.com/song_source/kuwo/&#123;song_id&#125;'</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>        self<span class=\"token punctuation\">.</span>netease <span class=\"token operator\">=</span> <span class=\"token string\">'https://music-api.tonzhon.com/song_source/netease/&#123;song_id&#125;'</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        self<span class=\"token punctuation\">.</span>headers<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>            <span class=\"token string\">'user-agent'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.64'</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">get_index</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        all_response <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>api<span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>        songs <span class=\"token operator\">=</span> all_response<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'playlist'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'songs'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>        <span class=\"token comment\">#三个列表递推，得到所有元素</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>        song_ids <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>song<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'originalId'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> song <span class=\"token keyword\">in</span> songs<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>        song_names <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>song<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'name'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> song <span class=\"token keyword\">in</span> songs<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>        platforms <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>song<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'platform'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> song <span class=\"token keyword\">in</span> songs<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>        <span class=\"token keyword\">return</span> song_ids<span class=\"token punctuation\">,</span>song_names<span class=\"token punctuation\">,</span>platforms</pre></td></tr><tr><td data-num=\"25\"></td><td><pre></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">get_response</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span>song_id<span class=\"token punctuation\">,</span>song_name<span class=\"token punctuation\">,</span>platform<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>        <span class=\"token keyword\">global</span> res  <span class=\"token comment\">#全局变量</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>        <span class=\"token keyword\">if</span> platform <span class=\"token operator\">==</span> <span class=\"token string\">'qq'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>            res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>qq<span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>song_id<span class=\"token operator\">=</span>song_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>        <span class=\"token keyword\">elif</span> platform <span class=\"token operator\">==</span> <span class=\"token string\">'kuwo'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>            res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>kuwo<span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>song_id<span class=\"token operator\">=</span>song_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>        <span class=\"token keyword\">elif</span> platform <span class=\"token operator\">==</span> <span class=\"token string\">'netease'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>            res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>netease<span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>song_id<span class=\"token operator\">=</span>song_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>        <span class=\"token keyword\">if</span> res <span class=\"token keyword\">is</span> <span class=\"token keyword\">not</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>            <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>                links <span class=\"token operator\">=</span> res<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'songSource'</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">#这个元素可能不存在，因此需用 try-except 语句</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>                res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>links<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>                <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'./music/</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>song_name<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">.mp3'</span></span><span class=\"token punctuation\">,</span><span class=\"token string\">'wb'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> f<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>                    f<span class=\"token punctuation\">.</span>write<span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>            <span class=\"token keyword\">except</span> AttributeError <span class=\"token keyword\">as</span> a<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>                <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'错误：</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>a<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>            <span class=\"token keyword\">pass</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre></pre></td></tr><tr><td data-num=\"45\"></td><td><pre><span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>    song_ids<span class=\"token punctuation\">,</span>song_names<span class=\"token punctuation\">,</span>platforms <span class=\"token operator\">=</span> TongZhong<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get_index<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>    <span class=\"token keyword\">for</span> song_id<span class=\"token punctuation\">,</span>song_name<span class=\"token punctuation\">,</span>platform <span class=\"token keyword\">in</span> <span class=\"token builtin\">zip</span><span class=\"token punctuation\">(</span>song_ids<span class=\"token punctuation\">,</span>song_names<span class=\"token punctuation\">,</span>platforms<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>  <span class=\"token comment\">#有三个元素，用 zip () 语法</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre>        TongZhong<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get_response<span class=\"token punctuation\">(</span>song_id<span class=\"token punctuation\">,</span>song_name<span class=\"token punctuation\">,</span>platform<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h1 id=\"效果\"><a class=\"anchor\" href=\"#效果\">#</a> 效果</h1>\n<p><img data-src=\"https://gitee.com/asxe/image/raw/master/blog/tongzhong_music/1.png\" alt=\"1.png\" /></p>\n",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "爬虫"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/04/22/GitHub%E9%A1%B5%E9%9D%A2%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9F%9F%E5%90%8D%EF%BC%88%E5%8F%82%E8%80%83%E4%BA%8E%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%EF%BC%89/",
            "url": "https://blog.asxe.vip/2023/04/22/GitHub%E9%A1%B5%E9%9D%A2%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9F%9F%E5%90%8D%EF%BC%88%E5%8F%82%E8%80%83%E4%BA%8E%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%EF%BC%89/",
            "title": "GitHub页面自定义域名（参考于官方文档）",
            "date_published": "2023-04-22T14:13:13.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h1 id=\"开头\"><a class=\"anchor\" href=\"#开头\">#</a> 开头</h1>\n<p>我为什么发这篇文章？因为今天采购了新的域名，并准备给博客换上新的” 名字 “，在配置过程中遇到的一些问题和坑，在此提出，说不定以后会有人用着呢。</p>\n<p>注意本页底部的避坑一栏！</p>\n<p>若是仍有不懂的地方，可以在评论区留言哦！</p>\n<h1 id=\"开始\"><a class=\"anchor\" href=\"#开始\">#</a> 开始</h1>\n<p><span class=\"label danger\">注意：以下配置方法选择其一即可！！！</span></p>\n<h2 id=\"配置子域名\"><a class=\"anchor\" href=\"#配置子域名\">#</a> 配置子域名</h2>\n<p>配置过程中，最重要的就是 DNS 解析，配置子域名很简单，如下</p>\n<ol>\n<li>记录类型选择 CNAME，记录值就是你的原域名，即<span class=\"label info\"> &lt;user&gt;.github.io</span>，请注意，我建议你将博客仓库的仓库名设为与你的用户名相同</li>\n<li>主机记录最好为<span class=\"label info\"> www</span> 或者<span class=\"label info\"> blog</span>，因为官方文档上给的就是这两个！</li>\n</ol>\n<h2 id=\"配置apex域名\"><a class=\"anchor\" href=\"#配置apex域名\">#</a> 配置 apex 域名</h2>\n<p><span class=\"label danger\">下面两种解析方法任选其一即可</span></p>\n<ol>\n<li>记录类型选择 A 类型，记录值则有四个，如下</li>\n</ol>\n<pre><code>185.199.108.153\n185.199.109.153\n185.199.110.153\n185.199.111.153\n</code></pre>\n<p>即你需要解析四个 A 记录<br />\n 2. 你也可以选择 AAAA 记录，即 IPv6，但是这种方法的速度很慢！记录值也是四个，如下</p>\n<pre><code>2606:50c0:8000::153\n2606:50c0:8001::153\n2606:50c0:8002::153\n2606:50c0:8003::153\n</code></pre>\n<h2 id=\"配置apex域和www子域变体\"><a class=\"anchor\" href=\"#配置apex域和www子域变体\">#</a> 配置 apex 域和 www 子域变体</h2>\n<p>这个就很简单了，就是将上面两种配置都解析上，但是子域名解析的主机记录必须为 www</p>\n<h1 id=\"最后\"><a class=\"anchor\" href=\"#最后\">#</a> 最后</h1>\n<p>选择以上任意一种解析后，即可到 GitHub 进行设置</p>\n<ol>\n<li>打开你的博客仓库并进入设置</li>\n<li>点击到 pages，即页面</li>\n<li>将你的域名输入其中，然后保存即可</li>\n</ol>\n<h1 id=\"避坑\"><a class=\"anchor\" href=\"#避坑\">#</a> 避坑！</h1>\n<ol>\n<li>当你在保存域名时，很有可能会报【asxe.vip 及其备用名称配置不正确<br />\n域不会解析到 GitHub 页面服务器。有关详细信息，请参阅文档 （NotServedByPagesError）。】<br />\n其实这个并不会影响访问你的博客，可以忽略</li>\n<li>若你解析了 CNAME 类型，就需要在仓库里添加一个文件，名称为 CNAME，<span class=\"label danger\">注意必须是全部大写</span>，里面写你的域名即可</li>\n<li>基于 hexo 搭建的博客，当你推送时可能会删掉仓库原所有文件，即包括了<span class=\"label info\"> CNAME 文件</span>，那么你可以将此文件放在你博客文件夹根目录的 source 文件夹里面，这样你每次提交的时候就会带上这个文件一起提交在仓库了，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/github_site/1.png\" alt=\"1.png\" /></li>\n</ol>\n",
            "tags": [
                "GitHub",
                "避坑"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/04/21/%E9%9A%8F%E6%9C%BA%E5%9B%BE%E7%89%87API/",
            "url": "https://blog.asxe.vip/2023/04/21/%E9%9A%8F%E6%9C%BA%E5%9B%BE%E7%89%87API/",
            "title": "随机图片API",
            "date_published": "2023-04-21T04:26:02.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h1 id=\"api\"><a class=\"anchor\" href=\"#api\">#</a> API</h1>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9hcGkuYXN4ZS52aXAv\">API</span></p>\n<h1 id=\"说明\"><a class=\"anchor\" href=\"#说明\">#</a> 说明</h1>\n<ol>\n<li>图片格式均为 webp，经过压缩优化处理，资源消耗更少，访问速度更快</li>\n<li>图库将长期更新，图片来源为网络以及 AI 绘画（stable diffusion）</li>\n<li>大家如果有好的图片投稿，可以评论区留言哦，留下你的邮箱！我会联系你！</li>\n</ol>\n<h1 id=\"新增\"><a class=\"anchor\" href=\"#新增\">#</a> 新增</h1>\n<ol>\n<li>23 年 4 月 24 日新增：三次元白丝 API，二次元风景图 API</li>\n</ol>\n<h1 id=\"注意\"><a class=\"anchor\" href=\"#注意\">#</a> 注意</h1>\n<p>不建议使用爬虫，会导致加载速度变慢！</p>\n",
            "tags": [
                "二次元",
                "API",
                "三次元"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/04/12/%E5%9F%BA%E4%BA%8Emirai%E5%92%8Cgraia%E7%9A%84QQ%E6%9C%BA%E5%99%A8%E4%BA%BA/",
            "url": "https://blog.asxe.vip/2023/04/12/%E5%9F%BA%E4%BA%8Emirai%E5%92%8Cgraia%E7%9A%84QQ%E6%9C%BA%E5%99%A8%E4%BA%BA/",
            "title": "基于mirai和graia的QQ机器人",
            "date_published": "2023-04-12T09:24:42.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"开始\"><a class=\"anchor\" href=\"#开始\">#</a> 开始</h2>\n<p>本文所用代码已发布到 GitHub，<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FzeGV6L0dhbGF4eS1SaXZlci1Cb3Q=\">地址</span><br />\n mirai 下载最新版本即可<br />\n<span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL21hbW9lL21pcmFpL3JlbGVhc2Vz\"> mirai</span></p>\n<h2 id=\"功能\"><a class=\"anchor\" href=\"#功能\">#</a> 功能</h2>\n<ol>\n<li>ChatGPT  API 版（无上下文）（需魔法） /gpt</li>\n<li>New Bing （有上下文）（需魔法） /bing</li>\n<li>音乐（目前支持酷我和网易云）/kw   /wyy</li>\n<li>群违规词检测</li>\n<li>入群申请检测与审核</li>\n<li>/kick   /ma   /uma   /mo   /umo   /tra   /shutdown</li>\n<li>控制端后门</li>\n</ol>\n<h3 id=\"部分功能使用方法及解释\"><a class=\"anchor\" href=\"#部分功能使用方法及解释\">#</a> 部分功能使用方法及解释</h3>\n<p>ChatGPT：/gpt 问题<br />\n New Bing：/bing 问题<br />\n音乐：/kw 音乐名  和  /wyy 音乐名<br />\n关机：/shutdown  （仅系统管理员可用）<br />\n清除 new bing 记忆或者重启程序：/clean<br />\n 控制端后门：/s 文本  这段命令可以让机器人将文本发送至指定群聊，仅系统管理员可用（这段指令只能私发给机器人）<br />\n/kick @xxx  踢出某人（注意指令和艾特间的空格）<br />\n/ma 开启全体禁言<br />\n /uma 关闭全体禁言<br />\n /mo @xxx 时间 （禁言某成员，时间单位为分钟）<br />\n/umo @xxx 解除某成员禁言</p>\n<h2 id=\"注意\"><a class=\"anchor\" href=\"#注意\">#</a> 注意！！</h2>\n<p>1.ChatGPT 需要你有一个<span class=\"label info\"> api key</span><br />\n2.New Bing 需要你有一个<span class=\"label info\">通过候补名单的账号</span><br />\n 3.New Bing cookie 获取方法如下：<br />\n首先去<span class=\"exturl\" data-url=\"aHR0cHM6Ly9taWNyb3NvZnRlZGdlLm1pY3Jvc29mdC5jb20vYWRkb25zL2RldGFpbC9jb29raWVlZGl0b3IvbmVhcGxtZmtnaGFnZWJva2tocGpwb2ViaGRsZWRsZmk=\">点这！</span>下载好 cookie editor<br />\n 然后：<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/mirai_graia_qqbot/1.png\" alt=\"1.png\" /><br />\n 点击 Export as JSON，然后去 modules 目录下的 cookie.json 文件粘贴上就行了</p>\n",
            "tags": [
                "Python",
                "python",
                "QQ机器人"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/03/28/%E7%88%AC%E8%99%AB%E4%B9%8Bhttpx%E5%BA%93/",
            "url": "https://blog.asxe.vip/2023/03/28/%E7%88%AC%E8%99%AB%E4%B9%8Bhttpx%E5%BA%93/",
            "title": "HTTP2.0之httpx",
            "date_published": "2023-03-28T13:04:23.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"开始\"><a class=\"anchor\" href=\"#开始\">#</a> 开始</h2>\n<p>在大家写爬虫的时候，想必用得最多的库就是<span class=\"label info\"> requests</span> 了，在长久的使用过程中，大家便会发现，若是<span class=\"label warning\"> HTTP1.1</span> 的链接，那么<span class=\"label info\"> requests</span> 是完全没啥问题的，但如若为<span class=\"label warning\"> HTTP2.0</span>，那么就不行了，因为<span class=\"label info\"> requests</span> 并未支持<span class=\"label warning\"> HTTP2.0</span>，因此本文介绍一个支持<span class=\"label warning\"> HTTP2.0</span> 的库 --<span class=\"label info\">httpx</span></p>\n<h2 id=\"正文\"><a class=\"anchor\" href=\"#正文\">#</a> 正文</h2>\n<h3 id=\"安装httpx\"><a class=\"anchor\" href=\"#安装httpx\">#</a> 安装 httpx</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>安装</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre>pip3 install <span class=\"token string\">\"httpx[http2]\"</span></pre></td></tr></table></figure><h3 id=\"基本使用\"><a class=\"anchor\" href=\"#基本使用\">#</a> 基本使用</h3>\n<p><span class=\"label info\">httpx</span> 的 api 与<span class=\"label info\"> requests</span> 相似，例如</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> httpx</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>url<span class=\"token operator\">=</span><span class=\"token string\">'https://www.baidu.com'</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>res<span class=\"token operator\">=</span>httpx<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status_code<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>有点感觉没？<br />\n 相同的，也可以带上一些对象</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> httpx</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>header<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token string\">'user-agent'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54'</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>url<span class=\"token operator\">=</span><span class=\"token string\">'https://www.baidu.com'</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>res<span class=\"token operator\">=</span>httpx<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>header<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>status_code<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>这里即是带上了一个<span class=\"label info\"> headers</span> 对象<br />\n但是这并不是本文的重点！我们接着说<br />\n链接：<span class=\"exturl\" data-url=\"aHR0cHM6Ly9zcGExNi5zY3JhcGUuY2VudGVy\">https://spa16.scrape.center</span><br />\n 这个链接是<span class=\"label warning\"> HTTP2.0</span> 的<br />\n我们使用<span class=\"label info\"> httpx</span> 请求一下</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>测试</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> httpx</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>header<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token string\">'user-agent'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54'</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>url<span class=\"token operator\">=</span><span class=\"token string\">'https://spa16.scrape.center'</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>res<span class=\"token operator\">=</span>httpx<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>header<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>可以发现，程序报错了！<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/httpx/1.png\" alt=\"1.png\" /><br />\n 这是怎么回事？不是说好了支持<span class=\"label warning\"> HTTP2.0</span> 吗？什么情况？<br />\n别急，那是因为<span class=\"label info\"> httpx</span> 默认是开启的<span class=\"label warning\"> http1.1</span> 的，需要我们声明一下才行，如下</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> httpx</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>header<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token string\">'user-agent'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54'</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>url<span class=\"token operator\">=</span><span class=\"token string\">'https://spa16.scrape.center'</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>client<span class=\"token operator\">=</span>httpx<span class=\"token punctuation\">.</span>Client<span class=\"token punctuation\">(</span>http2<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>res<span class=\"token operator\">=</span>client<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>header<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>http_version<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>此处我们声明一个<span class=\"label info\"> Client</span> 对象，并将<span class=\"label danger\"> http2 设置为 true</span>，那么便开启了<span class=\"label warning\"> HTTP2.0</span> 的支持<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/httpx/2.png\" alt=\"2.png\" /><br />\n 可以看到，打印出来的 HTTP 版本也确实是<span class=\"label warning\"> HTTP2.0</span> 的，访问成功了！</p>\n<h3 id=\"扩展\"><a class=\"anchor\" href=\"#扩展\">#</a> 扩展</h3>\n<p>httpx 库还支持异步请求，异步操作请查看这一篇博客<br />\n<span class=\"exturl\" data-url=\"aHR0cHM6Ly9hc3hlei5naXRodWIuaW8vMjAyMy8wMy8wOC8lRTUlQkMlODIlRTYlQUQlQTUlRTclODglQUMlRTglOTklQUIlRTYlOUMlQkElRTUlODglQjYlRTQlQjglOEUlRTUlQUUlOUUlRTQlQkUlOEIv\">链接</span></p>\n",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "爬虫"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/03/12/%E6%96%B0%E7%89%88%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91%E4%B9%8Bjs%E9%80%86%E5%90%91/",
            "url": "https://blog.asxe.vip/2023/03/12/%E6%96%B0%E7%89%88%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91%E4%B9%8Bjs%E9%80%86%E5%90%91/",
            "title": "新版有道翻译之js逆向",
            "date_published": "2023-03-12T02:18:38.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"准备\"><a class=\"anchor\" href=\"#准备\">#</a> 准备</h2>\n<p>本文仅讲解某道的 js 逆向部分，json 逆向不进行讲解</p>\n<p>网址：<span class=\"exturl\" data-url=\"aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLw==\">网址</span></p>\n<h2 id=\"开始\"><a class=\"anchor\" href=\"#开始\">#</a> 开始</h2>\n<h3 id=\"查找api\"><a class=\"anchor\" href=\"#查找api\">#</a> 查找 api</h3>\n<p>进入首页，F12 打开检查页面，选择网络记录并选择<span class=\"label info\"> XHR</span> 类<br />\n在翻译框中任意输入，即可看到抓取到两个 api, 如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/1.png\" alt=\"1.png\" /><br />\n 我们点开<span class=\"label info\"> key</span>api 并查看其响应，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/2.png\" alt=\"2.png\" /><br />\n 可以看到其并非翻译接口，接下来点开另一个 api 并查看其响应，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/3.png\" alt=\"3.png\" /><br />\n 这个则是一堆密文，即是返回的翻译结果等进行了 json 加密</p>\n<h3 id=\"查找加密函数\"><a class=\"anchor\" href=\"#查找加密函数\">#</a> 查找加密函数</h3>\n<p>我们查看其<span class=\"label info\">表单数据</span>（即负载），如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/4.png\" alt=\"4.png\" /><br />\n 其中参数<span class=\"label info\"> i</span>, 很明显就是输入的文字，此时我们再输入任意文字在翻译框中，经对比，可以发现仅有<span class=\"label info\"> sign</span> 和<span class=\"label info\"> mysticTime</span> 是变化的，<br />\n此时便在源代码中搜索<span class=\"label info\"> sign:</span>,（加个冒号方便查找），最后找到一处<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/5.png\" alt=\"5.png\" /><br />\n 此处定义了一个<span class=\"label info\"> t 变量</span>，用于获取时间戳，而<span class=\"label info\"> mysticTime</span> 的返回值正是<span class=\"label info\"> t 变量</span>，则判定<span class=\"label info\"> mysticTime</span> 为时间戳，<br />\n<span class=\"label info\">sign</span> 则是调用了一个<span class=\"label warning\">方法 v</span>，其中传入参数<span class=\"label info\"> t</span> 和<span class=\"label info\"> e</span>,<span class=\"label info\">t</span> 我们知道了是时间戳，那么<span class=\"label info\"> e</span> 呢？<br />\n那么我们便在<span class=\"label info\"> sign</span> 处打上断点，再翻译一遍，可以发现程序此时停在了<span class=\"label info\"> sign</span> 处，我们将鼠标放在<span class=\"label info\"> e</span> 上，可以看到<span class=\"label info\"> e</span> 的值是一个字符串<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/6.png\" alt=\"6.png\" /></p>\n<p>知道了<span class=\"label info\"> t</span> 和<span class=\"label info\"> e</span>, 那么我们就要看<span class=\"label warning\">方法 v</span> 是一个什么，将鼠标放在<span class=\"label info\"> v</span> 上，即可看到方法位于哪里，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/7.png\" alt=\"7.png\" /><br />\n 定位到<span class=\"label warning\"> v 方法</span>，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/8.png\" alt=\"8.png\" /><br />\n<span class=\"label warning\">v 方法</span>返回的是一个<span class=\"label warning\"> g 方法</span>处理过后的值，用同样的方法定位到<span class=\"label warning\">方法 g</span>，如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/youdao_js_reverse/9.png\" alt=\"9.png\" /><br />\n 可以清晰的看到是一个<span class=\"label danger\"> MD5 加密</span></p>\n<h3 id=\"思路梳理\"><a class=\"anchor\" href=\"#思路梳理\">#</a> 思路梳理</h3>\n<p>我们知道了表单中的<span class=\"label info\">参数 i</span> 就是要翻译的文字，<span class=\"label info\">mysticTime</span> 则是时间戳，<span class=\"label info\">sign</span> 则是对拼接后的字符串进行<span class=\"label info\"> MD5 加密</span></p>\n<h3 id=\"python原理复现\"><a class=\"anchor\" href=\"#python原理复现\">#</a> python 原理复现</h3>\n<h4 id=\"md5加密\"><a class=\"anchor\" href=\"#md5加密\">#</a> MD5 加密</h4>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>md5加密</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">md5</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>        md <span class=\"token operator\">=</span> hashlib<span class=\"token punctuation\">.</span>md5<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        md<span class=\"token punctuation\">.</span>update<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        <span class=\"token keyword\">return</span> md<span class=\"token punctuation\">.</span>hexdigest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h4 id=\"时间戳\"><a class=\"anchor\" href=\"#时间戳\">#</a> 时间戳</h4>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>时间戳</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre>time_get<span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><h2 id=\"完整代码\"><a class=\"anchor\" href=\"#完整代码\">#</a> 完整代码</h2>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>完整代码</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#此代码仅返回加密的 json，若需看到明文，还需要进行 json 逆向，本文不予解释</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> requests</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">import</span> hashlib</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">import</span> time</pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">class</span> <span class=\"token class-name\">Spider</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        self<span class=\"token punctuation\">.</span>headers<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>            <span class=\"token string\">'Cookie'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'OUTFOX_SEARCH_USER_ID=-864231348@10.108.162.133; OUTFOX_SEARCH_USER_ID_NCOO=972176560.743925; _ga=GA1.2.1317022467.1665466107; UM_distinctid=184aa25fe24a7b-0ff2966cce682a-7d5d5471-144000-184aa25fe2514e1; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcIJ43UT_s_Q5TofIUwy'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>            <span class=\"token string\">'User-Agent'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>            <span class=\"token string\">'Referer'</span><span class=\"token punctuation\">:</span><span class=\"token string\">'https://fanyi.youdao.com/'</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>        self<span class=\"token punctuation\">.</span>url<span class=\"token operator\">=</span><span class=\"token string\">'https://dict.youdao.com/webtranslate'</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">md5</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>        md <span class=\"token operator\">=</span> hashlib<span class=\"token punctuation\">.</span>md5<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>        md<span class=\"token punctuation\">.</span>update<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>        <span class=\"token keyword\">return</span> md<span class=\"token punctuation\">.</span>hexdigest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">spider</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>        time_get<span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>        sign<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>md5<span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"client=fanyideskweb&amp;mysticTime=</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>time_get<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">&amp;product=webfanyi&amp;key=fsdsogkndfokasodnaso\"</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>        data <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre>            <span class=\"token string\">\"i\"</span><span class=\"token punctuation\">:</span>text<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>            <span class=\"token string\">\"from\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"auto\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>            <span class=\"token string\">\"to\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"auto\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>            <span class=\"token string\">\"domain\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"0\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>            <span class=\"token string\">\"dictResult\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"true\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>            <span class=\"token string\">\"keyid\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"webfanyi\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre>            <span class=\"token string\">\"sign\"</span><span class=\"token punctuation\">:</span> sign<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>            <span class=\"token string\">\"client\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"fanyideskweb\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>            <span class=\"token string\">\"product\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"webfanyi\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>            <span class=\"token string\">\"appVersion\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"1.0.0\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>            <span class=\"token string\">\"vendor\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"web\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>            <span class=\"token string\">\"pointParam\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"client,mysticTime,product\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>            <span class=\"token string\">\"mysticTime\"</span><span class=\"token punctuation\">:</span>time_get<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>            <span class=\"token string\">\"keyfrom\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"fanyi.web\"</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>        response<span class=\"token operator\">=</span>requests<span class=\"token punctuation\">.</span>post<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">,</span>data<span class=\"token operator\">=</span>data<span class=\"token punctuation\">,</span>headers<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">,</span>verify<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre></pre></td></tr><tr><td data-num=\"43\"></td><td><pre><span class=\"token keyword\">if</span> __name__<span class=\"token operator\">==</span><span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>    <span class=\"token keyword\">while</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>        get_text<span class=\"token operator\">=</span><span class=\"token builtin\">input</span><span class=\"token punctuation\">(</span><span class=\"token string\">'请输入文字:'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>        Spider<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>spider<span class=\"token punctuation\">(</span>get_text<span class=\"token punctuation\">)</span></pre></td></tr></table></figure>",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "爬虫",
                "js逆向"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/03/08/%E5%BC%82%E6%AD%A5%E7%88%AC%E8%99%AB%E6%9C%BA%E5%88%B6%E4%B8%8E%E5%AE%9E%E4%BE%8B/",
            "url": "https://blog.asxe.vip/2023/03/08/%E5%BC%82%E6%AD%A5%E7%88%AC%E8%99%AB%E6%9C%BA%E5%88%B6%E4%B8%8E%E5%AE%9E%E4%BE%8B/",
            "title": "异步爬虫机制与实例",
            "date_published": "2023-03-08T01:19:08.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h1 id=\"环境准备\"><a class=\"anchor\" href=\"#环境准备\">#</a> 环境准备</h1>\n<p>python 版本 3.5 及以上，aiohttp 库</p>\n<h1 id=\"开始\"><a class=\"anchor\" href=\"#开始\">#</a> 开始</h1>\n<h2 id=\"基础了解\"><a class=\"anchor\" href=\"#基础了解\">#</a> 基础了解</h2>\n<h3 id=\"阻塞\"><a class=\"anchor\" href=\"#阻塞\">#</a> 阻塞</h3>\n<p>阻塞是程序自身无法继续执行下一步的情况，即程序未得到所需计算资源而被挂起的状态<br />\n常见为网络 I/O 阻塞，磁盘 I/O 阻塞，以及使用者的输入阻塞等等</p>\n<h3 id=\"非阻塞\"><a class=\"anchor\" href=\"#非阻塞\">#</a> 非阻塞</h3>\n<p>对比阻塞进行理解，即程序可以干别的事情，其是因阻塞的存在而存在的</p>\n<h3 id=\"同步\"><a class=\"anchor\" href=\"#同步\">#</a> 同步</h3>\n<p>顾名思义，强制让不同的请求按顺序执行，即有序</p>\n<h3 id=\"异步\"><a class=\"anchor\" href=\"#异步\">#</a> 异步</h3>\n<p>相对同步理解，即无序</p>\n<h3 id=\"多进程\"><a class=\"anchor\" href=\"#多进程\">#</a> 多进程</h3>\n<p>利用 CPU 的多核，在同一时间内执行多个不同的任务</p>\n<h3 id=\"协程\"><a class=\"anchor\" href=\"#协程\">#</a> 协程</h3>\n<p>协程本质上是单个进程，拥有自身的寄存器和栈，可以使用其实现异步操作</p>\n<h4 id=\"协程中的几个概念\"><a class=\"anchor\" href=\"#协程中的几个概念\">#</a> 协程中的几个概念</h4>\n<p><span class=\"label\">event_loop</span>：事件循环，可以将某些函数放到这上面，当运行条件满足时，就调用这个函数或者方法<br />\n<span class=\"label\"> coroutine</span>：即协程，在 python 中，指代协程对象类型，可以将协程对象放到<span class=\"label info\">事件循环</span>中。可以使用<span class=\"label info\"> async 关键字</span>来定义一个方法，当调用这个方法时，并不会立即执行这个方法，而是返回一个<span class=\"label info\">协程对象</span><br />\n<span class=\"label\"> task</span>：任务，是对协程对象的进一步封装，包含了协程对象的各个状态<br />\n<span class=\"label\"> future</span>：即将执行或没有执行的任务结果，与<span class=\"label info\"> task</span> 没有本质区别</p>\n<h2 id=\"举例\"><a class=\"anchor\" href=\"#举例\">#</a> 举例</h2>\n<h3 id=\"定义一个协程\"><a class=\"anchor\" href=\"#定义一个协程\">#</a> 定义一个协程</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>定义协程</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> asyncio</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'number:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>x<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>coroutine<span class=\"token operator\">=</span>add<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'1:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>coroutine<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'now1'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>event_loop<span class=\"token operator\">=</span>asyncio<span class=\"token punctuation\">.</span>new_event_loop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>event_loop<span class=\"token punctuation\">.</span>run_until_complete<span class=\"token punctuation\">(</span>coroutine<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'now2'</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>注：以上代码第九行<span class=\"label info\"> event_loop=asyncio.new_event_loop ()</span> 也可以换成<span class=\"label info\"> event_loop=asyncio.get_event_loop ()</span>, 但是后者在新版 python 中会收到警告<span class=\"label danger\"> DeprecationWarning: There is no current event loop   event_loop=asyncio.get_event_loop ()</span><br />\n 输出结果如下：</p>\n<pre><code>1:&lt;coroutine object add at 0x0000025B7FECF840&gt;\nnow1\nnumber:2\nnow2\n</code></pre>\n<p>首先我们直接调用了<span class=\"label info\"> add</span> 方法并打印其调用，但是我们得到的并不是答案，而是一个协程对象，接着我们使用<span class=\"label info\"> new_event_loop</span> 方法创建了一个事件循环<span class=\"label\"> event_loop</span>，并调用<span class=\"label\"> event_loop</span> 的<span class=\"label info\"> run_until_complete</span> 方法，最终才看到<span class=\"label info\"> add</span> 方法打印出的答案<br />\n此处也可以将 coroutine 封装成 task 对象（甚至可以不借助 event_loop 对象），此处不做解释，仅提供代码，请读者自行理解，如下</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>task</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> asyncio</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'number:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>x<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>coroutine<span class=\"token operator\">=</span>add<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>loop<span class=\"token operator\">=</span>asyncio<span class=\"token punctuation\">.</span>new_event_loop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>task<span class=\"token operator\">=</span>loop<span class=\"token punctuation\">.</span>create_task<span class=\"token punctuation\">(</span>coroutine<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'1:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>task<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'now1'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>loop<span class=\"token punctuation\">.</span>run_until_complete<span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'2:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>task<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'now2'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token triple-quoted-string string\">\"\"\"</pre></td></tr><tr><td data-num=\"16\"></td><td><pre>运行结果</pre></td></tr><tr><td data-num=\"17\"></td><td><pre>1:&lt;Task pending name='Task-1' coro=&lt;add() running at F:\\WorkSpace\\py-case\\main.py:3>></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>now1</pre></td></tr><tr><td data-num=\"19\"></td><td><pre>number:2</pre></td></tr><tr><td data-num=\"20\"></td><td><pre>2:&lt;Task finished name='Task-1' coro=&lt;add() done, defined at F:\\WorkSpace\\py-case\\main.py:3> result=None></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>now2</pre></td></tr><tr><td data-num=\"22\"></td><td><pre>\"\"\"</span></pre></td></tr></table></figure><figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>不借助loop对象的task</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> asyncio</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'number:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>x<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>coroutine<span class=\"token operator\">=</span>add<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>task<span class=\"token operator\">=</span>asyncio<span class=\"token punctuation\">.</span>ensure_future<span class=\"token punctuation\">(</span>coroutine<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'1:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>task<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'now1'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>loop<span class=\"token operator\">=</span>asyncio<span class=\"token punctuation\">.</span>get_event_loop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>loop<span class=\"token punctuation\">.</span>run_until_complete<span class=\"token punctuation\">(</span>task<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'2:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>task<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'now2'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token triple-quoted-string string\">\"\"\"</pre></td></tr><tr><td data-num=\"16\"></td><td><pre>运行结果</pre></td></tr><tr><td data-num=\"17\"></td><td><pre>1:&lt;Task pending name='Task-2' coro=&lt;add() running at F:\\WorkSpace\\py-case\\main.py:18>></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>now1</pre></td></tr><tr><td data-num=\"19\"></td><td><pre>number:2</pre></td></tr><tr><td data-num=\"20\"></td><td><pre>2:&lt;Task finished name='Task-2' coro=&lt;add() done, defined at F:\\WorkSpace\\py-case\\main.py:18> result=None></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>now2</pre></td></tr><tr><td data-num=\"22\"></td><td><pre>\"\"\"</span></pre></td></tr></table></figure><h3 id=\"多任务协程\"><a class=\"anchor\" href=\"#多任务协程\">#</a> 多任务协程</h3>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>多任务协程</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> asyncio</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> requests</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">get_response</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>    url<span class=\"token operator\">=</span><span class=\"token string\">'https://www.baidu.com'</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>    res<span class=\"token operator\">=</span>requests<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token keyword\">return</span> res</pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>tasks<span class=\"token operator\">=</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>asyncio<span class=\"token punctuation\">.</span>ensure_future<span class=\"token punctuation\">(</span>get_response<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'task:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>tasks<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>loop<span class=\"token operator\">=</span>asyncio<span class=\"token punctuation\">.</span>get_event_loop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>loop<span class=\"token punctuation\">.</span>run_until_complete<span class=\"token punctuation\">(</span>asyncio<span class=\"token punctuation\">.</span>wait<span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">for</span> task <span class=\"token keyword\">in</span> tasks<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'result:</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>task<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>此处我们创建 3 个请求并组成列表，然后通过<span class=\"label info\"> wait</span> 方法将其放到事件循环中，即可发起 3 次请求</p>\n<p>但是此时仍然是没有异步处理的，因为 requests 库并不支持异步，需要换成 aiohttp，况且上文还说了，实现异步就得有挂起操作，实现如下：</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>异步</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> aiohttp</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> asyncio</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">import</span> time</pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>start_time<span class=\"token operator\">=</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">get_url</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>    session<span class=\"token operator\">=</span>aiohttp<span class=\"token punctuation\">.</span>ClientSession<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>    res<span class=\"token operator\">=</span><span class=\"token keyword\">await</span> session<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token keyword\">await</span> res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token keyword\">await</span> session<span class=\"token punctuation\">.</span>close<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    <span class=\"token keyword\">return</span> res</pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">req</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    url<span class=\"token operator\">=</span><span class=\"token string\">'https://www.httpbin.org/delay/5'</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'waiting'</span><span class=\"token punctuation\">,</span>url<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    res<span class=\"token operator\">=</span><span class=\"token keyword\">await</span> get_url<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>res<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\"> - </span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>url<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>tasks<span class=\"token operator\">=</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>asyncio<span class=\"token punctuation\">.</span>ensure_future<span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>event_loop<span class=\"token operator\">=</span>asyncio<span class=\"token punctuation\">.</span>get_event_loop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>event_loop<span class=\"token punctuation\">.</span>run_until_complete<span class=\"token punctuation\">(</span>asyncio<span class=\"token punctuation\">.</span>wait<span class=\"token punctuation\">(</span>tasks<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>end_time<span class=\"token operator\">=</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>time_consuming<span class=\"token operator\">=</span>end_time<span class=\"token operator\">-</span>start_time</pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>time_consuming<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>此代码即可实现异步操作，其中 await 关键字的作用就是将协程挂起，可看到，原本需要至少 30 秒的请求时间只用了 10 秒，大大提升了爬取速度，（耗时与网络状况有关）<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/Asynchronous_crawlers/1.jpg\" alt=\"1.jpg\" /></p>\n",
            "tags": [
                "Python",
                "爬虫",
                "python",
                "爬虫"
            ]
        },
        {
            "id": "https://blog.asxe.vip/2023/03/06/%E7%BA%A2%E4%BA%BA%E7%82%B9%E9%9B%86js%E9%80%86%E5%90%91%E7%88%AC%E8%99%AB/",
            "url": "https://blog.asxe.vip/2023/03/06/%E7%BA%A2%E4%BA%BA%E7%82%B9%E9%9B%86js%E9%80%86%E5%90%91%E7%88%AC%E8%99%AB/",
            "title": "红人点集js逆向爬虫",
            "date_published": "2023-03-06T15:45:50.000Z",
            "content_html": "<p><img data-src=\"https://moe-counter.glitch.me/get/@asxe?theme=gelbooru\" alt=\"asxe\" /><br />\n<img data-src=\"https://counter.likepoems.com/get/@asxe?theme=gelbooru\" alt=\"asxe\" /></p>\n<h2 id=\"前戏\"><a class=\"anchor\" href=\"#前戏\">#</a> 前戏</h2>\n<p>之前的博客由于太久没有维护，又懒得翻新了，所以索性重新搭建了一个，看着主页空荡荡的，所以随便写一篇 js 逆向爬虫，这次的 “受害者” 是红人点集。<br />\n废话不多说，教程开始。<br />\n网址:<span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuaHJkanl1bi5jb20vIy9yYW5rbGlzdC9yYW5rbGlzdA==\"> 网址</span></p>\n<h3 id=\"正片\"><a class=\"anchor\" href=\"#正片\">#</a> 正片</h3>\n<h4 id=\"逻辑分析\"><a class=\"anchor\" href=\"#逻辑分析\">#</a> 逻辑分析</h4>\n<p>打开控制台，刷新网页，在网络记录里选择<span class=\"label info\"> XHR 类</span>（别问，问就是<span class=\"label info\"> Ajax</span>），可以看到一个 api 如下 (图片有点糊，将就一下吧)<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/Redman_point_set_js_reverse/1.jpg\" alt=\"1.jpg\" /></p>\n<p>点开 api 的表单数据，可以看到<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/Redman_point_set_js_reverse/2.jpg\" alt=\"2.jpg\" /></p>\n<p>对这几个参数，<span class=\"label info\">param 和 tenant</span> 不用说肯定是定值，对于<span class=\"label info\"> sign</span>，<span class=\"label info\">timestamp</span>，<span class=\"label info\">token</span> 则有可能是加密变化参数，<span class=\"label danger\">（不要忘了，对于 token，有可能是定值，例如登录账号后会生成一个此账号的固定 token）</span>，对页面进行多次刷新，比对可以发现<span class=\"label info\"> token</span> 确实是不变的，仅是<span class=\"label info\"> sign</span> 和<span class=\"label info\"> timestamp</span> 变化。<br />\n则搜索源代码<span class=\"label info\"> sign</span>，即可找到<span class=\"label info\"> sign</span> 在代码中的位置，如下（搜索找位置此处省略）<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/Redman_point_set_js_reverse/3.jpg\" alt=\"3.jpg\" /></p>\n<p>可以看到四个参数都在，并且参数值为变量，则可以判断是此处无疑<br />\n在<span class=\"label info\"> sign</span> 处打上断点（<span class=\"label info\">timestamp</span> 打也是一样的），刷新网页，此时页面停在断点处（再次证明此处代码是要找的）<br />\n将鼠标停在加密<span class=\"label info\"> sign</span> 的<span class=\"label info\"> E 函数</span>上，则可跳转到<span class=\"label info\"> E 函数</span>（省略图片），如下<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/Redman_point_set_js_reverse/4.jpg\" alt=\"4.jpg\" /></p>\n<p>发现<span class=\"label info\"> E 函数</span>是返回了一个值，这个值是通过<span class=\"label info\"> k 函数</span>进行加密的，于是用同上方法跳转到<span class=\"label info\"> k 函数</span>，如下<br />\n<img data-src=\"\" alt=\"5.jpg\" /></p>\n<h4 id=\"逻辑梳理\"><a class=\"anchor\" href=\"#逻辑梳理\">#</a> 逻辑梳理</h4>\n<p>看到整个加密逻辑了过后，来进行一遍梳理，并运用 python 模拟加密逻辑<br />\n其中<span class=\"label info\"> timestamp</span> 为时间戳，即</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>time_get<span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>对于<span class=\"label info\"> sign</span>, 我们先分析<span class=\"label info\"> k 函数</span>，<span class=\"label info\">k 函数</span>是对传入的参数进行<span class=\"label info\"> sha256 加密</span>，即</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>sha256加密</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">def</span> <span class=\"token function\">sha256</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>        sha<span class=\"token operator\">=</span>hashlib<span class=\"token punctuation\">.</span>sha256<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        sha<span class=\"token punctuation\">.</span>update<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        <span class=\"token keyword\">return</span> sha<span class=\"token punctuation\">.</span>hexdigest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><p>而<span class=\"label info\"> E 函数</span>则是将<span class=\"label info\"> param</span>,<span class=\"label info\">timestamp</span>,<span class=\"label info\">tenant</span>,<span class=\"label info\">salt</span> 进行拼接并返回其进行<span class=\"label info\"> sha256 加密</span>的值（对于<span class=\"label info\"> salt</span> 的值，即 C，可以将鼠标放在上面查看）<br />\n注：此处拼接结果为</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"><span>拼接结果</span></figcaption><table><tr><td data-num=\"1\"></td><td><pre>time_get<span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>        params<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span><span class=\"token string\">\"no\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"dy0002\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"data\"</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">&#123;</span><span class=\"token string\">\"days\"</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"rankType\"</span><span class=\"token punctuation\">:</span><span class=\"token number\">7</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>        dd<span class=\"token operator\">=</span>json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>params<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>        text <span class=\"token operator\">=</span> <span class=\"token string-interpolation\"><span class=\"token string\">f'param=</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>dd<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">&amp;timestamp=</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>time_get<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">&amp;tenant=1&amp;salt=kbn%&amp;)@&lt;?FGkfs8sdf4Vg1*+;`kf5ndl$'</span></span></pre></td></tr></table></figure><p>其中 text 则为拼接结果</p>\n<h4 id=\"结果\"><a class=\"anchor\" href=\"#结果\">#</a> 结果</h4>\n<p>最后请求 api 的时候带上 headers 和表单数据，即可返回 json 类型的数据，对数据进行处理即可，效果图如下：<br />\n<img data-src=\"https://gitee.com/asxe/image/raw/master/blog/Redman_point_set_js_reverse/5.jpg\" alt=\"5.jpg\" /></p>\n<h4 id=\"完整代码\"><a class=\"anchor\" href=\"#完整代码\">#</a> 完整代码</h4>\n<p>代码中的<span class=\"label danger\"> token</span> 值请各位自行登录获取</p>\n<figure class=\"highlight python\"><figcaption data-lang=\"python\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">import</span> requests</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">import</span> hashlib</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token keyword\">import</span> time</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">import</span> json</pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">class</span> <span class=\"token class-name\">Spider</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>        self<span class=\"token punctuation\">.</span>api<span class=\"token operator\">=</span><span class=\"token string\">'https://ucp.hrdjyun.com:60359/api/dy'</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>        self<span class=\"token punctuation\">.</span>headers<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>    <span class=\"token string\">\"Accept\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"application/json, text/plain, */*\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>    <span class=\"token string\">\"Accept-Encoding\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"gzip, deflate, br\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>    <span class=\"token string\">\"Accept-Language\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>    <span class=\"token string\">\"Connection\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"keep-alive\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre>    <span class=\"token string\">\"Content-Length\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"248\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>    <span class=\"token string\">\"Content-Type\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"application/json;charset=UTF-8\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>    <span class=\"token string\">\"Host\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"ucp.hrdjyun.com:60359\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>    <span class=\"token string\">\"Origin\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"http://www.hh1024.com\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre>    <span class=\"token string\">\"sec-ch-ua\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\\\"Not_A Brand\\\";v=\\\"99\\\", \\\"Microsoft Edge\\\";v=\\\"109\\\", \\\"Chromium\\\";v=\\\"109\\\"\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>    <span class=\"token string\">\"sec-ch-ua-mobile\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"?0\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>    <span class=\"token string\">\"sec-ch-ua-platform\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\\\"Windows\\\"\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>    <span class=\"token string\">\"Sec-Fetch-Dest\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"empty\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre>    <span class=\"token string\">\"Sec-Fetch-Mode\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"cors\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>    <span class=\"token string\">\"Sec-Fetch-Site\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"cross-site\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre>    <span class=\"token string\">\"User-Agent\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.52\"</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">sha256</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>        sha<span class=\"token operator\">=</span>hashlib<span class=\"token punctuation\">.</span>sha256<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre>        sha<span class=\"token punctuation\">.</span>update<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre>        <span class=\"token keyword\">return</span> sha<span class=\"token punctuation\">.</span>hexdigest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre></pre></td></tr><tr><td data-num=\"32\"></td><td><pre>    <span class=\"token keyword\">def</span> <span class=\"token function\">spider</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre>        time_get<span class=\"token operator\">=</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre>        params<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span><span class=\"token string\">\"no\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"dy0002\"</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"data\"</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">&#123;</span><span class=\"token string\">\"days\"</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token string\">\"rankType\"</span><span class=\"token punctuation\">:</span><span class=\"token number\">7</span><span class=\"token punctuation\">&#125;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>        dd<span class=\"token operator\">=</span>json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>params<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre>        text <span class=\"token operator\">=</span> <span class=\"token string-interpolation\"><span class=\"token string\">f'param=</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>dd<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">&amp;timestamp=</span><span class=\"token interpolation\"><span class=\"token punctuation\">&#123;</span>time_get<span class=\"token punctuation\">&#125;</span></span><span class=\"token string\">&amp;tenant=1&amp;salt=kbn%&amp;)@&lt;?FGkfs8sdf4Vg1*+;`kf5ndl$'</span></span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre>        sign <span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>sha256<span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre>        data<span class=\"token operator\">=</span><span class=\"token punctuation\">&#123;</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre>            <span class=\"token string\">\"param\"</span><span class=\"token punctuation\">:</span>dd<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre>            <span class=\"token string\">\"sign\"</span><span class=\"token punctuation\">:</span>sign<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre>            <span class=\"token string\">\"tenant\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"1\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>            <span class=\"token string\">\"timestamp\"</span><span class=\"token punctuation\">:</span>time_get<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre>            <span class=\"token string\">\"token\"</span><span class=\"token punctuation\">:</span><span class=\"token string\">\"你的token\"</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre>        <span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre>        session<span class=\"token operator\">=</span>requests<span class=\"token punctuation\">.</span>session<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre>        session<span class=\"token punctuation\">.</span>headers<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>headers</pre></td></tr><tr><td data-num=\"47\"></td><td><pre>        response<span class=\"token operator\">=</span>session<span class=\"token punctuation\">.</span>post<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>api<span class=\"token punctuation\">,</span>data<span class=\"token operator\">=</span>json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre>        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre>        <span class=\"token keyword\">if</span> response<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'status'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre>            data <span class=\"token operator\">=</span> response<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token string\">'rankList'</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre>            <span class=\"token keyword\">for</span> d <span class=\"token keyword\">in</span> data<span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre>                items <span class=\"token operator\">=</span> <span class=\"token punctuation\">&#123;</span><span class=\"token punctuation\">&#125;</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre>                items<span class=\"token punctuation\">[</span><span class=\"token string\">'抖音名'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> d<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'anchorName'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre>                items<span class=\"token punctuation\">[</span><span class=\"token string\">'销量'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> d<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'displaySales'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre>                items<span class=\"token punctuation\">[</span><span class=\"token string\">'销售额'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span>d<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'displayMoney'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>                items<span class=\"token punctuation\">[</span><span class=\"token string\">'粉丝'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span><span class=\"token string\">'%.2f'</span><span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>d<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'fans'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">/</span><span class=\"token number\">10000</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span><span class=\"token string\">'万'</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre>                items<span class=\"token punctuation\">[</span><span class=\"token string\">'热度'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span>d<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'gmv_score'</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre>                <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>items<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre></pre></td></tr><tr><td data-num=\"60\"></td><td><pre><span class=\"token keyword\">if</span> __name__<span class=\"token operator\">==</span><span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre>    Spider<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>spider<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure>",
            "tags": [
                "Python",
                "爬虫",
                "爬虫",
                "js逆向"
            ]
        }
    ]
}