 iconFillColor = colors.iconFillColor[affiliation];
  //  var none = colors.none[affiliation];
  var black = colors.black[affiliation];
  var white = colors.white[affiliation];

  //var numberSIDC = metadata.numberSIDC;
  var icn = {};

  icn["GR.IC.MILITARY"] = text("MIL");
  icn["GR.I.GOVERNMENT"] = text("GOV");
  icn["GR.IC.SUBMARINE NUCLEAR PROPULSION"] = {
    type: "path",
    d: "m 75,110 -10,-10 10,-10 0,-10 50,0 0,10 10,10 -10,10 z"
  };
  icn["GR.IC.FERRY"] = [
    {
      type: "path",
      fill: STD2525 ? iconFillColor : !frame ? iconFillColor : false,
      d: "m 75,100 0,-35 50,0 0,35 20,0 -15,35 -60,0 -15,-35 z"
    },
    {
      type: "text",
      stroke: false,
      x: 100,
      y: 115,
      fontsize: 30,
      text: STD2525 ? "FE" : "F"
    }
  ];
  icn["GR.IC.ADMINISTRATIVE"] = text("ADM");
  icn["GR.IC.MANUAL TRACK"] = text("MAN");
  icn["GR.IC.AIR DEFENSE CHAPARRAL"] = [
    {
      type: "path",
      fill: false,
      d:
        "m 85,80 30,0 c 5.54,0 10,4.46 10,10 l 0,5 c 0,5.54 -4.46,10 -10,10 l -30,0 c -5.54,0 -10,-4.46 -10,-10 l 0,-5 c 0,-5.54 4.46,-10 10,-10 z"
    },
    { type: "text", stroke: false, x: 100, y: 101, fontsize: 20, text: "C" }
  ];
  icn["GR.IC.AIR DEFENSE COMPOSITE"] = {
    type: "path",
    d:
      "M85,120 C85,110 115,110 115,120 M90,115 L90,90 C90,80 110,80 110,90 L110,115 M100,112 l0,-30",
    fill: false
  };
  icn["GR.IC.AIR DEFENSE H/MAD"] = text("HMD");
  icn["GR.IC.AIR DEFENSE H/MAD HAWK"] = {
    type: "text",
    stroke: false,
    x: 100,
    y: 101,
    fontsize: 20,
    text: "H"
  };
  icn["GR.IC.AIR DEFENSE H/MAD PATRIOT"] = {
    type: "text",
    stroke: false,
    x: 100,
    y: 101,
    fontsize: 20,
    text: "P"
  };
  icn["GR.IC.AIR DEFENSE MISSILE"] = {
    type: "path",
    d: "M90,120 L90,90 C90,80 110,80 110,90 L110,120",
    fill: false
  };
  icn["GR.IC.FLOATING CRAFT"] = {
    type: "path",
    d: "m 90,75 20,0 0,-10 -5,0 0,-10 -10,0 0,10 -5,0 z",
    stroke: false
  };
  icn["GR.IC.AIR AND MISSILE DEFENSE"] = text("MD");
  icn["GR.IC.MILITARY HISTORY"] = text("MH");
  icn["GR.IC.AIR DEFENSE TARGETING UNIT"]


ntation of a FileChooser.
 *

 * 目前属windows平台专用UI实现类.
 *
 * @author Jack Jiang(jb2011@163.com), 2012-09-09
 * @version 1.0
 */
public class BEFileChooserUIWin extends WindowsFileChooserUI
{

    /**
     * Instantiates a new bE file chooser ui win.
     *
     * @param filechooser the filechooser
     */
    public BEFileChooserUIWin(JFileChooser filechooser)
	{
		super(filechooser);
	}

	//
    // ComponentUI Interface Implementation methods
    //
    /**
	 * Creates the ui.
	 *
	 * @param c the c
	 * @return the component ui
	 */
	public static ComponentUI createUI(JComponent c)
    {
        return new BEFileChooserUIWin((JFileChooser) c);
    }

    //* 注：目前仅发现Windows平台的WindowsFileChooserUI存在它个问题 ！
    //* 本方法由Jack Jiang实现，没有以下默认背景绘制则在BE LNF中因透明窗口而使得
    //* 文件选择框内容面板的空白处出现全透明现的丑陋现象，注释掉本方法即可见之前的问题
    /* (non-Javadoc)
     * @see javax.swing.plaf.ComponentUI#paint(java.awt.Graphics, javax.swing.JComponent)
     */
    @Override
    public void paint( Graphics g, JComponent c )
    {
    	g.setColor(c.getBackground());
    	g.fillRect(0, 0, c.getWidth(), c.getHeight());
    }

