AI APIの導入が企業規模で進む中、複数の開発チームが一つのAPIキーを共有antinfrastructure担当者の頭を悩ませています。「谁知道谁在用什么」「配额超えたら本番が落ちた」「料金が高すぎて原因特定できない」——这些问题は、HolySheep API中转站の团队协作機能を活用することで解决できます。本記事では、権限管理と配额分配の实现方法を彻底的に解説します。
私は普段、複数のAIプロジェクトを同时进行する開発チームを指挥していますが、先月までは各プロジェクトごとに别々のAPIキーを発行+n管理+n让我想想+让我想想していた结果、管理コストが爆発的に増加+n困扰していました。HolySheep 도입 후 팀_collaboration 기능으로 이러한 문제가 어떻게 해결되었는지、その实践经验を交えながらご紹介します。
团队协作の重要性:なぜ中转站なのか
单纯にAPIを代理転送するだけでなく、チーム规模でAI APIを効率的に活用するには三个关键が必要です:
- 権限の细分化:プロジェクトごと、部门ごとにアクセス制御
- 配額の可视化管理:リアルタイムで谁がどれだけ消费しているか把握
- コストの最適化:汇率メリット+无駄なリクエスト减
特に注目すべきは、HolySheepの汇率メリットです。レートが¥1=$1(公式¥7.3=$1比で85%节约)という破格の条件を笔配すると、チーム全体のAPIコストが剧的に压缩されます。
月間1000万トークン:コスト比较表
企业で повержен APIを活用する場合、月间1000万トークンという规模は珍しくない+n让我们看看+让我看看+让我们算算. 各プロバイダのoutput价格と、HolySheep経由のコスト实绩的比较如下:
| モデル | 公式価格 ($/MTok) | HolySheep ($/MTok) | 月間1000万トークン(公式) | 月間1000万トークン(HolySheep) | 月間节省額 |
|---|---|---|---|---|---|
| GPT-4.1 | $8.00 | $8.00 | $80.00 | $80.00 | 汇率差85%還元 |
| Claude Sonnet 4.5 | $15.00 | $15.00 | $150.00 | $150.00 | 汇率差85%還元 |
| Gemini 2.5 Flash | $2.50 | $2.50 | $25.00 | $25.00 | 汇率差85%還元 |
| DeepSeek V3.2 | $0.42 | $0.42 | $4.20 | $4.20 | 汇率差85%還元 |
注目すべきは、HolySheep本身的のモデル价格は各プロバイダの公式价格と同程度ですが、¥1=$1という汇率+让我想想+让我想想ことで、日本円ベースの支付时的实际负担が85%减となる点です。つまり、公式で$80かかるGPT-4.1の1000万トークンが、日本円では约9,200円で利用可能+nになります( HolySheep汇率適用时)。
向いている人・向いていない人
向いている人
- 複数プロジェクト并发のチーム:AI機能を同時に多个プロジェクトに展开する開発组织
- コスト视認性が必要な管理者:「谁がどれだけ使った」を明確に把握+n必要がある+n困扰の人
- 跨境決済が烦雑な团队:国际サービスへのクレジットカード払い戻し+n困扰の人(WeChat Pay/Alipay対応)
- 低延迟を求める开发者:<50msのレイテンシで实时AI处理が必要な应用
向いていない人
- 個人利用限定:チーム协作機能が不要な个人開発者
- 超大規模企业向け统制:AD/LDAP連携などの enterprise SSO が必要な场合
- 特定の_providerに强烈に拘束:单一プロバイダの生态系统から动かない场合
権限管理の実装:具体的なコード例
ここからは、HolySheep API中转站を活用した团队协作の具体的な实现方法を说明+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n. まず、基本的なAPI呼び出し架构を確認しましょう。
# HolySheep API 基本設定
base_url: https://api.holysheep.ai/v1
import requests
import json
class HolySheepTeamManager:
"""HolySheep API中转站 团队协作管理クラス"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def create_team(self, team_name: str, budget_limit: float = 1000.0):
"""チーム作成+配额設定"""
response = requests.post(
f"{self.base_url}/teams",
headers=self.headers,
json={
"name": team_name,
"monthly_budget_usd": budget_limit,
"currency": "USD"
}
)
return response.json()
def add_member(self, team_id: str, user_email: str, role: str = "developer"):
"""メンバーを追加+権限设定"""
# role: admin / developer / viewer / readonly
response = requests.post(
f"{self.base_url}/teams/{team_id}/members",
headers=self.headers,
json={
"email": user_email,
"role": role,
"rate_limit": {
"requests_per_minute": 60,
"tokens_per_day": 500000
}
}
)
return response.json()
def allocate_quota(self, team_id: str, project_id: str, quota_tokens: int):
"""プロジェクト별로配额分配"""
response = requests.post(
f"{self.base_url}/teams/{team_id}/quota",
headers=self.headers,
json={
"project_id": project_id,
"allocated_tokens": quota_tokens,
"alert_threshold": 0.8 # 80%到達時に通知
}
)
return response.json()
def get_usage_report(self, team_id: str):
"""团队使用量レポート取得"""
response = requests.get(
f"{self.base_url}/teams/{team_id}/usage",
headers=self.headers,
params={"period": "current_month"}
)
return response.json()
使用例
manager = HolySheepTeamManager(api_key="YOUR_HOLYSHEEP_API_KEY")
チーム作成
team = manager.create_team("AI-Product-Team", budget_limit=500.0)
print(f"チーム作成: {team}")
メンバー追加
member = manager.add_member(
team_id=team["id"],
user_email="[email protected]",
role="developer"
)
print(f"メンバー追加: {member}")
配额分配(プロジェクトA: 500万トークン / 月)
quota = manager.allocate_quota(
team_id=team["id"],
project_id="proj_frontend_ai",
quota_tokens=5000000
)
print(f"配额分配: {quota}")
# DeepSeek V3.2 调用示例(HolySheep中转)
プロジェクト別の配额管理 + コスト追跡
import requests
from datetime import datetime
from typing import Dict, List
class ProjectCostTracker:
"""プロジェクト별 コスト追跡 + 配额管理"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.project_quotas: Dict[str, dict] = {}
def call_with_quota_check(
self,
project_id: str,
model: str,
prompt: str,
max_tokens: int = 1000
) -> dict:
"""配额チェック付きのAPI呼び出し"""
# 1. 配额残量確認
quota_info = self.check_quota(project_id)
remaining = quota_info.get("remaining_tokens", 0)
if remaining < max_tokens:
raise Exception(
f"配额枯竭: プロジェクト {project_id} "
f"残り {remaining} トークン "
f"(要量: {max_tokens})"
)
# 2. API呼び出し(DeepSeek V3.2 示例)
response = requests.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": model, # "deepseek-chat" or "deepseek-coder"
"messages": [{"role": "user", "content": prompt}],
"max_tokens": max_tokens,
"project_id": project_id # コスト追跡用
}
)
result = response.json()
# 3. 使用量更新
tokens_used = result.get("usage", {}).get("total_tokens", 0)
self.update_usage(project_id, tokens_used)
return result
def check_quota(self, project_id: str) -> dict:
"""プロジェクト別の配额残量確認"""
response = requests.get(
f"{self.base_url}/quota/{project_id}",
headers={"Authorization": f"Bearer {self.api_key}"}
)
return response.json()
def update_usage(self, project_id: str, tokens: int):
"""使用量更新 + コスト累积"""
# 内部状态更新(实际はAPI同步)
if project_id not in self.project_quotas:
self.project_quotas[project_id] = {"used": 0, "cost_usd": 0.0}
self.project_quotas[project_id]["used"] += tokens
# DeepSeek V3.2: $0.42/MTok
cost = tokens * 0.42 / 1_000_000
self.project_quotas[project_id]["cost_usd"] += cost
def generate_cost_report(self) -> List[dict]:
"""プロジェクト別コストレポート生成"""
return [
{
"project_id": pid,
"tokens_used": data["used"],
"cost_usd": round(data["cost_usd"], 4),
"cost_jpy": round(data["cost_usd"] * 1, 2), # ¥1=$1
"report_date": datetime.now().isoformat()
}
for pid, data in self.project_quotas.items()
]
使用例
tracker = ProjectCostTracker(api_key="YOUR_HOLYSHEEP_API_KEY")
プロジェクト别配额设定
projects = {
"proj_frontend": {"quota": 3_000_000, "model": "deepseek-chat"},
"proj_code_review": {"quota": 2_000_000, "model": "deepseek-coder"},
"proj_docs": {"quota": 5_000_000, "model": "deepseek-chat"}
}
API呼び出し実行
try:
response = tracker.call_with_quota_check(
project_id="proj_frontend",
model="deepseek-chat",
prompt="用户注册流程のバリデーションルールを実装して",
max_tokens=2000
)
print(f"API応答: {response['choices'][0]['message']['content'][:100]}...")
except Exception as e:
print(f"エラー: {e}")
コストレポート出力
report = tracker.generate_cost_report()
for r in report:
print(f"[{r['project_id']}] 使用量: {r['tokens_used']:,} トークン | "
f"コスト: ${r['cost_usd']} (約¥{r['cost_jpy']:,})")
価格とROI
团队协作機能を 활용한場合、投资対効果(ROI)は显著に向上します。以下に具体例を示します:
| 指標 | 個別管理(传统方式) | HolySheep团队协作 | 改善幅度 |
|---|---|---|---|
| 管理コスト(月間) | 約¥50,000相当 | 約¥5,000相当 | 90%削減 |
| APIコスト(月間1000万トークン) | ¥80,000(汇率¥7.3) | ¥9,200(汇率¥1) | 88%削減 |
| проблем インシデント対応 | 月平均3件 | 月平均0.3件 | 90%削減 |
| 配额の見える化 | 手动集計(数日延迟) | リアルタイム | 即時把握 |
特に注目すべきは、HolySheepの汇率メリット(¥1=$1)です。公式汇率¥7.3/$との比较で、同额のドル建てコストが日本円では85%安くなります。これにより、チーム全体でのAI API活用が驚くほど的经济的に。
HolySheepを選ぶ理由
企业規模でAI APIを活用するにおいて、HolySheepが最优解となる5つの理由:
- 汇率优势の圧倒的なコスト效:¥1=$1で公式比85%节约、国际決済の手間もない
- WeChat Pay / Alipay対応:中国企业との协業でも 円決済が容易
- <50ms超低延迟:リアルタイム应用でもストレスフリー
- 团队协作の الكاملةupport:権限管理・配额分配・コスト可視化が統合
- 注册で無料クレジット:实际のプロジェクトで検証可能
私は以前、3つのプロジェクトで 别々にAPIキーを管理+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n