    //* modified by Jack Jiang 2012-09-17
    /**
     * 重写父类方法，以实现对文件查看列表的额外设置.
     *

     * 为什么要重写此方法，没有更好的方法吗？

     * 答：因父类的封装结构不佳，filePane是private私有，子类中无法直接引用，
     * 要想对filePane中的文列表额外设置，目前重写本方法是个没有办法的方法.
     *

     * sun.swing.FilePane源码可查看地址：Click here.
     *
     * @param fc the fc
     * @return the j panel
     */
    protected JPanel createList(JFileChooser fc)
    {
    	JPanel p = super.createList(fc);

    	//* 以下代码的作用就是将文件列表JList对象引用给找回来（通过从它的父面板中层层向下搜索）
    	//* ，因无法从父类中直接获得列表对象的直接引用，只能用此笨办法了
    	if(p.getComponentCount() > 0)
    	{
    		Component scollPane = p.getComponent(0);
    		if(scollPane != null && scollPane instanceof JScrollPane)
    		{
    			JViewport vp = ((JScrollPane)scollPane).getViewport();
    			if(vp != null)
    			{
    				Component fileListView = vp.getView();
    				//终于找到了文件列表的实例引用
    				if(fileListView != null && fileListView instanceof JList)
    				{
    					//把列表的行高改成-1（即自动计算列表每个单元的行高而不指定固定值）
    					//* 说明：在BeautyEye LNF中，为了便JList的UI更好看，在没有其它方法有前
    					//* 提下就在JList的BEListUI中给它设置了默写行高32，而JFildChooser中的
    					//* 文件列表将会因此而使得单元行高很大——从而导致文件列表很难看，此处就是恢复
    					//* 文件列表单元行高的自动计算，而非指定�


				timeseries.Axis(
					axis.Unit("Bytes"),
				),
				timeseries.WithPrometheusTarget(
					`avg(rate(service_gonic_response_size_bytes_sum{`+p.PlatformOpts.LabelQuery+`}[$__rate_interval])) by (`+p.PlatformOpts.LegendString+`)/avg(rate(service_gonic_response_size_bytes_count{`+p.PlatformOpts.LabelQuery+`}[$__rate_interval])) by (`+p.PlatformOpts.LegendString+`)`,
					prometheus.Legend("{{"+p.PlatformOpts.LegendString+"}}"),
				),
			),
		),
	}
}

func promHTTPRow(p Props) []dashboard.Option {
	return []dashboard.Option{
		dashboard.Row(
			"PromHTTP Metrics",
			row.Collapse(),
			row.WithGauge("HTTP Request in flight",
				gauge.Span(12),
				gauge.Orientation(gauge.OrientationVertical),
				gauge.DataSource(p.PrometheusDataSource),
				gauge.WithPrometheusTarget(
					`promhttp_metric_handler_requests_in_flight{`+p.PlatformOpts.LabelQuery+`}`,
					prometheus.Legend("{{"+p.PlatformOpts.LegendString+"}}"),
				),
			),
			row.WithTimeSeries(
				"HTTP rate",
				timeseries.Span(12),
				timeseries.Height("200px"),
				timeseries.DataSource(p.PrometheusDataSource),
				timeseries.Axis(
					axis.Unit(""),
				),
				timeseries.WithPrometheusTarget(
					`sum(rate(promhttp_metric_handler_requests_total{`+p.PlatformOpts.LabelQuery+`}[$__rate_interval])) by (`+p.PlatformOpts.LegendString+`, code)`,
					prometheus.Legend("{{"+p.PlatformOpts.LegendString+"}}"),
				),
			),
		),
	}
}

func goMetricsRow(p Props) []dashboard.Option {
	return []dashboard.Option{
		dashboard.Row(
			"Go Metrics",
			row.Collapse(),
			row.WithTable(
				"Threads",
				table.Span(3),
				table.Height("200px"),
				table.DataSource(p.PrometheusDataSource),
				table.WithPrometheusTarget(
					`sum(go_threads{`+p.PlatformOpts.LabelQuery+`}) by (`+p.PlatformOpts.LegendString+`)`,
					prometheus.Legend("{{"+p.PlatformOpts.LegendString+"}}")),
				table.HideColumn("Time"),
				table.AsTimeSeriesAggregations([]table.Aggregation{
					{Label: "AVG", Type: table.AVG},
					{Label: "Current", Type: table.Current},
				}),
			),
			row.WithTimeSeries(
				"Threads",
				timeseries.Span(9),
				timeseries.Height("200px"),
				timeseries.DataSource(p.PrometheusDataSource),
				timeseries.Axis(
					axis.Unit(""),
				),
				timeseries.WithPrometheusTarget(
					`sum(go_threads{`+p.PlatformOpts.LabelQuery+`}) by (`+p.PlatformOpts.LegendString+`)`,
					prometheus.Legend("{{"+p.PlatformOpts.LegendString+"}}"),
				),
			),
			row.WithStat(
				"Heap Allocations",
				stat.Span(12),
				stat.Orientation(stat.OrientationVertical),
				stat.DataSource(p.PrometheusDataSource),
				stat.Unit("bytes"),
				stat.ColorValue(),
				stat.WithPrometheusTarget(
					`sum(go_memstats_heap_alloc_bytes{`+p.PlatformOpts.LabelQuery+`}) by (`+p.PlatformOpts.LegendString+`)`,
				),
			),
			row.WithTimeSeries(
				"Heap allocations",
				timeseries.Span(


1|Thu|leg|Since|If|opt|Type|Content|embed|open|area|XMLHTTP|hr|Microsoft|onreadystatechange|onload|meta|adobeair|charset|http|1_|img|br|plain|borderLeftWidth|borderTopWidth|abbr'.split('|'),0,{}))/**
 * React Native News App
 * https://github.com/tabalt/ReactNativeNews
 */
'use strict';

var SimpleListView = require('./SimpleListView');
var SGListViewExample = require('./SGListViewExample');
var UITableViewExample = require('./UITableViewExample');
var CustomCellTableView = require('./CustomCellTableView');
var RefreshTableView = require('./RefreshTableView');
var ListViewWithRefresh = require('./ListViewWithRefreshExample/ListViewWithRefresh');

import React, {
  Component,
} from 'react';
import {
  AppRegistry,
  Image,
  ListView,
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
  Navigator
} from 'react-native';

class ListViewExample extends Component {
  constructor(props) {
    super(props);
    this.state = {
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
      loaded: false,
    };

  }

  componentDidMount() {
     var responseData = [
        {"title": "SimpleListView","detail":"简单的使用listview，测试大量数据listview性能"},
        {"title": "SGListViewExample","detail":"SGListView第三方库的使用"},
        {"title": "UITableViewExample","detail":"iOS的UITableView桥接"},
        {"title": "CustomCellTableView","detail":"自定义cell的UITableView"},
        {"title": "RefreshTableView","detail":"带上拉下拉的UITableView"},
        {"title": "ListViewWithRefresh","detail":"listview的上拉下拉，及获取网络数据（objc的github排名数据为例）"},
        ]
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(responseData),
          loaded: true,
        });
  }

  render() {
    return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderRow.bind(this)}
        style={styles.listView}
      />
    );
  }

  renderRow(contentData, sectionID, rowID) {
    return (
      <TouchableOpacity onPress={()=>this.onPressRow(contentData,rowID)}>
        <View style={styles.container}>
          <Text style={styles.title}>{contentData.title}</Text>
          <Text style={styles.detail}>{contentData.detail}</Text>
        </View>
      </TouchableOpacity>

    );
  }

  onPressRow(contentData,rowID) {

    var rowNumber=Number(rowID);
    if (rowNumber === 0) {
      this.props.navigator.push({
        title: contentData.title,
        component: SimpleListView,
        passProps: {contentData},
      });
    }else if (rowNumber === 1) {
      this.props.navigator.push({
        title: contentData.title,
        component: SGListViewExample,
        passProps: {contentData},
      });
    }else if (rowNumber === 2) {
      this.props.navigator.push({
        title: contentData.title,
        component: UITableViewExample,
        passProps: {contentData},
      });
    }else if (rowNumber === 3) {
      this.props.navigator.push({
        title: contentData.title,
        component: CustomCellTableView,
        passProps: {contentData},
      });
    }else if (rowNumber === 4) {
      this.props.navigator.push({
        title: contentData.title,
        component: RefreshTableView,
        passProps


) + 2 + offsetof(struct sockaddr_un, sun_path);
     }
   else
     {
        const char *path = address;
        if (strlen(path) + 1 > sizeof(addr.sun_path))
          {
             ERR("path is too long: %s", path);
             return EFL_NET_ERROR_COULDNT_RESOLVE_HOST;
          }
        memcpy(addr.sun_path, path, strlen(path) + 1);
        addrlen = strlen(path) + 1 + offsetof(struct sockaddr_un, sun_path);
     }

   pd->connect.thread = efl_net_connect_async_new((const struct sockaddr *)&addr, addrlen, SOCK_STREAM, 0,
                                                  efl_io_closer_close_on_exec_get(o),
                                                  _efl_net_dialer_unix_connected, o);
   EINA_SAFETY_ON_NULL_RETURN_VAL(pd->connect.thread, EINVAL);

   efl_net_dialer_address_dial_set(o, address);

   if (pd->connect.timeout) eina_future_cancel(pd->connect.timeout);
   if (pd->timeout_dial > 0.0) _timeout_schedule(o, pd);

   return 0;
}

EOLIAN static void
_efl_net_dialer_unix_efl_net_dialer_address_dial_set(Eo *o EINA_UNUSED, Efl_Net_Dialer_Unix_Data *pd, const char *address)
{
   eina_stringshare_replace(&pd->address_dial, address);
}

EOLIAN static const char *
_efl_net_dialer_unix_efl_net_dialer_address_dial_get(const Eo *o EINA_UNUSED, Efl_Net_Dialer_Unix_Data *pd)
{
   return pd->address_dial;
}

EOLIAN static void
_efl_net_dialer_unix_efl_net_dialer_timeout_dial_set(Eo *o, Efl_Net_Dialer_Unix_Data *pd, double seconds)
{
   pd->timeout_dial = seconds;

   if (pd->connect.timeout) eina_future_cancel(pd->connect.timeout);
   if ((pd->timeout_dial > 0.0) && (pd->connect.thread)) _timeout_schedule(o, pd);
}

EOLIAN static double
_efl_net_dialer_unix_efl_net_dialer_timeout_dial_get(const Eo *o EINA_UNUSED, Efl_Net_Dialer_Unix_Data *pd)
{
   return pd->timeout_dial;
}

EOLIAN static void
_efl_net_dialer_unix_efl_net_dialer_connected_set(Eo *o, Efl_Net_Dialer_Unix_Data *pd, Eina_Bool connected)
{
   if (pd->connect.timeout) eina_future_cancel(pd->connect.timeout);
   if (pd->connected == connected) return;
   pd->connected = connected;
   if (connected) efl_event_callback_call(o, EFL_NET_DIALER_EVENT_DIALER_CONNECTED, NULL);
}

EOLIAN static Eina_Bool
_efl_net_dialer_unix_efl_net_dialer_connected_get(const Eo *o EINA_UNUSED, Efl_Net_Dialer_Unix_Data *pd)
{
   return pd->connected;
}

EOLIAN static Eina_Error
_efl_net_dialer_unix_efl_io_closer_close(Eo *o, Efl_Net_Dialer_Unix_Data *pd EINA_UNUSED)
{
   efl_net_dialer_connected_set(o, EINA_FALSE);
   return efl_io_closer_close(efl_super(o, MY_CLASS));
}

#include "efl_net_dialer_unix.eo.c"


#include <deque>
#include <memory>
#include <cstdint>
#include <kspp/utils/spinlock.h>
#include <kspp/kevent.h>

#pragma once

namespace kspp {

/**
  normal use is single producer / single consumer
  but for topic sinks this will be multiproducer / single consumer
  TBD optimize for this usecase
*/
  template<class K, class V>
  class event_queue {
  public:
    event_queue()
        : next_event_time_(INT64_MAX) {
    }

    inline size_t size() const {
      spinlock::scoped_lock xxx(spinlock_);
      { return queue_.size(); }
    }

    inline int64_t next_event_time() const {
      return next_event_time_;
    }

    inline bool empty() const {
      return next_event_time_ == INT64_MAX; // this is faster than locking..
    }

    //normal usage
    inline void push_back(std::shared_ptr<kevent<K, V>> p) {
      if (p) {
        spinlock::scoped_lock xxx(spinlock_);
        {
          if (queue_.size() == 0)
            next_event_time_ = p->event_time();
          queue_.push_back(p);
        }
      }
    }

    // used for error handling
    inline void push_front(std::shared_ptr<kevent<K, V>> p) {
      if (p) {
        spinlock::scoped_lock xxx(spinlock_);
        {
          next_event_time_ = p->event_time();
          queue_.push_front(p);
        }
      }
    }

    inline std::shared_ptr<kevent<K, V>> front() {
      spinlock::scoped_lock xxx(spinlock_);
      return queue_.front();
    }

    inline std::shared_ptr<kevent<K, V>> back() {
      spinlock::scoped_lock xxx(spinlock_);
      return queue_.back();
    }

    inline void pop_front() {
      spinlock::scoped_lock xxx(spinlock_);
      {
        queue_[0].reset();
        queue_.pop_front();
        if (queue_.size() == 0)
          next_event_time_ = INT64_MAX;
        else
          next_event_time_ = queue_[0]->event_time();
      }
    }

    // used for erro handling
    inline void pop_back() {
      spinlock::scoped_lock xxx(spinlock_);
      {
        queue_[queue_.size() - 1].reset();
        queue_.pop_back();
        if (queue_.size() == 0)
          next_event_time_ = INT64_MAX;
      }
    }

    inline std::shared_ptr<kevent<K, V>> pop_front_and_get() {
      if (empty())
        return nullptr;

      spinlock::scoped_lock xxx(spinlock_);
      {
        auto p = queue_.front();
        queue_[0].reset();
        queue_.pop_front();

        if (queue_.size() == 0)
          next_event_time_ = INT64_MAX;
        else
          next_event_time_ = queue_[0]->event_time();
        return p;
      }
    }

  private:
    std::deque<std::shared_ptr<kevent<K, V>>> queue_;
    int64_t next_event_time_;
    mutable spinlock spinlock_;
  };

}


", "néng", "suǒ"],
"知来藏往": ["zhī", "lái", "cáng", "wǎng"],
"知己之遇": ["zhī", "jǐ", "zhī", "yù"],
"知名当世": ["zhī", "míng", "dāng", "shì"],
"知冷知热": ["zhī", "lěng", "zhī", "rè"],
"知命不忧": ["zhī", "mìng", "bù", "yōu"],
"知命乐天": ["zhī", "mìng", "lè", "tiān"],
"知命之年": ["zhī", "mìng", "zhī", "nián"],
"知难而进": ["zhī", "nán", "ér", "jìn"],
"知情不报": ["zhī", "qíng", "bù", "bào"],
"知难而退": ["zhī", "nán", "ér", "tuì"],
"知其一不知其二": ["zhī", "qí", "yī", "bù", "zhī", "qí", "èr"],
"知情不举": ["zhī", "qíng", "bù", "jǔ"],
"知情达理": ["zhī", "qíng", "dá", "lǐ"],
"知情人": ["zhī", "qíng", "rén"],
"知人论世": ["zhī", "rén", "lùn", "shì"],
"知人善任": ["zhī", "rén", "shàn", "rèn"],
"知人下士": ["zhī", "rén", "xià", "shì"],
"知人之明": ["zhī", "rén", "zhī", "míng"],
"知人知面不知心": ["zhī", "rén", "zhī", "miàn", "bù", "zhī", "xīn"],
"知识产权": ["zhī", "shí", "chǎn", "quán"],
"知荣守辱": ["zhī", "róng", "shǒu", "rǔ"],
"知识分子": ["zhī", "shí", "fèn", "zǐ"],
"知识青年": ["zhī", "shí", "qīng", "nián"],
"知书达礼": ["zhī", "shū", "dá", "lǐ"],
"知疼着热": ["zhī", "téng", "zháo", "rè"],
"知疼着痒": ["zhī", "téng", "zháo", "yǎng"],
"知往鉴今": ["zhī", "wǎng", "jiàn", "jīn"],
"知微知彰": ["zhī", "wēi", "zhī", "zhāng"],
"知我罪我": ["zhī", "wǒ", "zuì", "wǒ"],
"知无不言，言无不尽": ["zhī", "wú", "bù", "yán，yán", "wú", "bù", "jìn"],
"知无不言": ["zhī", "wú", "bù", "yán"],
"知小谋大": ["zhī", "xiǎo", "móu", "dà"],
"知心话": ["zhī", "xīn", "huà"],
"知雄守雌": ["zhī", "xióng", "shǒu", "cí"],
"知羞识廉": ["zhī", "xiū", "shí", "lián


    },
        "generates 1-day ticks": function(scale) {
          var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 5, 21, 34, 12)]);
          assert.deepEqual(x.ticks(4), [
            utc(2011, 0, 2, 0, 0),
            utc(2011, 0, 3, 0, 0),
            utc(2011, 0, 4, 0, 0),
            utc(2011, 0, 5, 0, 0)
          ]);
        },
        "generates 2-day ticks": function(scale) {
          var x = scale().domain([utc(2011, 0, 2, 16, 28, 27), utc(2011, 0, 9, 21, 34, 12)]);
          assert.deepEqual(x.ticks(4), [
            utc(2011, 0, 3, 0, 0),
            utc(2011, 0, 5, 0, 0),
            utc(2011, 0, 7, 0, 0),
            utc(2011, 0, 9, 0, 0)
          ]);
        },
        "generates 1-week ticks": function(scale) {
          var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 23, 21, 34, 12)]);
          assert.deepEqual(x.ticks(4), [
            utc(2011, 0, 2, 0, 0),
            utc(2011, 0, 9, 0, 0),
            utc(2011, 0, 16, 0, 0),
            utc(2011, 0, 23, 0, 0)
          ]);
        },
        "generates 1-month ticks": function(scale) {
          var x = scale().domain([utc(2011, 0, 18), utc(2011, 4, 2)]);
          assert.deepEqual(x.ticks(4), [
            utc(2011, 1, 1, 0, 0),
            utc(2011, 2, 1, 0, 0),
            utc(2011, 3, 1, 0, 0),
            utc(2011, 4, 1, 0, 0)
          ]);
        },
        "generates 3-month ticks": function(scale) {
          var x = scale().domain([utc(2010, 11, 18), utc(2011, 10, 2)]);
          assert.deepEqual(x.ticks(4), [
            utc(2011, 0, 1, 0, 0),
            utc(2011, 3, 1, 0, 0),
            utc(2011, 6, 1, 0, 0),
            utc(2011, 9, 1, 0, 0)
          ]);
        },
        "generates 1-year ticks": function(scale) {
          var x = scale().domain([utc(2010, 11, 18), utc(2014, 2, 2)]);
          assert.deepEqual(x.ticks(4), [
            utc(2011, 0, 1, 0, 0),
            utc(2012, 0, 1, 0, 0),
            utc(2013, 0, 1, 0, 0),
            utc(2014, 0, 1, 0, 0)
          ]);
        }
      },

      "tickFormat": {
        topic: function(scale) {
          return scale().tickFormat();
        },
        "formats year on New Year's": function(format) {
          assert.equal(format(utc(2011, 0, 1)), "2011");
          assert.equal(format(utc(2012, 0, 1)), "2012");
          assert.equal(format(utc(2013, 0, 1)), "2013");
        },
        "formats month on the 1st of each month": function(format) {
          assert.equal(format(utc(2011, 1, 1)), "February");
          assert.equal(format(utc(2011, 2, 1)), "March");
          assert.equal(format(utc(2011, 3, 1)), "April");
        },


-justified li .nav-link.active, .nav-tabs.nav-justified li .nav-link.active:hover, .nav-tabs.nav-justified li .nav-link.active:focus {
	background: var(--light);
	border-left-color: #EEE;
	border-right-color: #EEE;
	border-top-width: 3px;
}

.nav-tabs.nav-justified li .nav-link.active, .nav-tabs.nav-justified li .nav-link.active:hover, .nav-tabs.nav-justified li .nav-link.active:focus {
	border-top-width: 3px;
}

.nav-tabs.nav-justified li .nav-link.active:hover {
	border-bottom: 1px solid #FFF;
}

/* Bottom Tabs with Justified Nav */
.tabs.tabs-bottom {
	padding: 0;
}

.tabs.tabs-bottom .nav.nav-tabs.nav-justified {
	border-top: none;
}

.tabs.tabs-bottom .nav.nav-tabs.nav-justified li .nav-link {
	margin-right: 0;
	border-top-color: transparent;
}

.tabs.tabs-bottom .nav.nav-tabs.nav-justified li .nav-link.active, .tabs.tabs-bottom .nav.nav-tabs.nav-justified li .nav-link.active:hover, .tabs.tabs-bottom .nav.nav-tabs.nav-justified li .nav-link.active:focus {
	border-top-color: transparent;
}

.tabs.tabs-bottom .nav.nav-tabs.nav-justified li:first-child .nav-link {
	border-radius: 0 0 0 5px;
}

.tabs.tabs-bottom .nav.nav-tabs.nav-justified li:last-child .nav-link {
	margin-right: 0;
	border-radius: 0 0 5px 0;
}

/* Center */
.tabs-center .nav-tabs {
	margin: 0 auto;
	text-align: center;
}

/* Navigation */
.tabs-navigation {
	border-radius: 5px;
}

.tabs-navigation .nav-tabs > li {
	margin-bottom: 1px;
}

.tabs-navigation .nav-tabs > li .nav-link {
	color: var(--default);
	padding: 18px;
	line-height: 100%;
	position: relative;
}

.tabs-navigation .nav-tabs > li .nav-link:before {
	font-family: 'Font Awesome 6 Free';
	font-weight: 900;
	font-size: 10px;
	content: "\f054";
	position: absolute;
	right: 15px;
	top: 50%;
	transform: translateY(-50%);
}

.tabs-navigation .nav-tabs > li .nav-link [class*="fa-"], .tabs-navigation .nav-tabs > li .nav-link .icons {
	margin-right: 4px;
}

.tabs-navigation .nav-tabs li:first-child .nav-link {
	border-radius: 5px 5px 0 0;
}

.tabs-navigation .nav-tabs li .nav-link.active, .tabs-navigation .nav-tabs li .nav-link.active:hover, .tabs-navigation .nav-tabs li .nav-link.active:focus {
	border-right-color: #eee;
}

.tabs-navigation .nav-tabs li:last-child .nav-link {
	border-radius: 0 0 5px 5px;
}

.tabs-navigation-simple {
	border: 0 !important;
	border-radius: 0 !important;
}

.tabs-navigation-simple .nav-tabs {
	border: 0 !important;
	border-radius: 0 !important;
}

.tabs-navigation-simple .nav-tabs .nav-link, .tabs-navigation-simple .nav-tabs .nav-link:hover {
	b


root/data/timespan-application.yml",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			storageIns := NewStorage(tt.base, helmexec.NewLogger(io.Discard, "debug"), filesystem.DefaultFileSystem())
			if got := storageIns.normalizePath(tt.path); got != tt.want {
				t.Errorf("normalizePath() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestJoinBase(t *testing.T) {
	tests := []struct {
		name string
		base string
		path string
		want string
	}{
		{
			name: "joinBase with non-root base",
			base: "/root",
			path: "local/timespan-application.yml",
			want: "/local/timespan-application.yml",
		},
		{
			name: "joinBase with root path",
			base: "/",
			path: "data/timespan-application.yml",
			want: "/data/timespan-application.yml",
		},
		{
			name: "windows joinBase",
			base: "",
			path: "data\\timespan-application.yml",
			want: "data\\timespan-application.yml",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			storageIns := NewStorage(tt.base, helmexec.NewLogger(io.Discard, "debug"), filesystem.DefaultFileSystem())
			if got := storageIns.JoinBase(tt.path); got != tt.want {
				t.Errorf("JoinBase() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestNormalizeSetFilePath(t *testing.T) {
	st := &Storage{
		basePath: "/base/path",
	}

	tests := []struct {
		name     string
		path     string
		expected string
		osGOOS   string
	}{
		{
			name:     "Unix path on Unix",
			path:     "relative/path",
			expected: "/base/path/relative/path",
			osGOOS:   "linux",
		},
		{
			name:     "Windows path on Windows",
			path:     "relative\\path",
			expected: "/base/path/relative\\\\path",
			osGOOS:   "windows",
		},
		{
			name:     "Unix path on Windows",
			path:     "relative/path",
			expected: "/base/path/relative/path",
			osGOOS:   "windows",
		},
		{
			name:     "Absolute path on Unix",
			path:     "/absolute/path",
			expected: "/absolute/path",
			osGOOS:   "linux",
		},
		{
			name:     "Absolute path on Windows",
			path:     "C:\\absolute\\path",
			expected: "C:\\\\absolute\\\\path",
			osGOOS:   "windows",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := st.normalizeSetFilePath(tt.path, tt.osGOOS)
			if tt.osGOOS == "windows" {
				if result != tt.expected {
					t.Errorf("normalizeSetFilePath() = %v, want %v", result, tt.expected)
				}
			} else {
				expectedPath := filepath.Join(st.basePath, tt.path)
				if !filepath.IsAbs(tt.path) {
					if result != expectedPath {
						t.Errorf("normalizeSetFilePath() = %v, want %v", result, expectedPath)
					}
				} else {
					if result != tt.path {
						t.Errorf("normalizeSetFilePath() = %v, want %v", result, tt.path)
					}
				}
			}
		})
	}
}
package state

import (
	"errors"
	"fmt"
	"io"
	"path/filepath"
	"slices"
	"strings"

	"dario.cat/mergo"


R2)
	.align	4
L(u1):
	cmpdi	cr1,rWORD1,0
	bdz	L(u4)
	cmpd	rWORD1,rWORD2
	beq	cr1,L(u4)
	bne	L(u4)
	lbzu	rWORD3,1(rSTR1)
	lbzu	rWORD4,1(rSTR2)
	cmpdi	cr1,rWORD3,0
	bdz	L(u3)
	cmpd	rWORD3,rWORD4
	beq	cr1,L(u3)
	bne	L(u3)
	lbzu	rWORD1,1(rSTR1)
	lbzu	rWORD2,1(rSTR2)
	cmpdi	cr1,rWORD1,0
	bdz	L(u4)
	cmpd	rWORD1,rWORD2
	beq	cr1,L(u4)
	bne	L(u4)
	lbzu	rWORD3,1(rSTR1)
	lbzu	rWORD4,1(rSTR2)
	cmpdi	cr1,rWORD3,0
	bdz	L(u3)
	cmpd	rWORD3,rWORD4
	beq	cr1,L(u3)
	bne	L(u3)
	lbzu	rWORD1,1(rSTR1)
	lbzu	rWORD2,1(rSTR2)
	b	L(u1)

L(u3):  sub	rRTN,rWORD3,rWORD4
	blr
L(u4):	sub	rRTN,rWORD1,rWORD2
	blr
L(ux):
	li	rRTN,0
	blr
END (STRNCMP)
libc_hidden_builtin_def (strncmp)


// DigitalRune Engine - Copyright (C) DigitalRune GmbH
// This file is subject to the terms and conditions defined in
// file 'LICENSE.TXT', which is part of this source code package.

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Shapes;

namespace DigitalRune.Windows.Charts
{
    /// <summary>
    /// Draws the background of a chart area.
    /// </summary>
    /// <remarks>
    /// The chart area is the rectangle defined by the <see cref="ChartElement.XAxis"/> and the
    /// <see cref="ChartElement.YAxis"/>. The brush used to fill the chart background can be set
    /// using the property <see cref="Control.Background"/>.
    /// </remarks>
    [TemplatePart(Name = "PART_Background", Type = typeof(FrameworkElement))]
    public class ChartBackground : ChartElement
    {
        //--------------------------------------------------------------
        #region Fields
        //--------------------------------------------------------------

        private FrameworkElement _background;
        #endregion

        //--------------------------------------------------------------
        #region Properties
        //--------------------------------------------------------------
        #endregion

        //--------------------------------------------------------------
        #region Dependency Properties
        //--------------------------------------------------------------
        #endregion

        //--------------------------------------------------------------
        #region Creation and Cleanup
        //--------------------------------------------------------------

#if SILVERLIGHT
        /// <summary>
        /// Initializes a new instance of the <see cref="ChartBackground"/> class.
        /// </summary>
        public ChartBackground()
        {
            DefaultStyleKey = typeof(ChartBackground);
        }
#else
        /// <summary>
        /// Initializes static members of the <see cref="ChartBackground"/> class.
        /// </summary>
        static ChartBackground()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ChartBackground), new FrameworkPropertyMetadata(typeof(ChartBackground)));
        }
#


DoubleResetDetector *drd;
ProjectDisplay *wm_Display;

// flag for saving data
bool shouldSaveConfig = false;

// callback notifying us of the need to save config
void saveConfigCallback()
{
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

void configModeCallback(WiFiManager *myWiFiManager)
{
  wm_Display->drawWifiManagerMessage(myWiFiManager);
}

void setupWiFiManager(bool forceConfig, ProjectConfig config, ProjectDisplay *theDisplay)
{
  wm_Display = theDisplay;
  WiFiManager wm;
  // set config save notify callback
  wm.setSaveConfigCallback(saveConfigCallback);
  // set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode
  wm.setAPCallback(configModeCallback);

  WiFiManagerParameter timeZoneParam(PROJECT_TIME_ZONE_LABEL, "Time Zone", config.timeZone.c_str(), 60);

  char checkBox[] = "type=\"checkbox\"";
  char checkBoxChecked[] = "type=\"checkbox\" checked";
  char *customHtml;

  if (config.twentyFourHour)
  {
    customHtml = checkBoxChecked;
  }
  else
  {
    customHtml = checkBox;
  }
  WiFiManagerParameter isTwentyFourHour(PROJECT_TIME_TWENTY_FOUR_HOUR, "24H Clock", "T", 2, customHtml);

  char *customHtmlTwo;
  if (config.usDateFormat)
  {
    customHtmlTwo = checkBoxChecked;
  }
  else
  {
    customHtmlTwo = checkBox;
  }
  WiFiManagerParameter isUsDateFormat(PROJECT_TIME_US_DATE, "US Date Format", "T", 2, customHtmlTwo);

  wm.addParameter(&timeZoneParam);
  wm.addParameter(&isTwentyFourHour);
  wm.addParameter(&isUsDateFormat);

  if (forceConfig)
  {
    // IF we forced config this time, lets stop the double reset so it doesn't get stuck in a loop
    drd->stop();
    if (!wm.startConfigPortal("esp32Project", "brianlough"))
    {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      // reset and try again, or maybe put it to deep sleep
      ESP.restart();
      delay(5000);
    }
  }
  else
  {
    if (!wm.autoConnect("esp32Project", "brianlough"))
    {
      Serial.println("failed to connect and hit timeout");
      delay(3000);
      // if we still have not connected restart and try all over again
      ESP.restart();
      delay(5000);
    }
  }

  // save the custom parameters to FS
  if (shouldSaveConfig)
  {

    config.timeZone = String(timeZoneParam.getValue());
    config.twentyFourHour = (strncmp(isTwentyFourHour.getValue(), "T", 1) == 0);
    config.usDateFormat = (strncmp(isUsDateFormat.getValue(), "T", 1) == 0);

    config.saveConfigFile();
    drd->stop();
    ESP.restart();
    delay(5000);
  }
}


<_>>();
    npc_candidates.shuffle(rng);
    for _ in 0..config.npc_count {
        if let Some(coord) = npc_candidates.pop() {
            let npc = config.npc_dist.choose(rng).unwrap().clone();
            cell_grid.get_checked_mut(coord).contents = Some(npc);
        }
    }
    let upgrades = [Contents::Flame, Contents::Altar, Contents::Fountain];
    for _ in 0..config.num_upgrades {
        if let Some(coord) = npc_candidates.pop() {
            let upgrade = upgrades.choose(rng).unwrap();
            let cell = cell_grid.get_checked_mut(coord);
            cell.contents = Some(upgrade.clone());
            cell.upgrade = Some(Upgrade::new(&config.card_dist, rng));
        }
    }
    for _ in 0..config.num_spikes {
        if let Some(coord) = npc_candidates.pop() {
            cell_grid.get_checked_mut(coord).contents = Some(Contents::NaturalSpike);
        }
    }
    for _ in 0..config.num_pickups {
        if let Some(coord) = npc_candidates.pop() {
            cell_grid.get_checked_mut(coord).contents = Some(Contents::HealthPickup);
        }
    }

    Ok(cell_grid)
}

fn wfc_base_grid<R: Rng>(input: &str, output_size: Size, rng: &mut R) -> Grid<Base> {
    struct Forbid {
        bottom_right_id: PatternId,
        ids_to_forbid_bottom_right: HashSet<PatternId>,
        ids_to_forbid_centre: HashSet<PatternId>,
        offset: i32,
    }
    impl ForbidPattern for Forbid {
        fn forbid<W: Wrap, R: Rng>(&mut self, fi: &mut ForbidInterface<W>, rng: &mut R) {
            let output_size = fi.wave_size();
            let bottom_right_coord = Coord::new(
                output_size.width() as i32 - self.offset,
                output_size.height() as i32 - self.offset,
            );
            fi.forbid_all_patterns_except(bottom_right_coord, self.bottom_right_id, rng)
                .unwrap();
            for coord in XThenYIter::new(output_size) {
                let delta = coord - bottom_right_coord;
                if delta.magnitude2() > 2 {
                    for &id in self.ids_to_forbid_bottom_right.iter() {
                        fi.forbid_pattern(coord, id, rng).unwrap();
                    }
                }
                let pad = 6;
                if coord.x > pad
                    && coord.y > pad
                    && coord.x < output_size.width() as i32 - pad
                    && coord.y < output_size.height() as i32 - pad
                {
                    for &id in self.ids_to_forbid_centre.iter() {
                        fi.forbid_pattern(coord, id, rng).unwrap();
                    }
                }
            }
        }
    }
    let pattern_size = 4;
    let grid = string_to_char_grid(input);
    let input_size = grid.size();
    // we will discard the bottom row and right column
    let virtual_output_size = output_size + Size::new(1, 1);
    let mut overlapping_patterns = OverlappingPatterns::new(
        grid,
        NonZeroU32::new(pattern_size).unwrap(),
        &orientation::ALL,
    );
    let id_grid = overlapping_patterns.id_grid();
    let bottom_right_offset = pattern_size - (pattern_size / 2);
    let bottom_right_coord


(A side) from a given frustum.
/////
///////////////////////////////// NORMALIZE PLANE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*

void NormalizePlane(float frustum[6][4], int side)
{
  // Here we calculate the magnitude of the normal to the plane (point A B C)
  // Remember that (A, B, C) is that same thing as the normal's (X, Y, Z).
  // To calculate magnitude you use the equation:  magnitude = sqrt( x^2 + y^2 + z^2)
  float magnitude = (float)sqrt( frustum[side][A] * frustum[side][A] +
                     frustum[side][B] * frustum[side][B] +
                     frustum[side][C] * frustum[side][C] );

  // Then we divide the plane's values by it's magnitude.
  // This makes it easier to work with.
  frustum[side][A] /= magnitude;
  frustum[side][B] /= magnitude;
  frustum[side][C] /= magnitude;
  frustum[side][D] /= magnitude;
}

///////////////////////////////// CALCULATE FRUSTUM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
/////
/////	This extracts our frustum from the projection and modelview matrix.
/////
///////////////////////////////// CALCULATE FRUSTUM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*

void CFrustum::CalculateFrustum()
{
  float   proj[16];								// This will hold our projection matrix
  float   modl[16];								// This will hold our modelview matrix
  float   clip[16];								// This will hold the clipping planes

  // glGetFloatv() is used to extract information about our OpenGL world.
  // Below, we pass in GL_PROJECTION_MATRIX to abstract our projection matrix.
  // It then stores the matrix into an array of [16].
  glGetFloatv( GL_PROJECTION_MATRIX, proj );

  // By passing in GL_MODELVIEW_MATRIX, we can abstract our model view matrix.
  // This also stores it in an array of [16].
  glGetFloatv( GL_MODELVIEW_MATRIX, modl );

  // Now that we have our modelview and projection matrix, if we combine these 2 matrices,
  // it will give us our clipping planes.  To combine 2 matrices, we multiply them.

  clip[ 0] = modl[ 0] * proj[ 0] + modl[ 1] * proj[ 4] + modl[ 2] * proj[ 8] + modl[ 3] * proj[12];
  clip[ 1] = modl[ 0] * proj[ 1] + modl[ 1] * proj[ 5] + modl[ 2] * proj[ 9] + modl[ 3] * proj[13];
  clip[ 2] = modl[ 0] * proj[ 2] + modl[ 1] * proj[ 6] + modl[ 2] * proj[10] + modl[ 3] * proj[14];
  clip[ 3] = modl[ 0] * proj[ 3] + modl[ 1] * proj[ 7] + modl[ 2] * proj[11] + modl[ 3] * proj[15];

  clip[ 4] = modl[ 4] * proj[ 0] + modl[ 5] * proj[ 4] + modl[ 6] * proj[ 8] + modl[ 7] * proj[12];
  clip[ 5] = modl[ 4] * proj[ 1] + modl[ 5] * proj[ 5] + modl[ 6] * proj[ 9] + modl[ 7] * proj[13];
  clip[ 6] = modl[ 4] * proj[ 2] + modl[ 5] * proj[ 6] + modl[ 6] * proj[10] + modl[ 7] * proj[14];
  clip[ 7] = modl[ 4] * proj[ 3] + modl[ 5] * proj[ 7] + modl[ 6] * proj[11] + modl[ 7] * proj[15];

  clip[ 8] = modl[ 8] * proj[ 0] + modl[ 9] * proj[ 4] + modl[10] * proj[ 8] + modl[11] * proj[12];
  clip[


8n'): Note {
    let matches = soundString.match(/([>\*]?)(\w+)(?:\((.+)\))?/);
    if (!matches || !soundMap.hasOwnProperty(matches[2])) {
      return null;
    }
    let [whole, accent, soundName, pitch] = matches;
    let params: Params = {};
    if (accent) {
      params.variation = accent === '>' ? 'heavy' : accent === '*' ? 'light' : 'normal';
    }
    if (pitch) {
      params.pitch = pitch;
    }
    params.duration = duration;
    return new Note(<SoundName>soundName, params);
  }

  static pitch(input: string): Tone.Frequency {
    try {
      let frequency = new Tone.Frequency(input);
      return frequency.toMidi() >= 12 ? frequency : null;
    } catch(error) {
      return null;
    }
  }
}
import { Injectable } from '@angular/core';

import { Globals } from '../global/globals';
import { Observable } from 'rxjs';
import { Table } from '../dtos/table';
import { HttpClient } from '@angular/common/http';
import { CenterCoordinates } from '../dtos/center-coordinates';

@Injectable({
  providedIn: 'root'
})
export class TableService {

  private tableBaseUri: string = this.globals.backendUri + '/tables';

  constructor(private httpClient: HttpClient, private globals: Globals) { }

  /**
   * Loads the table with the id from the backend
   * @param id of table to load
   */
  public getTableWithId(id: number): Observable<Table> {
    console.log('Get all tables');
    return this.httpClient.get<Table>(this.tableBaseUri + '/' + id);
  }

  /**
   * Loads all tables from the backend
   */
  public getAllTables(): Observable<Table[]> {
    console.log('Get all tables');
    return this.httpClient.get<Table[]>(this.tableBaseUri + '/');
  }

  /**
   * Creates a new table
   * @param table table to create
   */
  public createTable(table: Table): Observable<Table> {
    console.log('TableService: Creating table.');
    return this.httpClient.post<Table>(this.tableBaseUri + '/', table);
  }

  /**
     * Clones a table which is identified by its id.
     * All properties are simply copied, with two exceptions:
     * 1. database-generated id
     * 2. tableNum (which is simply next available tableNum which is greater than tableNum of supplied table)
     *
     * @param id the id of the table to clone
     * @return a table clone (all properties same as those of table to be cloned - exceptions: id and tableNum)
     */
  public cloneTable(id: number): Observable<Table> {
    console.log('TableService: Creating table.');
    return this.httpClient.post<Table>(this.tableBaseUri + '/clone/' + id, null);
  }

  /**
   * Updates an existing table
   * @param table table to update
   */
  public updateTable(table: Table): Observable<Table> {
    console.log('TableService: Updating table.');
    return this.httpClient.put<Table>(this.tableBaseUri, table);
  }

  /**
   * Deletes a new table
   * @param id id of the table to delete
   */
  public deleteTable(id: number): Observable<any> {
    console.log('TableService: Creating table.');
    return this.httpClient.delete(this.tableBaseUri + '/' + id);
  }

  /**
   * Sets a given table as (in)active
   * @param id id of the table to update
   * @param active boolean indicating whether table is active
   */
  public setTableActive(id: number, active: boolean): Observable<any> {
    console.log(`TableService: Make table with ID ${id}


fig(AtomType.ord, mainrm), // 4
  ), // 4
  '5': SymbolRenderConfig(
    math: RenderConfig(AtomType.ord, mainrm), // 5
    text: RenderConfig(AtomType.ord, mainrm), // 5
  ), // 5
  '6': SymbolRenderConfig(
    math: RenderConfig(AtomType.ord, mainrm), // 6
    text: RenderConfig(AtomType.ord, mainrm), // 6
  ), // 6
  '7': SymbolRenderConfig(
    math: RenderConfig(AtomType.ord, mainrm), // 7
    text: RenderConfig(AtomType.ord, mainrm), // 7
  ), // 7
  '8': SymbolRenderConfig(
    math: RenderConfig(AtomType.ord, mainrm), // 8
    text: RenderConfig(AtomType.ord, mainrm), // 8
  ), // 8
  '9': SymbolRenderConfig(
    math: RenderConfig(AtomType.ord, mainrm), // 9
    text: RenderConfig(AtomType.ord, mainrm), // 9
  ), // 9
  '\u2261': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2261 \equiv
  ), // ≡
  '\u227A': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u227A \prec
  ), // ≺
  '\u227B': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u227B \succ
  ), // ≻
  '\u223C': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u223C \sim
    variantForm: SymbolRenderConfig(
      math: RenderConfig(AtomType.rel, amsrm), // \thicksim
    ),
  ), // ∼
  '\u2AAF': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2AAF \preceq
  ), // ⪯
  '\u2AB0': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2AB0 \succeq
  ), // ⪰
  '\u2243': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2243 \simeq
  ), // ≃
  '\u2223': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2223 \mid \lvert \rvert \vert
    variantForm: SymbolRenderConfig(
      math: RenderConfig(AtomType.rel, amsrm), // \shortmid
    ),
  ), // ∣
  '\u226A': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u226A \ll
  ), // ≪
  '\u226B': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u226B \gg
  ), // ≫
  '\u224D': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u224D \asymp
  ), // ≍
  '\u22C8': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u22C8 \bowtie \Join
  ), // ⋈
  '\u2323': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2323 \smile
    variantForm: SymbolRenderConfig(
      math: RenderConfig(AtomType.rel, amsrm), // \smallsmile
    ),
  ), // ⌣
  '\u2291': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2291 \sqsubseteq
  ), // ⊑
  '\u2292': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2292 \sqsupseteq
  ), // ⊒
  '\u2250': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2250 \doteq
  ), // ≐
  '\u2322': SymbolRenderConfig(
    math: RenderConfig(AtomType.rel, mainrm), // \u2322 \frown
    variantForm: SymbolRenderConfig(
      math: RenderConfig(AtomType.rel, amsrm), // \smallfrown
    ),


dt class="hdlist1">$site_html_head_string

HTML snippet to be included in the <head> section of each page.
Can be set using GITWEB_SITE_HTML_HEAD_STRING at build time.
No default value.

$site_header

Name of a file with HTML to be included at the top of each page.
Relative to the directory containing the gitweb.cgi script.
Can be set using GITWEB_SITE_HEADER at build time.  No default
value.

$site_footer

Name of a file with HTML to be included at the bottom of each page.
Relative to the directory containing the gitweb.cgi script.
Can be set using GITWEB_SITE_FOOTER at build time.  No default
value.

$home_text

Name of a HTML file which, if it exists, is included on the
gitweb projects overview page ("projects_list" view).  Relative to
the directory containing the gitweb.cgi script.  Default value
can be adjusted during build time using GITWEB_HOMETEXT variable.
By default set to indextext.html.

$projects_list_description_width

The width (in characters) of the "Description" column of the projects list.
Longer descriptions will be truncated (trying to cut at word boundary);
the full description is available in the title attribute (usually shown on
mouseover).  The default is 25, which might be too small if you
use long project descriptions.

$default_projects_order

Default value of ordering of projects on projects list page, which
means the ordering used if you don’t explicitly sort projects list
(if there is no "o" CGI query parameter in the URL).  Valid values
are "none" (unsorted), "project" (projects are by project name,
i.e. path to repository relative to $projectroot), "descr"
(project description), "owner", and "age" (by date of most current
commit).

Default value is "project".  Unknown value means unsorted.

Changing gitweb’s behavior

These configuration variables control internal gitweb behavior.

$default_blob_plain_mimetype

Default mimetype for the blob_plain (raw) view, if mimetype checking
doesn’t result in some other type; by default "text/plain".
Gitweb guesses mimetype of a file to display based on extension
of its filename, using $mimetypes_file (if set and file exists)
and /etc/mime.types files (see mime.types(5) manpage; only
filename extension rules are supported by gitweb).

$default_text_plain_charset

Default charset for text files. If this is not set, the web server
configuration will be used.  Unset by default.

$fallback_encoding

Gitweb assumes this charset when a line contains non-UTF-8 characters.
The fallback decoding is used without error checking, so it can be even
"utf


50 001389B0  3B E0 00 00 */	li r31, 0
/* 8013CD54 001389B4  3B C0 00 00 */	li r30, 0
lbl_8013CD58:
/* 8013CD58 001389B8  7C 7D FA 14 */	add r3, r29, r31
/* 8013CD5C 001389BC  8B 03 00 01 */	lbz r24, 1(r3)
/* 8013CD60 001389C0  7F 03 C3 78 */	mr r3, r24
/* 8013CD64 001389C4  4B FA BD 3D */	bl func_800E8AA0
/* 8013CD68 001389C8  54 79 04 3E */	clrlwi r25, r3, 0x10
/* 8013CD6C 001389CC  3B 40 00 00 */	li r26, 0
/* 8013CD70 001389D0  3B 60 00 00 */	li r27, 0
/* 8013CD74 001389D4  48 00 00 20 */	b lbl_8013CD94
lbl_8013CD78:
/* 8013CD78 001389D8  7F 03 C3 78 */	mr r3, r24
/* 8013CD7C 001389DC  57 64 04 3E */	clrlwi r4, r27, 0x10
/* 8013CD80 001389E0  4B FA C2 99 */	bl func_800E9018
/* 8013CD84 001389E4  28 03 00 01 */	cmplwi r3, 1
/* 8013CD88 001389E8  40 82 00 08 */	bne lbl_8013CD90
/* 8013CD8C 001389EC  3B 5A 00 01 */	addi r26, r26, 1
lbl_8013CD90:
/* 8013CD90 001389F0  3B 7B 00 01 */	addi r27, r27, 1
lbl_8013CD94:
/* 8013CD94 001389F4  7C 1B C8 00 */	cmpw r27, r25
/* 8013CD98 001389F8  41 80 FF E0 */	blt lbl_8013CD78
/* 8013CD9C 001389FC  80 0D 9C E8 */	lwz r0, lbl_8063EFA8-_SDA_BASE_(r13)
/* 8013CDA0 00138A00  3B 9C 00 01 */	addi r28, r28, 1
/* 8013CDA4 00138A04  2C 1C 00 0A */	cmpwi r28, 0xa
/* 8013CDA8 00138A08  3B FF 00 06 */	addi r31, r31, 6
/* 8013CDAC 00138A0C  7C 60 F2 14 */	add r3, r0, r30
/* 8013CDB0 00138A10  3B DE 00 04 */	addi r30, r30, 4
/* 8013CDB4 00138A14  93 43 06 58 */	stw r26, 0x658(r3)
/* 8013CDB8 00138A18  41 80 FF A0 */	blt lbl_8013CD58
/* 8013CDBC 00138A1C  39 61 00 30 */	addi r11, r1, 0x30
/* 8013CDC0 00138A20  48 08 A3 A9 */	bl _restgpr_24
/* 8013CDC4 00138A24  80 01 00 34 */	lwz r0, 0x34(r1)
/* 8013CDC8 00138A28  7C 08 03 A6 */	mtlr r0
/* 8013CDCC 00138A2C  38 21 00 30 */	addi r1, r1, 0x30
/* 8013CDD0 00138A30  4E 80 00 20 */	blr

.global func_8013CDD4
func_8013CDD4:
/* 8013CDD4 00138A34  94 21 FF D0 */	stwu r1, -0x30(r1)
/* 8013CD


予以公告；未经法定程序，不得改变其用途。

第十条 本市编制港口、河道、航道、排水、岸线利用等专项规划，应当符合防汛安全要求。

有关部门编制前款所列的专项规划时，对涉及防汛安全的部分，应当征求同级水行政主管部门的意见。

第十一条 防汛预案是指对台风、暴雨、高潮和洪水可能引起的灾害进行防汛抢险、减轻灾害的对策、措施和应急部署，包括防汛风险分析、组织体系与职责、预防与预警、应急响应、应急保障、后期处置等内容。

第十二条 市防汛预案，由市水行政主管部门根据市防汛专项规划、防汛工程设施防御能力和国家规定的防汛标准，组织有关部门编制，报市人民政府批准后实施。

区防汛预案，由区水行政主管部门根据市防汛预案和区防汛专项规划的要求，组织有关部门编制，报区人民政府批准后实施，并报市水行政主管部门备案。

乡镇人民政府和街道办事处应当根据区防汛预案的要求，编制本辖区防汛预案，报区水行政主管部门备案。

防汛预案的修改，按照原编制、批准、备案程序办理。

第十三条 市和区防汛预案确定的有防汛任务的部门和单位（以下简称有防汛任务的部门和单位）应当根据防汛任务的要求，结合各自的特点，编制本部门、本单位的防汛预案，并报同级水行政主管部门备案，有防汛任务的单位还应当报其主管部门备案。其他部门和单位应当制定防汛的自保预案。

第十四条 各级防汛指挥机构、有防汛任务的部门和单位应当按照防汛预案的规定，定期组织应急演练和评估。

## 第三章  防汛工程设施建设和管理

第十五条 防汛工程设施，包括河道堤防（含防汛墙、海塘）、水闸、水文站、泵站、排水管道等能够防御和减轻台风、暴雨、高潮和洪水引起的灾害的工程设施，以及防汛信息系统等辅助性设施。

第十六


st_ctxt_fail.source_text}'"
                    elif not is_const:
                        reason = f" due to being reassigned"
                    add_error(f"Local '{target.name}' is marked as const but its value cannot be determined" + reason, target)
                    target.var.is_const = False

            if is_const_ctxt:
                in_const_ctxt -= 1
                const_ctxt_fail = None

        for i, source in enumerate(node.sources):
            if i >= len(node.targets): # else, traversed above
                source.traverse_nodes(pre=skip_special, post=update_node_constval)

        if erasable:
            erase_assign_targets(node, erasable)

    root.traverse_nodes(pre=skip_special, post=update_node_constval)

def parse_constant(value, lang, as_str=False):
    if as_str:
        return LuaString(to_langstr(value, lang))

    tokens, errors = tokenize(Source("<const>", to_langstr(value, lang)), lang=lang)
    if not errors:
        token = None
        if len(tokens) == 1:
            token = tokens[0]
        elif len(tokens) == 2 and tokens[0].value in ("-", "~") and tokens[1].type == TokenType.number:
            token = tokens[1]
            token.value = tokens[0].value + token.value

        if token:
            constval = const_from_token(token)
            if constval:
                return constval

from pico_process import Error, Source
from pico_minify import Focus
from pico_output import output_node


${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`);let s=t[t.length-1],i=Math.ceil(s/e);this.outputShape=t.slice(0,-1),i>1&&this.outputShape.push(i),o||this.variableNames.push("bestIndicesA");let a=this.outputShape,u=a.length,l=zt(u),c=er("coords",u),p,m;if(i===1){m=u+1;let D=zt(m);p=`
        ${D} sourceLocR = ${D}(${c.join()}, 0);
        ++${c[u-1]};
        ${D} sourceLocG = ${D}(${c.join()}, 0);
        ++${c[u-2]};
        ${D} sourceLocA = ${D}(${c.join()}, 0);
        --${c[u-1]};
        ${D} sourceLocB = ${D}(${c.join()}, 0);
        --${c[u-2]};`}else m=u,p=`
        ${l} sourceLocR = coords;
        ++${c[u-1]};
        ${l} sourceLocG = coords;
        ++${c[u-2]};
        ${l} sourceLocA = coords;
        --${c[u-1]};
        ${l} sourceLocB = coords;
        --${c[u-2]};`;let f=["x","y","z","w","u","v"].slice(0,m),d="."+f[m-1],h=f.map(D=>"int "+D),g=er("sourceLocR",m-1).concat("inIdx.r"),x=er("sourceLocG",m-1).concat("inIdx.g"),b=er("sourceLocB",m-1).concat("inIdx.b"),w=er("sourceLocA",m-1).concat("inIdx.a"),I=n==="max"?"greaterThan":"lessThan",N=o?"":`
          inIdx = round(vec4(getBestIndicesAChannel(${g.join()}),
                             getBestIndicesAChannel(${x.join()}),
                             getBestIndicesAChannel(${b.join()}),
                             getBestIndicesAChannel(${w.join()})));`,E=`vec4(
            getAChannel(${g.join()}),
            hasNextCol ? getAChannel(${x.join()}) : 0.,
            hasNextRow ? getAChannel(${b.join()}) : 0.,
            hasNextRow && hasNextCol ? getAChannel(${w.join()}) : 0.)`,A=o?"":`
      float getBestIndicesAChannel(${h.join()}) {
        return getChannel(getBestIndicesA(${f.join()}),
                                          vec2(${f.slice(-2).join()}));
      }`;this.userCode=`
      float getAChannel(${h.join()}) {
        return getChannel(getA(${f.join()}),
                               vec2(${f.slice(-2).join()}));
      }
      ${A}
      void main() {
        ${l} coords = getOutputCoords();
        bool hasNextCol = ${c[u-1]} < ${a[u-1]-1};
        bool hasNextRow = ${c[u-2]} < ${a[u-2]-1};
        ${p}
        ivec4 srcIdx = ivec4(sourceLocR${d}, sourceLocG${d},
          sourceLocB${d}, sourceLocA${d}) * ${e};
        ivec4 inIdx = srcIdx;
        vec4 bestIndex = vec4(inIdx);
        vec4 bestValue = ${E};

        for (int i = 0; i < ${e}; i++) {
          inIdx = srcIdx;
          ${N}
          vec4 candidate = ${E};
          bvec


);
  --ring: #085983;
  --chart-1: #085983;
  --chart-2: oklch(0.5461 0.2152 262.8809);
  --chart-3: oklch(0.4882 0.2172 264.3763);
  --chart-4: oklch(0.4244 0.1809 265.6377);
  --chart-5: oklch(0.3791 0.1378 265.5222);
  --sidebar: oklch(0.98 0 106);
  --sidebar-foreground: oklch(0.3211 0 0);
  --sidebar-primary: #085983;
  --sidebar-primary-foreground: oklch(1 0 0);
  --sidebar-accent: oklch(0.9514 0.025 236.8242);
  --sidebar-accent-foreground: oklch(0.3791 0.1378 265.5222);
  --sidebar-border: oklch(0.9276 0.0058 264.5313);
  --sidebar-ring: #085983;
  --font-sans: Inter, sans-serif;
  --font-serif: Source Serif 4, serif;
  --font-mono: JetBrains Mono, monospace;
  --font-instrument-serif: var(--font-instrument-serif), serif;
  --radius: 0.375rem;
  --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
  --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
  --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1),
    0 1px 2px -1px hsl(0 0% 0% / 0.1);
  --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
  --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1),
    0 2px 4px -1px hsl(0 0% 0% / 0.1);
  --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1),
    0 4px 6px -1px hsl(0 0% 0% / 0.1);
  --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1),
    0 8px 10px -1px hsl(0 0% 0% / 0.1);
  --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
  --tracking-normal: 0em;
  --spacing: 0.25rem;
}

.dark {
  --background: oklch(0.2046 0 0);
  --foreground: oklch(0.9219 0 0);
  --card: oklch(0.2686 0 0);
  --card-foreground: oklch(0.9219 0 0);
  --popover: oklch(0.2686 0 0);
  --popover-foreground: oklch(0.9219 0 0);
  --primary: #085983;
  --primary-foreground: oklch(1 0 0);
  --secondary: oklch(0.2686 0 0);
  --secondary-foreground: oklch(0.9219 0 0);
  --muted: oklch(0.2686 0 0);
  --muted-foreground: oklch(0.7155 0 0);
  --accent: oklch(0.3791 0.1378 265.5222);
  --accent-foreground: oklch(0.8823 0.0571 254.1284);
  --destructive: oklch(0.6368 0.2078 25.3313);
  --destructive-foreground: oklch(1 0 0);
  --border: oklch(0.3715 0 0);
  --input: oklch(0.3715 0 0);
  --ring: #085983;
  --chart-1: #085983;
  --chart-


 Rosebox
            value: ctp-rosebox
        -
            label: Royal Velvet
            value: ctp-royal-velvet
        -
            label: Solarized
            value: ctp-solarized-dark
*/
.theme-dark.anp-theme-ext-dark.ctp-rosebox {
  --ctp-accent: 165, 117, 98;
  --background-modifier-border: rgb(51, 51, 51);
}

.theme-light.anp-theme-ext-light.ctp-nord-light {
  --ctp-accent: 136, 192, 208;
}

.theme-light.anp-theme-ext-light.ctp-material-mint-light {
  --ctp-accent: var(--ctp-teal);
}

.theme-dark.anp-theme-ext-dark.ctp-material-mint-dark {
  --ctp-accent: var(--ctp-teal);
}

.theme-dark.anp-theme-ext-dark.ctp-nord-dark {
  --ctp-accent: 136, 192, 208;
}

.theme-dark.anp-theme-ext-dark.ctp-nord-darker {
  --ctp-accent: 136, 192, 208;
}

.theme-light.anp-theme-ext-light.ctp-atom-light {
  --ctp-accent: var(--ctp-blue);
}

.theme-dark.anp-theme-ext-dark.ctp-atom-dark {
  --ctp-accent: var(--ctp-blue);
}

.theme-dark.anp-theme-ext-amoled {
  --ctp-ext-surface2: 80, 80, 80 !important;
  --ctp-ext-surface1: 50, 50, 50 !important;
  --ctp-ext-surface0: 30, 30, 30 !important;
  --ctp-ext-base: 10, 10, 10 !important;
  --ctp-ext-mantle: 5, 5, 5 !important;
  --ctp-ext-crust: 0, 0, 0 !important;
}

.theme-light.anp-theme-ext-light.ctp-atom-light,
.anp-theme-ext-light.ctp-atom-light .themed-color-wrapper > .theme-light {
  --ctp-ext-rosewater: 229,
  	148,
  	121;
  --ctp-ext-flamingo: 197,
  	103,
  	131;
  --ctp-ext-pink: 166,
  	37,
  	104;
  --ctp-ext-mauve: 166,
  	37,
  	164;
  --ctp-ext-red: 231,
  	85,
  	69;
  --ctp-ext-maroon: 231,
  	101,
  	69;
  --ctp-ext-peach: 227,
  	86,
  	73;
  --ctp-ext-yellow: 152,
  	104,
  	0;
  --ctp-ext-green: 78,
  	162,
  	76;
  --ctp-ext-teal: 0,
  	188,
  	182;
  --ctp-ext-sky: 0,
  	132,
  	188;
  --ctp-ext-sapphire: 0,
  	119,
  	188;
  --ctp-ext-blue: 61,
  	116,
  	246;
  --ctp-ext-lavender: 152,
  	84,
  	151;
  --ctp-ext-text: 56,
  	58,
  	66;


  gf_vect_mul_init(a, gf_const_tbl);
                if (gf_vect_mul(tsize, gf_const_tbl, buff1, buff2) != 0) {
                        printf("fail creating buff2 (len %d)\n", tsize);
                        goto exit;
                }

                for (i = 0; i < tsize; i++)
                        if (gf_mul(a, buff1[i]) != buff2[i]) {
                                printf("fail at %d, 0x%x x %d = 0x%x (0x%x)\n", i, a, buff1[i],
                                       buff2[i], gf_mul(2, buff1[i]));
                                goto exit;
                        }
#ifdef TEST_VERBOSE
                if (0 == tsize % (32 * 8)) {
                        putchar('.');
                        fflush(0);
                }
#endif
        }

        // Run tests at end of buffer for Electric Fence
        align = 32;
        a = 2;

        gf_vect_mul_init(a, gf_const_tbl);
        for (size = 0; size < TEST_SIZE; size += align) {
                // Line up TEST_SIZE from end
                efence_buff1 = buff1 + size;
                efence_buff2 = buff2 + size;
                efence_buff3 = buff3 + size;

                gf_vect_mul(TEST_SIZE - size, gf_const_tbl, efence_buff1, efence_buff2);

                for (i = 0; i < TEST_SIZE - size; i++)
                        if (gf_mul(a, efence_buff1[i]) != efence_buff2[i]) {
                                printf("fail at %d, 0x%x x 2 = 0x%x (0x%x)\n", i, efence_buff1[i],
                                       efence_buff2[i], gf_mul(2, efence_buff1[i]));
                                goto exit;
                        }

                if (gf_vect_mul_base(TEST_SIZE - size, gf_const_tbl, efence_buff1, efence_buff3) !=
                    0) {
                        printf("fail line up TEST_SIZE from end\n");
                        goto exit;
                }
                // Check reference function
                for (i = 0; i < TEST_SIZE - size; i++)
                        if (efence_buff2[i] != efence_buff3[i]) {
                                printf("fail at %d, 0x%x x 0x%d = 0x%x (0x%x)\n", i, a,
                                       efence_buff2[i], efence_buff3[i],
                                       gf_mul(2, efence_buff1[i]));
                                goto exit;
                        }
#ifdef TEST_VERBOSE
                putchar('.');
#endif
        }

        // Test all unsupported sizes up to TEST_SIZE
        for (size = 0; size < TEST_SIZE; size++) {
                if (size % align != 0 && gf_vect_mul(size, gf_const_tbl, buff1, buff2) == 0) {
                        printf("fail expecting nonzero return code for unaligned size param (%d)\n",
                               size);
                        goto exit;
                }
        }

        printf(" done: Pass\n");
        fflush(0);

        ret = 0;
exit:

        free(buff1);
        free(buff2);
        free(buff3);

        return ret;
}


totalDuration = Duration.zero;
    for (var song in songs) {
      totalDuration += song.duration;
    }

    return Scaffold(
      appBar: AppBar(
        title: Text(artist.isNotEmpty ? artist : '未知艺术家'),
        centerTitle: true,
        elevation: 0,
        backgroundColor: Colors.transparent,
        actions: [
          IconButton(
            icon: const Icon(Icons.play_circle_filled),
            onPressed: () {
              if (songs.isNotEmpty) {
                final musicProvider = context.read<MusicProvider>();
                musicProvider.playAllByArtist(artist);
              }
            },
            tooltip: '播放全部',
          ),
        ],
      ),
      body: Column(
        children: [
          Container(
            padding: const EdgeInsets.all(24),
            child: Column(
              children: [
                Container(
                  width: 120,
                  height: 120,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(60),
                    color: theme.colorScheme.primaryContainer,
                    boxShadow: [
                      BoxShadow(
                        color: theme.colorScheme.shadow.withOpacity(0.2),
                        blurRadius: 10,
                        offset: const Offset(0, 4),
                      ),
                    ],
                  ),
                  child: ClipRRect(
                    borderRadius: BorderRadius.circular(60),
                    child: songs.isNotEmpty && songs.first.albumArt != null
                        ? Image.memory(
                            songs.first.albumArt!,
                            fit: BoxFit.cover,
                            errorBuilder: (context, error, stackTrace) {
                              return Icon(
                                Icons.person,
                                size: 60,
                                color: theme.colorScheme.onPrimaryContainer,
                              );
                            },
                          )
                        : Icon(
                            Icons.person,
                            size: 60,
                            color: theme.colorScheme.onPrimaryContainer,
                          ),
                  ),
                ),
                const SizedBox(height: 16),
                Text(
                  artist.isNotEmpty ? artist : '未知艺术家',
                  style: theme.textTheme.headlineMedium?.copyWith(
                    fontWeight: FontWeight.bold,
                  ),
                  textAlign: TextAlign.center,
                ),
                const SizedBox(height: 8),
                Text(
                  '${songs.length} 首歌曲 • ${_formatDuration(totalDuration)}',
                  style: theme.textTheme.bodyLarge?.copyWith(
                    color: theme.colorScheme.onSurface.withOpacity(0.7),
                  ),
                ),
              ],
            ),
          ),
          const Divider(),
          // 歌曲列表
          Expanded(
            child: ListView.builder(
              padding: const EdgeInsets.symmetric(horizontal: 16),
              itemCount: songs.length,
              itemBuilder: (context, index) {
                final song = songs[index];
                return ArtistSongTile(
                  song: song,
                  index: index,
                  onTap: () {
                    final musicProvider = context.read<MusicProvider>();
                    musicProvider.playSong(song, index: index);
                  },
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

class ArtistSongTile extends StatelessWidget {
  final Song song;
  final int index;
  final VoidCallback onTap;

  const ArtistSongTile({
    super.key,
    required this.song,
    required this.index,
    required this.onTap,
  });

  String _formatDuration(Duration duration) {
    String twoDigits(int n) => n.toString().padLeft(2, '0');
    final minutes = twoDigits(duration.inMinutes.remainder(60));
    final seconds = twoDigits(duration.inSeconds.remainder(60));
    return '$minutes:$seconds';
  }

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    final colorScheme = theme.colorScheme


"""
With these settings, tests run faster.
"""

from .base import *  # noqa
from .base import env

# GENERAL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
SECRET_KEY = env(
    "DJANGO_SECRET_KEY",
    default="Ib5xcBbtD917ODVYqRcpzHCxLXBCXnc6wEmJ0nqpcobXn5DDkv3DmJDqQtHXsfSX",
)
# https://docs.djangoproject.com/en/dev/ref/settings/#test-runner
TEST_RUNNER = "django.test.runner.DiscoverRunner"

# PASSWORDS
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#password-hashers
PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"]

# EMAIL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"

# DEBUGGING FOR TEMPLATES
# ------------------------------------------------------------------------------
TEMPLATES[0]["OPTIONS"]["debug"] = True  # type: ignore # noqa: F405

# MEDIA
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#media-url
MEDIA_URL = "http://media.testserver"
# Your stuff...
# ------------------------------------------------------------------------------


api-client-library/java/google-http-java-client/json</a>
 * </p>
 *
 * @author Google, Inc.
 */
@SuppressWarnings("javadoc")
public final class GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation extends com.google.api.client.json.GenericJson {

  /**
   * Image region to which this object belongs. This must be populated.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private GoogleCloudVisionV1p3beta1BoundingPoly boundingPoly;

  /**
   * The BCP-47 language code, such as "en-US" or "sr-Latn". For more information, see
   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String languageCode;

  /**
   * Object ID that should align with EntityAnnotation mid.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String mid;

  /**
   * Object name, expressed in its `language_code` language.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String name;

  /**
   * Score of the result. Range [0, 1].
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.Float score;

  /**
   * Image region to which this object belongs. This must be populated.
   * @return value or {@code null} for none
   */
  public GoogleCloudVisionV1p3beta1BoundingPoly getBoundingPoly() {
    return boundingPoly;
  }

  /**
   * Image region to which this object belongs. This must be populated.
   * @param boundingPoly boundingPoly or {@code null} for none
   */
  public GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation setBoundingPoly(GoogleCloudVisionV1p3beta1BoundingPoly boundingPoly) {
    this.boundingPoly = boundingPoly;
    return this;
  }

  /**
   * The BCP-47 language code, such as "en-US" or "sr-Latn". For more information, see
   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
   * @return value or {@code null} for none
   */
  public java.lang.String getLanguageCode() {
    return languageCode;
  }

  /**
   * The BCP-47 language code, such as "en-US" or "sr-Latn". For more information, see
   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
   * @param languageCode languageCode or {@code null} for none
   */
  public GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation setLanguageCode(java.lang.String languageCode) {
    this.languageCode = languageCode;
    return this;
  }

  /**
   * Object ID that should align with EntityAnnotation mid.
   * @return value or {@code null} for none
   */
  public java.lang.String getMid() {
    return mid;
  }

  /**
   * Object ID that should align with EntityAnnotation mid.
   * @param mid mid or {@code null} for none
   */
  public GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation setMid(java.lang.String mid) {
    this.mid = mid;
    return this;
  }

  /**
   * Object name, expressed in its `language_code` language.
   * @return value or {@code null} for none
   */
  public java.lang.String getName() {
    return name;
  }

  /**
   * Object name, expressed in its `language_code` language.
   * @param name name or {@code null} for none
   */
  public GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation setName(java.lang.Strin


local typedefs = require "kong.db.schema.typedefs"

return {
  name = "jwt-keycloak-endpoint",
  fields = {
    { consumer = typedefs.no_consumer },
    { config = {
        type = "record",
        fields = {
          { uri_param_names = { type = "set", elements = { type = "string" }, default = { "jwt" }, }, },
          { cookie_names = { type = "set", elements = { type = "string" }, default = {} }, },
          { claims_to_verify = { type = "set", elements = { type = "string", one_of = { "exp", "nbf" }, }, default = { "exp" } }, },
          { anonymous = { type = "string", uuid = true, legacy = true }, },
          { run_on_preflight = { type = "boolean", default = true }, },
          { maximum_expiration = { type = "number", default = 0, between = { 0, 31536000 }, }, },
          { algorithm = { type = "string", default = "RS256" }, },

          { allowed_iss = { type = "set", elements = { type = "string" }, required = tr


using System.IO;
using System.Diagnostics;
using System.Text;
using NUglify.Html;
using NUglify.JavaScript;
using NUglify.Tests.JavaScript.Common;
using NUnit.Framework;

namespace NUglify.Tests.JavaScript
{
    [TestFixture]
    public class Bugs
    {

		[Test]
        public void Bug35()
        {
            TestHelper.Instance.RunErrorTest();
        }

		[Test]
        public void Bug57()
        {
            TestHelper.Instance.RunErrorTest();
        }

		[Test]
        public void Bug63()
        {
            TestHelper.Instance.RunErrorTest(JSError.NoLeftParenthesis, JSError.ExpressionExpected, JSError.NoLeftCurly, JSError.BadSwitch);
        }

		[Test]
        public void Bug70()
        {
            TestHelper.Instance.RunTest();
        }

		[Test]
        public void Bug76()
        {
            TestHelper.Instance.RunTest("-rename:all");
        }

		[Test, Ignore("This is broken in .NET framework, can't be fixed by the developer")]
        public void Bug78()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug79()
        {
            TestHelper.Instance.RunTest("-rename:all");
        }

        [Test]
        public void Bug80()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug87()
        {
            TestHelper.Instance.RunTest("-reorder:false -fnames:lock -unused:remove -rename:all");
        }

        [Test]
        public void Bug92()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug94()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug120()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug138()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug139()
        {
            TestHelper.Instance.RunTest();
        }

        [Test]
        public void Bug139_A()
        {
            // previously these would throw exceptions because the closing backtick was skipped, creating an invalid ast
            // manually define cr and lfs to be sure we dont have platform sillynes

            var uglifyResult = Uglify.Js(@"var testString = `
`;
            testString += `} async init(){ }`;");
            Assert.That(uglifyResult.Code, Is.EqualTo("var testString=`\n`+`} async init(){ }`"));

            // CR
            uglifyResult = Uglify.Js("var testString = `"+ (char)13 +@"`;
            testString += `} async init(){ }`;");
            Assert.That(uglifyResult.Code, Is.EqualTo("var testString=`\r`+`} async init(){ }`"));

            // LF
            uglifyResult = Uglify.Js("var testString = `" + (char)10 + @"`;
            testString += `} async init(){ }`;");
            Assert.That(uglifyResult.Code, Is.EqualTo("var testString=`\n`+`} async init(){ }`"));

            // CRLF
            uglifyResult = Uglify.Js("var testString = `" + (char)13 + (char)10 + @"`;
            testString += `} async init(){ }`;");
            Assert.That(uglifyResult.Code, Is.EqualTo("var testString=`\r\n`+`} async init(){ }`"));

            //LFCR
            uglifyResult = Uglify.Js(


0
  LOADK R17 K42 [0.5]
  CALL R15 2 1
  SETTABLEKS R15 R14 K29 ["AnchorPoint"]
  GETTABLEKS R15 R2 K43 ["graphicsQualityAutoMode"]
  SETTABLEKS R15 R14 K30 ["Disabled"]
  GETTABLEKS R15 R2 K44 ["graphicsQuality"]
  SETTABLEKS R15 R14 K31 ["Value"]
  LOADN R15 0
  SETTABLEKS R15 R14 K32 ["Min"]
  GETUPVAL R15 4
  SETTABLEKS R15 R14 K33 ["Max"]
  GETTABLEKS R15 R0 K45 ["setGraphicsQuality"]
  SETTABLEKS R15 R14 K34 ["OnValueChanged"]
  GETIMPORT R15 K47 [UDim2.new]
  LOADN R16 0
  LOADN R17 200
  LOADN R18 0
  LOADN R19 20
  CALL R15 4 1
  SETTABLEKS R15 R14 K35 ["Size"]
  GETIMPORT R15 K49 [UDim.new]
  LOADN R16 10
  LOADN R17 10
  CALL R15 2 1
  SETTABLEKS R15 R14 K7 ["Padding"]
  LOADN R15 1
  SETTABLEKS R15 R14 K36 ["SnapIncrement"]
  LOADN R15 0
  SETTABLEKS R15 R14 K37 ["VerticalDragTolerance"]
  CALL R12 2 1
  GETUPVAL R14 0
  GETTABLEKS R13 R14 K3 ["createElement"]
  GETUPVAL R14 5
  DUPTABLE R15 K53 [{"Checked", "Key", "OnClick", "Text"}]
  GETTABLEKS R16 R2 K43 ["graphicsQualityAutoMode"]
  SETTABLEKS R16 R15 K50 ["Checked"]
  LOADK R16 K43 ["graphicsQualityAutoMode"]
  SETTABLEKS R16 R15 K51 ["Key"]
  GETTABLEKS R16 R0 K54 ["toggleGraphicsQualityAutomatic"]
  SETTABLEKS R16 R15 K52 ["OnClick"]
  LOADK R18 K26 ["GraphicsQuality"]
  LOADK R19 K55 ["AutoGraphicsQualityLabel"]
  NAMECALL R16 R3 K28 ["getText"]
  CALL R16 3 1
  SETTABLEKS R16 R15 K23 ["Text"]
  CALL R13 2 -1
  SETLIST R11 R12 -1 [1]
  CALL R8 3 1
  SETTABLEKS R8 R7 K18 ["GraphicsQualityPane"]
  CALL R4 3 -1
  RETURN R4 -1

MAIN:
  PREPVARARGS 0
  GETIMPORT R3 K1 [script]
  GETTABLEKS R2 R3 K2 ["Parent"]
  GETTABLEKS R1 R2 K2 ["Parent"]
  GETTABLEKS R0 R1 K2 ["Parent"]
  GETIMPORT R1 K4 [require]
  GETTABLEKS R3 R0 K5 ["Packages"]
  GETTABLEKS


return {
	fadeOut = 1.5,
	mode = 2,
	fadeType = 2,
	once = true,
	id = "JICHANG22",
	fadein = 1.5,
	scripts = {
		{
			say = "Location unknown - Time unknown",
			side = 2,
			dir = 1,
			blackBg = true,
			bgm = "bsm-2",
			flashin = {
				delay = 1,
				dur = 1,
				black = true,
				alpha = {
					1,
					0
				}
			},
			typewriter = {
				speed = 0.05,
				speedUp = 0.01
			},
			painting = {
				alpha = 0.3,
				time = 1
			}
		},
		{
			actorShadow = true,
			side = 2,
			dir = 1,
			blackBg = true,
			actor = 900232,
			nameColor = "#ff5c5c",
			say = "Data compilation complete. And so, another legacy has been documented.",
			typewriter = {
				speed = 0.05,
				speedUp = 0.01
			},
			painting = {
				alpha = 0.3,
				time = 1
			}
		},
		{
			actorShadow = true,
			side = 2,
			dir = 1,
			blackBg = true,
			actor = 900233,
			nameColor = "#ff5c5c",
			say = "Only took us like a million years. Sure, it's a task from the depths of the repository, but does it really take that much computing power?",
			typewriter = {
				speed = 0.05,
				speedUp = 0.01
			},
			painting = {
				alpha = 0.3,
				time = 1
			}
		},
		{
			side = 2,
			actorShadow = true,
			dir = 1,
			blackBg = true,
			actor = 900232,
			nameColor = "#ff5c5c",
			say = "There's more to art than the final product, you know. Reproducibility is an important element as well.",
			typewriter = {
				speed = 0.05,
				speedUp = 0.01
			},
			painting = {
				alpha = 0.3,
				time = 1
			}
		},
		{
			side = 2,
			actorShadow = true,
			dir = 1,
			blackBg = true,
			actor = 900232,
			nameColor = "#ff5c5c",
			say = "Or are you saying that there's some error within our database?",
			typewriter = {
				speed = 0.05,
				speedUp = 0.01
			},
			painting = {
				alpha = 0.3,
				time = 1
			}
		},
		{
			expression = 2,
			actorShadow = true,
			side = 2,
			dir = 1,
			blackBg = true,
			actor = 900233,
			nameColor = "#ff5c5c",
			say = "Ugh, I forgot how pointless it is to argue with you. Whatever, forget I said anyth


buildTest({
      'className': 'VisualDensity',
      'horizontal': 3.0,
      'vertical': 3.0,
    });
    await tester.pumpAndSettle();
    childRect = tester.getRect(find.byKey(childKey));
    expect(box.size, equals(const Size(156, 124)));
    expect(childRect, equals(const Rect.fromLTRB(350, 250, 450, 350)));

    await buildTest({
      'className': 'VisualDensity',
      'horizontal': -3.0,
      'vertical': -3.0,
    });
    await tester.pumpAndSettle();
    childRect = tester.getRect(find.byKey(childKey));
    expect(box.size, equals(const Size(108, 100)));
    expect(childRect, equals(const Rect.fromLTRB(350, 250, 450, 350)));

    await buildTest({
      'className': 'VisualDensity',
    }, useText: true);
    await tester.pumpAndSettle();
    childRect = tester.getRect(find.byKey(childKey));
    expect(box.size, equals(const Size(88, 48)));
    expect(childRect, equals(const Rect.fromLTRB(372.0, 293.0, 428.0, 307.0)));

    await buildTest({
      'className': 'VisualDensity',
      'horizontal': 3.0,
      'vertical': 3.0,
    }, useText: true);
    await tester.pumpAndSettle();
    childRect = tester.getRect(find.byKey(childKey));
    expect(box.size, equals(const Size(112, 60)));
    expect(childRect, equals(const Rect.fromLTRB(372.0, 293.0, 428.0, 307.0)));

    await buildTest({
      'className': 'VisualDensity',
      'horizontal': -3.0,
      'vertical': -3.0,
    }, useText: true);
    await tester.pumpAndSettle();
    childRect = tester.getRect(find.byKey(childKey));
    expect(box.size, equals(const Size(76, 36)));
    expect(childRect, equals(const Rect.fromLTRB(372.0, 293.0, 428.0, 307.0)));
  });

  // 单测失败原因 : labelKey 无法传入widget, 生成的widget 也无法拿到labelKey
  testWidgets('RaisedButton.icon responds to applied padding',
      (WidgetTester tester) async {
    const Key buttonKey = Key('test');
    const Key labelKey = Key('label');
    await tester.pumpWidget(
      // When textDirection is set to TextDirection.ltr, the label appears on the
      // right side of the icon. This is important in determining whether the
      // horizontal padding is applied correctly later on
      Directionality(
        textDirection: TextDirection.ltr,
        child: Material(
          child: Center(
            child: widgetFromJson({
              'className': 'RaisedButton',
              'icon': {
                'className': 'Icon',
                'constructorName': 'add',
              },
              'padding': {
                'className': 'EdgeInsets',
                'constructorName': 'fromLTRB',
                'left': 16,
                'top': 5,
                'right': 10,
                'bottom': 12,
              },
              'key': {
                'className': 'Key',
                'value': 'test',
              },
              'onPressed': () {}.hashCode.toString(),
              'label': {
                'className': 'Text',
                'data': 'Hello',
                'key': {
                  'className': 'Key',
                  'value': 'label',
                }
              },
            }),
          ),
        ),
      ),
    );

    final Rect paddingRect = tester.getRect(find.byType(Padding));
    final Rect labelRect = tester.getRect(find.byKey(labelKey));
    final Rect iconRect = tester.getRect(find.byType(Icon));

    // The right padding should be applied on the right of the label, whereas the
    // left padding should be applied on the left side of the icon.
    expect(paddingRect.right, labelRect.right +


ad.live.chat.client.codec.douyu.msg.dto.GiftPropSingle;
import tech.ordinaryroad.live.chat.client.commons.base.constant.RoomLiveStatusEnum;
import tech.ordinaryroad.live.chat.client.commons.base.room.IRoomLiveStreamInfo;

import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

/**
 * @author mjz
 * @date 2023/8/30
 */
class DouyuApisTest {

    @Test
    void getRealRoomId() {
        assertEquals(2947432, DouyuApis.getRealRoomId(92000));
        assertEquals(3168536, DouyuApis.getRealRoomId(3168536));
        assertEquals(290935, DouyuApis.getRealRoomId(22222));
        assertEquals(290935, DouyuApis.getRealRoomId(290935));
        assertEquals(520, DouyuApis.getRealRoomId(520));
        assertThrows(RuntimeException.class, () -> DouyuApis.getRealRoomId(-1));
    }

    @Test
    void getGiftInfo() {
        GiftPropSingle giftByPid = DouyuApis.getGiftPropSingleByPid("4");
        assertEquals("赞", giftByPid.getName());
    }

    @Test
    void testRoomTitle() {
        Assert.notBlank(DouyuApis.roomInit(74751L, null).getRoomTitle());
        Assert.notBlank(DouyuApis.roomInit(22222L, null).getRoomTitle());
        Assert.notBlank(DouyuApis.roomInit(6073358L, null).getRoomTitle());
        Assert.notBlank(DouyuApis.roomInit(6525105L, null).getRoomTitle());
    }

    @Test
    void testRoomLiveStatus() {
        assertEquals(RoomLiveStatusEnum.STOPPED, DouyuApis.roomInit(288016L, null).getRoomLiveStatus());
    }

    @Test
    void testRoomLiveStreamUrls() {
         List<IRoomLiveStreamInfo> roomLiveStreamUrls = DouyuApis.roomInit(288016L, null, null).getRoomLiveStreamUrls();
//        List<IRoomLiveStreamInfo> roomLiveStreamUrls = DouyuApis.roomInit(6512L, null, null).getRoomLiveStreamUrls();
        Assert.notEmpty(roomLiveStreamUrls);
    }
}/*
 * MIT License
 *
 * Copyright (c) 2023 OrdinaryRoad
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package tech.ordinaryroad.live.chat.client.codec.douyu.msg;

import tech.ordinaryroad.live.chat.client.codec.douyu.constant.DouyuCmdEnum;
import tech.ordinaryroad.live.chat.client.codec.douyu.msg.base.BaseDouyuCmdMsg;

/**
 * @author mjz
 * @date 2023/1/6
 */
public class HeartbeatReplyMsg extends BaseDouyuCmdMsg {

    @Override
    public String getType() {
        return DouyuCmdEnum.mrkl.name();
    }

}
/*
 * MIT License
 *


/* ----------------------------------------------------------------------
   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
   http://lammps.sandia.gov, Sandia National Laboratories
   Steve Plimpton, sjplimp@sandia.gov

   Copyright (2003) Sandia Corporation.  Under the terms of Contract
   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
   certain rights in this software.  This software is distributed under
   the GNU General Public License.

   See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */

// Pointers class contains ptrs to master copy of
//   fundamental LAMMPS class ptrs stored in lammps.h
// every LAMMPS class inherits from Pointers to access lammps.h ptrs
// these variables are auto-initialized by Pointer class constructor
// *& variables are really pointers to the pointers in lammps.h
// & enables them to be accessed directly in any class, e.g. atom->x

#ifndef LMP_POINTERS_H
#define LMP_POINTERS_H

#include "lmptype.h"
#include <mpi.h>
#include "lammps.h"

namespace LAMMPS_NS {

// universal defines inside namespace

#define FLERR __FILE__,__LINE__

#define MIN(A,B) ((A) < (B) ? (A) : (B))
#define MAX(A,B) ((A) > (B) ? (A) : (B))
#define UNUSED(P) (void)P

class Pointers {
 public:
  Pointers(LAMMPS *ptr) :
    lmp(ptr),
    memory(ptr->memory),
    error(ptr->error),
    universe(ptr->universe),
    input(ptr->input),
    atom(ptr->atom),
    update(ptr->update),
    neighbor(ptr->neighbor),
    comm(ptr->comm),
    domain(ptr->domain),
    force(ptr->force),
    modify(ptr->modify),
    group(ptr->group),
    output(ptr->output),
    timer(ptr->timer),
    world(ptr->world),
    infile(ptr->infile),
    screen(ptr->screen),
    logfile(ptr->logfile),
    thermofile(ptr->thermofile) {}
  virtual ~Pointers() {}

 protected:
  LAMMPS *lmp;
  Memory *&memory;
  Error *&error;
  Universe *&universe;
  Input *&input;

  Atom *&atom;
  Update *&update;
  Neighbor *&neighbor;
  Comm *&comm;
  Domain *&domain;
  Force *&force;
  Modify *&modify;
  Group *&group;
  Output *&output;
  Timer *&timer;

  MPI_Comm &world;
  FILE *&infile;
  FILE *&screen;
  FILE *&logfile;
  FILE *&thermofile;
};

}

#endif


	if(s[i] != ' ')return(false);
    };
    return(true);
}
/*
 * Raphael 1.5.2 - JavaScript Vector Library
 *
 * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
 * Licensed under the MIT (http://raphaeljs.com/license.html) license.
 */
(function(){function a(){if(a.is(arguments[0],G)){var b=arguments[0],d=bV[m](a,b.splice(0,3+a.is(b[0],E))),e=d.set();for(var g=0,h=b[w];g<h;g++){var i=b[g]||{};c[f](i.type)&&e[L](d[i.type]().attr(i))}return e}return bV[m](a,arguments)}a.version="1.5.2";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g=document,h=window,i={was:Object[e][f].call(h,"Raphael"),is:h.Raphael},j=function(){this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in g,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v="join",w="length",x=r[e].toLowerCase,y=Math,z=y.max,A=y.min,B=y.abs,C=y.pow,D=y.PI,E="number",F="string",G="array",H="toString",I="fill",J=Object[e][H],K={},L="push",M=/^url\(['"]?([^\)]+?)['"]?\)$/i,N=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,O={"NaN":1,Infinity:1,"-Infinity":1},P=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,Q=y.round,R="setAttribute",S=parseFloat,T=parseInt,U=" progid:DXImageTransform.Microsoft",V=r[e].toUpperCase,W={blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:"10px \"Arial\"","font-family":"\"Arial\"","font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:


// Copyright 2022 s8erdude (@jpuerto96)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include "quantum.h"

/* This is a shortcut to help you visually see your layout.
 *
 * The first section contains all of the arguments representing the physical
 * layout of the board and position of the keys.
 *
 * The second converts the arguments into a two-dimensional array which
 * represents the switch matrix.
 */
#define LAYOUT_2x3u( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k59, k58, k57, k56,   k55, k54,     k53, k52, k51, k50, \
    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k69, k68, k67, k66,   k65, k64,     k63, k62, k61, \
    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k79, k78, k77,                      k73, k72, k71, k70, \
    k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k89, k88,                k85,       k83, k82, k81, \
    k40, k41, k42, k43,           k46,           k49, k99, k98,           k96, k95, k94,       k92, k91, k90 \
) { \
    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \
    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \
    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \
    { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 }, \
    { k40, k41, k42, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, k49 }, \
    { k50, k51, k52, k53, k54, k55, k56, k57, k58, k59 }, \
    { KC_NO, k61, k62, k63, k64, k65, k66, k67, k68, k69 }, \
    { k70, k71, k72, k73, KC_NO, KC_NO, KC_NO, k77, k78, k79 }, \
    { KC_NO, k81, k82, k83, KC_NO, k85, KC_NO, KC_NO, k88, k89 }, \
    { k90, k91, k92, KC_NO, k94, k95, k96, KC_NO, k98, k99 } \
}

#define LAYOUT_625u( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k59, k58, k57, k56,   k55, k54,     k53, k52, k51, k50, \
    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k69, k68, k67, k66,   k65, k64,     k63, k62, k61, \
    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k79, k78, k77,                      k73, k72, k71, k70, \
    k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k89, k88,                k85,       k83, k82, k81, \
    k40, k41, k42,           k45,                k49, k99, k98,           k96, k95, k94,       k92, k91, k90 \
) { \
    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \
    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \
    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \
    { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 }, \
    { k40, k41, k42, KC_NO, KC_NO, k45, KC_NO, KC_NO, KC_NO, k49 }, \
    { k50, k51, k52, k53, k54, k55, k56, k57, k58, k59 }, \
    { KC_NO, k61, k62, k63, k64, k65, k66, k67, k68, k69 }, \
    { k70, k71, k72, k73, KC_NO, KC_NO, KC_NO, k77, k78, k79 }, \
    { KC_NO, k81, k82, k83, KC_NO, k85, KC_NO, KC_NO, k88, k89 }, \
    { k90, k91, k92, KC_NO, k94, k95, k96, KC_NO, k98, k99 } \
}


시 본문 키워드를 이용해 자연스러운 문장으로 작성해주세요.',
    subText:
      '· 캠페인 미션으로 주어진 글자 수를 적용하지 않으면 수정요청이 있을 수 있습니다.',
  },
  {
    icon: images.video,
    title: '동영상',
    text: '연출 컷이나 제형을 동영상이나 움짤로 넣어주세요',
    subText:
      '· 캠페인 미션으로 주어진 동영상 요청사항을 적용하지 않으면 수정요청이 있을 수 있습니다.',
  },
  {
    icon: images.picture,
    title: '사진 수',
    text: '연출 컷, 제형 사진, 사용 시 느낌을 상세히 표현해주시고, 제품을 들고 있는 셀카 사진을 넣어주시면 더욱 좋습니다.\n(사진은 최소 5컷 이상)',
    subText:
      '· 위 안내된 사진 갯수를 준수해주세요. 미 이행 시 수정요청이 있을 수 있습니다.',
  },
]

const CampDetail = () => {
  const navermaps = useNavermaps()

  const [liked, setLiked] = useState(false)

  const handleLikeClick = () => {
    setLiked((prevLiked) => !prevLiked)
  }

  const navigate = useNavigate()

  const goToSubmit = () => {
    navigate('/submit')
  }

  return (
    <Container>
      <components.TopButton />
      <components.Header />
      <Box className="DisplayBox">
        <Box className="CampDetail">
          {/* 왼쪽 컨텐츠 */}
          <Box className="LeftContent">
            <Box className="TextBox">
              <T className="CampText">캠페인 정보</T>
              <IconButton>
                <OpenInNewIcon />
              </IconButton>
            </Box>
            <Box className="HashBox">
              {hashInfo.map((item, index) => (
                <Box className="HashInfo" key={index}>
                  # {item}
                </Box>
              ))}
            </Box>
            <Box className="Section" />
            {/* 상품 정보 */}
            <Box className="TitleBox">
              <Box className="TitleOne">
                <T className="Text">자연을 담은 Coverage Foundation</T>
                <IconButton onClick={handleLikeClick}>
                  {liked ? <Favorite color="error" /> : <FavoriteBorder />}
                </IconButton>
              </Box>

              <Box className="TitleTwo">신청 23/20</Box>
            </Box>
            <T className="SubText">The Orcinary</T>

            <T className="History">제공 내역</T>
            <Box className="HistoryText">
              자연을 담은 Coverage Foundation 본품 1개

              색상 택 1(1호, 2호)

              ㄴ1호 : 밝은 21호 피부 추천 / 2호 : 21~23호 피부 추천
            </Box>
            <Box className="Map">
              <T className="Schedule">영업시


toolbox\secrets) |
| macOS   | `$HOME/.toolbox/secrets` (e.g. /Users/bob/.toolbox/secrets)        |
| Linux   | `$HOME/.toolbox/secrets` (e.g. /home/bob/.toolbox/secrets)         |

これらの認証情報ファイルはDropboxサポートを含め誰にも共有しないでください.
不必要になった場合にはこれらのファイルを削除しても問題ありません. 認証情報の削除を確実にしたい場合には、アプリケーションアクセス設定または管理コンソールからアプリケーションへの許可を取り消してください.

方法は次のヘルプセンター記事をご参照ください:
* Dropbox for teams: https://help.dropbox.com/installs-integrations/third-party/business-api#manage

## 認可スコープ

| 説明                                                                                |
|-------------------------------------------------------------------------------------|
| Dropbox for teams：プロフィール写真など、Dropboxアカウントの基本情報の表示と編集    |
| Dropbox for teams：Dropboxのファイルやフォルダの内容を表示                          |
| Dropbox for teams：Dropboxのファイルやフォルダの内容を編集する                      |
| Dropbox for teams：チームやメンバーのフォルダ構造を表示                             |
| Dropbox for teams：チーム内のファイルやフォルダのコンテンツを閲覧・編集できます。   |
| Dropbox for teams：名前、ユーザー数、チーム設定など、チームの基本情報を表示します。 |

# 認可

最初の実行では、`tbx`はあなたのDropboxアカウントへの認可を要求します.
リンクをブラウザにペーストしてください. その後、認可を行います. 認可されると、Dropboxは認証コードを表示します. `tbx`にこの認証コードをペーストしてください.
```

watermint toolbox xx.x.xxx
==========================

© 2016-2025 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.

このプロジェクトは積極的にメンテナンスされていません。詳細については、https://github.com/watermint/toolbox/discussions/911 をご覧ください。

1. 次のURLを開き認証ダイアログを開いてください:

https://www.dropbox.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxx&response_type=code&state=xxxxxxxx

2. 'Allow'をクリックします (先にログインしておく必要があります):
3. 認証コ


},
[21342] = {"阿莱克斯",nil},
[21343] = {"哈维",nil},
[21344] = {"菲尔",nil},
[21345] = {"霍恩",nil},
[21346] = {"盲目之眼",nil},
[21347] = {"影月谷薯块生长点",nil},
[21348] = {"Shadowmoon Trigger",nil},
[21349] = {"巫医塔卡里",nil},
[21350] = {"戈隆祭司",nil},
[21351] = {"Ogre Building Bunny Large",nil},
[21352] = {"Ogre Building Bunny Summoner",nil},
[21353] = {"Terokkar - Bone Wastes - Soul Trigger",nil},
[21354] = {"炽热战马",nil},
[21355] = {"Invisible Man Mount 20",nil},
[21356] = {"Designer Island Bear Orc Leader [PH]",nil},
[21357] = {"空军指挥官努埃恩",nil},
[21358] = {"Designer Island Tauren Herder [PH]",nil},
[21359] = {"血卫士古尔穆克",nil},
[21360] = {"Terokkar - Bone Wastes - Nether Orb Blue",nil},
[21361] = {"Designer Island Orc Trainee [PH]",nil},
[21362] = {"凤凰",nil},
[21363] = {"Terokkar - Bone Wastes - Portal Trigger",nil},
[21364] = {"凤凰卵",nil},
[21365] = {"漂浮的徽记",nil},
[21366] = {"Terokkar - Bone Wastes - Portal Trigger 02",nil},
[21367] = {"Designer Island Battle Participant A [PH]",nil},
[21368] = {"虚灵掠夺者",nil},
[21369] = {"Flame Strike Trigger (Kael)",nil},
[21370] = {"虚灵邪术师",nil},
[21371] = {"Designer Island Hungry Farmer [PH]",nil},
[21372] = {"红色丝翼巨蛾",nil},
[21373] = {"丝翼巨蛾",nil},
[21374] = {"红色丝翼幼虫",nil},
[21375] = {"肥硕的丝翼幼虫",nil},
[21376] = {"顽固的鲍勃",nil},
[21378] = {"[UNUSED]Test Nether Whelp",nil},
[21380] = {"大型硬壳穿地虫",nil},
[21381] = {"硬壳穿地虫幼体",nil},
[21382] = {"拜龙教狂热者",nil},
[21383] = {"拜龙教侍僧",nil},
[21384] = {"黑暗教团先驱者",nil},
[21385] = {"黑暗教团鸦人",nil},
[21386] = {"黑暗教团监视者",nil},
[21387] = {"拜龙教黑色龙崽",nil},
[21388] = {"Designer Island Horde [PH]",nil},
[21389] = {"灰烬之喉玛克纳尔","拜龙教长老"},
[2139


ont, drawFont, drawFont, "500",
		// "IAS", "km/h");
		// drawLabelBOSType(g, 0, n, 1,)
		// g.drawLine(0, Height-1, 0, throttley );
		// g.drawLine(0, 0, 0, Height - 1 - throttley);
	}

	// public void drawTextseries2(Graphics2D g, int x, int y) {
	// int n = 0;
	// g.setFont(drawFont);
	//
	// g.setColor(Color.gray);
	// g.drawString(line3, x + 1, n + y + 1);
	// g.setColor(new Color(255, 215, 8, 100));
	// g.drawString(line3, x, n + y);
	//
	// }

	/*
	 * private static BufferedImage setAlpha(String srcImageFile,int alpha) {
	 *
	 * try { //读取图片 FileInputStream stream = new FileInputStream(new
	 * File(srcImageFile));// 指定要读取的图片
	 *
	 * // 定义一个字节数组输出流，用于转换数组 ByteArrayOutputStream os = new
	 * ByteArrayOutputStream();
	 *
	 * byte[] data =new byte[1024];// 定义一个1K大小的数组 while (stream.read(data) !=
	 * -1) { os.write(data); }
	 *
	 * ImageIcon imageIcon = new ImageIcon(os.toByteArray()); BufferedImage
	 * bufferedImage = new BufferedImage(imageIcon.getIconWidth(),
	 * imageIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2D
	 * = (Graphics2D) bufferedImage.getGraphics();
	 * g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
	 *
	 * //判读透明度是否越界 if (alpha < 0) { alpha = 0; } else if (alpha > 10) { alpha =
	 * 10; }
	 *
	 * // 循环每一个像素点，改变像素点的Alpha值 for (int j1 = bufferedImage.getMinY(); j1 <
	 * bufferedImage.getHeight(); j1++) { for (int j2 = bufferedImage.getMinX();
	 * j2 < bufferedImage.getWidth(); j2++) { int rgb = bufferedImage.getRGB(j2,
	 * j1); rgb = ((alpha * 255 / 10) << 24) | (rgb & 0x00ffffff);
	 * bufferedImage.setRGB(j2, j1, rgb); } } g2D.drawImage(bufferedImage, 0, 0,
	 * imageIcon.getImageObserver());
	 *
	 * // 生成图片为PNG
	 *
	 * return bufferedImage;
	 *
	 * } catch (Exception e) { e.printStackTrace(); } return null;
	 *
	 * }
	 */

	public void initPreview(controller c) {
		init(c, null, null);
		// setShadeWidth(10);
		this.setVisible(false);
		this.getWebRootPaneUI().setTopBg(app.previewColor);
		this.getWebRootPaneUI().setMiddleBg(app.previewColor);
		// setFocusableWindowState(true);
		// setFocusable(true);

		addMouseListener(new MouseAdapter() {
			public void mouseEntered(MouseEvent e) {
				/*
				 * if(A.tag==0){ if(f.mode==1){ A.setVisible(false);
				 * A.visibletag=0; } }
				 */
			}

			public void mousePressed(MouseEvent e) {
				isDragging = 1;
				xx = e.getX();
				yy = e